汇编语言分支结构程序设计
从基础知识到现在,应该掌握一些基本的汇编语言,下面是两道例题简单介绍、梳理一下汇编分支结构程序代码:
1、内存自BUF单元开始的缓冲区连续存放着10个学生的英文分数,编程序统计其中90~100,60~89,60以下者各有多少人?并把90-100分人数结果存放在P1单元中、60-89分人数结果存放在P2单元中,60分以下人数结果存放在P3单元中(P1、P2、P3为数据段的单元),最后把P1、P2、P3中的数以”P1=?、P2=?、P3=?”显示在屏幕上。(注:数据以10进制显示)
程序代码:
DATA SEGMENT
BUF DB 70H,58H,50H,91H,99H,62H,75H,82H,74H,60H ;定义BUF单元地址开始的缓冲区的数据
ORG 0020H ;程序执行时,将P1送到0200H内存单元
P1 DB 0
ORG 0030H ;程序执行时,将P2送到0300H内存单元
P2 DB 0
ORG 0040H
P3 DB 0 ;程序执行时,将P3送到0400H内存单元
ORG 0050H ;程序执行时,将DP1送到0500H内存单元
DP1 DB 'P1= $'
ORG 0060H ;程序执行时,将DP2送到0600H内存单元
DP2 DB 'P2= $'
ORG 0070H ;程序执行时,将DP3送到0700H内存单元
DP3 DB 'P3= $'
ORG 0080H ;程序执行时,将COUNT送到0800H内存单元
COUNT DW 10 ;'$'为地址运算符,返回当前程序语句的地址偏移值
DATA ENDS ;定义数据段
CSEG SEGMENT
ASSUME CS:CSEG,DS:DATA
PUSH DS ;将DS压入堆栈
SUB AX,AX;将AX内存器内容清空
PUSH AX
START:
MOV AX,DATA
MOV DS,AX ;将数据传给数据段DS
MOV CX,COUNT ;设置计数器CX,最多为10
MOV SI,0 ;给SI赋值为0
LP1:
MOV AL,BUF[SI] ;将BUF内存单元的第si个内容赋值给AL
CMP AL,90H ;判断该学生的分数是否>=90
JNB LP2 ;若不低于90则跳转到LP2
CMP AL,60H ;判断该学生的分数是否>=60
JC LP3 ;若产生进位则跳转到LP3
INC P2 ;将分数在60-89的学生的分数个数存放到P2中
JMP LP5 ;跳转到LP5,即循环遍历数组BUF
LP3:
INC P3 ;将P3中的个数+1
JMP LP5 ;跳转到LP5
LP2:
INC P1 ;给P1中的个数+1
LP5:
INC SI ;将SI进行+1操作,即下一个成绩分数
LOOP LP1 ;循环LP1
LEA DX,DP1
MOV AH,09H
INT 21H
MOV DL,P1
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P1数据转10进制输出
LEA
DX,DP2
MOV AH,09H
INT 21H
MOV DL,P2
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H ;将P2数据转10进制输出
LEA DX,DP3
MOV AH,09H
INT 21H
MOV DL,P3
ADD DL,30H ;转对应的ASCII值
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H ;将P3数据转10进制输出
CSEG ENDS
END START
运行结果:
BUF开始的内存单元的10个数中有2个>=90,6个在60-89,2个在60以下
验证正确
2.已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
程序代码:
DATAS SEGMENT
DATAX DB 9H
DATAY DB 2H
RLT DB 1 DUP(?)
;此处输入数据段代码
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX ;将DATAS中的数据存入DS
MOV BL,DATAX ;将DATAX送入BL
MOV BH,DATAY ;将DATAY送入BH
MOV AH,01H
int 21H ;DOS功能调用,等待键盘输入一个值
CMP AL,'+'
JE addition ;若输入符号为'+',则跳转到addition
CMP AL,'-'
JE subtraction;若输入符号为'-',则跳转到subtraction
CMP AL,'*'
JE multiplication;若输入符号为'*',则跳转到multiplication
CMP AL,'/'
JE division ;若输入符号为'/',则跳转到division
addition:
ADD BL,BH ;将BL,BH内容相加
JMP print ;跳转到输出过程
subtraction:
SUB BL,BH ;将BL,BH内容相减
JMP print
multiplication:
MOV AL,BH
MUL BL ;将BL,BH内容相乘
MOV BL,AL
JMP print
division:
MOV AL,BL
SUB AH,AH
DIV BH ;将BL,BH内容相除
MOV BL,AL
JMP print
print:
MOV AL,BL
MOV CL,4
SHR AL,CL ;将AL数据逻辑右移4位
ADD AL,30H ;将AL数据转为对应ASCII值
CMP AL,39H ;比较AL中数据与39H的大小
JBE look1 ;当AL<=39H时,跳转到look1
ADD AL,07H ;>=39H,则只加07H
look1:
MOV DL,AL
MOV RLT,AL
MOV AH,02H
INT 21H
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,39H
JBE look2
ADD AL,07H
look2:
MOV DL,AL
MOV RLT,AL
MOV AH,02H ;dos功能调用,输出DL
INT 21H
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
加:
减:
乘:
除:
人工验算结果为正确的。