1、
汇编语言上机实验
实验三 分支和循环
一、实验目的
熟悉掌握利用比较转移指令实现分支,理解条件转移和无条件转移指令的区别,学习循环程序的设计方法,会编制循环和分支的一般程序。
二、实验要点
在汇编语言中,分支指令分为条件分支和无条件分支两大类。凡条件分支指令均属相对转移,其相对偏移值在-128至127之间。无条件分支指令又分相对转移和绝对转移。凡在段内转移均为相对转移,相对转移又分为SHORT和NEAR两种。前者同条件相对转移,NEAR类型转移范围在-8000H至7FFFH之间。段间转移通常为绝对转移,绝对转移又分为直接转移和间接转移,
2、因为应根据不同情况来选用这些指令。
在条件转移指令中,分为适用于有符号数比较的条件转移和无符号数比较的条件转移,因此在进行有符号数比较大小时,要使用JG、JGE、JL、JLE等指令来实现条件分支;同样对无符号数比较要使用JA、JAE、JB、JBE等指令来实现分支转移。
对于循环程序设计,在循环体外要设置循环计数器,通常用CX来做计数器,此外要设置地址指针,使之指向所要使用的操作数的初始地址。循环体根据制定的要求来编制,循环体的转移标号位置要设置正确,循环的判断条件要明确。结束循环一般是循环次数减至为零,或满足特定条件提前退出循环。
三、实验任务及步骤
1.设数据缓冲区内容有如下一组数据
3、12H、98H、45H、64H、78H、33H、0ABH、0CFH、17H、88H,试编程:按有符号数对正、负数分别求和。并统计正、负数的个数。
程序代码:
DATAS SEGMENT
BUF1 DB 12H,98H,45H,64H,78H,33H,0ABH,0CFH,17H,88H
PSUM DW 0H
NSUM DW 0H
PCOUNT DB 0H
NCOUNT DB 0H
DATAS ENDS
STACKS SEGMENT
DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
A
4、SSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,OFFSET BUF1
MOV CX,0AH
MOV DL,80H
NEXT: MOV BL,[SI]
CMP BL,DL
JNO L1
MOV AL,BL
CBW
ADD PSUM,AX
INC PCOUNT
INC SI
DEC CX
JNZ NEXT
L1: MOV AL,BL
CBW
AD
5、D NSUM,AX
INC NCOUNT
INC SI
DEC CX
JNZ NEXT
MOV CX,0AH
SUB SI,SI
SUB BX,BX
SUB DX,DX
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
结果:
和
个数
正数
017DH
6
负数
009AH
4
2.数据同上,试编程按无符号数,求出这组数中的最大值
程
6、序代码:
DATAS SEGMENT
BUF DB 12H,98H,45H,64H,78H,33H,0ABH,0CFH,17H,88H
MAX DB 0H
DATAS ENDS
STACKS SEGMENT
DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,0
MOV CX,0AH
MOV MAX,0
AGAIN:
M
7、OV AL,BUF[SI]
CMP AL,MAX
JBE NEXT
MOV MAX,AL
JMP NEXT
NEXT:
INC SI
LOOPNE AGAIN
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
无符号最大值:0CFH
3. 数据同上,试编程按有符号数,求出这组数中的最小值
程序代码: 流程图:
DATAS SEGMENT
B
8、UF DB 12H,98H,45H,64H,78H,33H,0ABH,0CFH,17H,88H
MIN DB 0H
DATAS ENDS
STACKS SEGMENT
DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,0
MOV CX,0AH
MOV MIN,0
AGAIN:
MOV AL,BUF[SI]
CMP MIN,AL
JL NEXT
MOV MIN,AL
JMP NEXT
NEXT:
INC SI
LOOPNE AGAIN
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果:
RESULT=08D3H余0050H
四、实验总结:
通过本次实验,我熟悉了利用汇编语言对多精度十六进制和十进制的编程方法,弄清带符号数及不带符号数的运算区别,理解了各状态标志位的含义,以及运算结果对各状态标志的影响,同时进一步熟悉了编程环境,获益颇多。