资源描述
汇编语言上机实验
实验三 分支和循环
一、实验目的
熟悉掌握利用比较转移指令实现分支,理解条件转移和无条件转移指令的区别,学习循环程序的设计方法,会编制循环和分支的一般程序。
二、实验要点
在汇编语言中,分支指令分为条件分支和无条件分支两大类。凡条件分支指令均属相对转移,其相对偏移值在-128至127之间。无条件分支指令又分相对转移和绝对转移。凡在段内转移均为相对转移,相对转移又分为SHORT和NEAR两种。前者同条件相对转移,NEAR类型转移范围在-8000H至7FFFH之间。段间转移通常为绝对转移,绝对转移又分为直接转移和间接转移,因为应根据不同情况来选用这些指令。
在条件转移指令中,分为适用于有符号数比较的条件转移和无符号数比较的条件转移,因此在进行有符号数比较大小时,要使用JG、JGE、JL、JLE等指令来实现条件分支;同样对无符号数比较要使用JA、JAE、JB、JBE等指令来实现分支转移。
对于循环程序设计,在循环体外要设置循环计数器,通常用CX来做计数器,此外要设置地址指针,使之指向所要使用的操作数的初始地址。循环体根据制定的要求来编制,循环体的转移标号位置要设置正确,循环的判断条件要明确。结束循环一般是循环次数减至为零,或满足特定条件提前退出循环。
三、实验任务及步骤
1.设数据缓冲区内容有如下一组数据: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
ASSUME 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
ADD 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.数据同上,试编程按无符号数,求出这组数中的最大值
程序代码:
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:
MOV 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
BUF 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
四、实验总结:
通过本次实验,我熟悉了利用汇编语言对多精度十六进制和十进制的编程方法,弄清带符号数及不带符号数的运算区别,理解了各状态标志位的含义,以及运算结果对各状态标志的影响,同时进一步熟悉了编程环境,获益颇多。
展开阅读全文