实验二 算术运算类操作实验 (基础与设计)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二算术运算类操作实验 (基础与设计)
一、实验要求和目的
1、了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;
2、掌握各类运算类指令对各状态标志位的影响及测试方法;
3、熟悉汇编语言二进制多字节加减法基本指令的使用方法;
4、熟悉无符号数和有符号数乘法和除法指令的使用;
5、掌握符号位扩展指令的使用。
6、掌握BCD 码调整指令的使用方法
二、软硬件环境
1、硬件环境:计算机系统 windows;
2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识
本实验主要进行算术运算程序设计和调试,涉及到的知识点包括:
1.加减法处理指令
主要有加法指令ADD,带进位加法ADC,减法指令SUB,带进位减法指令SBB。
2.乘除法指令和符号位扩展指令
主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令IDIV,以及符号位从字节扩展到字的指令CBW 和从字扩展到双字的指令CWD。
3.BCD 码的调整指令
主要有非压缩的BCD 码加法调整指令DAA,压缩的BCD 码减法调整指令DAS,非压缩的BCD 码加法调整指令AAA,非压缩的BCD 码减法调整指令AAS,乘法的非压缩BCD码调整指令AAM,除法的非压缩BCD 码调整指令AAD。
8088/8086 指令系统提供了实现加、减、乘、除运算的上述基本指令,可对下表所示的数据类型进行数据运算。
四、实验内容与步骤
1、对于两组无符号数,087H 和034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响。
设计流程:
源代码:
DATAS SEGMENT
ARRAY DW 087H,034H,0C2H,05FH
JIA DW 2 DUP(?) ;储存两组加法结果
JIAN DW 2 DUP(?) ;储存两组减法结果
CHENG DW 2 DUP(?) ;储存两组乘法结果CHU DW 2 DUP(?) ;储存两组除法结果DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,0
MOV BX,0
SUB BX,2
SUB SI,4
L1:
ADD SI,4
ADD BX,2
MOV AX,ARRAY[SI] ;第一个运算数ADD AX,ARRAY[SI+2] ;加法运算
MOV JIA[BX],AX ;储存加法结果
MOV AX,ARRAY[SI]
SUB AX,ARRAY[SI+2] ;减法运算
MOV JIAN[BX],AX ;储存减法结果
MOV AX,ARRAY[SI]
MUL ARRAY[SI+2] ;乘法运算
MOV CHENG[BX],AX ;储存乘法结果MOV AX,ARRAY[SI]
MOV CX,ARRAY[SI+2]
DIV CL ;除法运算
MOV CHU[BX],AX ;储存除法结果CMP BX,2
JNZ L1
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序结果:
通过-t逐步运行程序,逐步查看每次运算后标志位的状态,结果如下:
2、在数据段定义了两个多精度的有符号16 进制数,FIRST 和SECOND ,1)求两数的和与差,并将结果存放在THIRD 为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH 为首地址的缓冲区中。
试编程实现上述运算。
FIRST DW 45 H,82H,96 H,57H
SECOND DW 12 H,46H,83 H,45H
思路流程:
以十六进制加法为例
源代码:
DATAS SEGMENT
FIRST DB 45H,82H,96H,57H
SECOND DB 12H,46H,83H,45H
THIRD DB 10 DUP(?)
FORTH DB 10 DUP(?)
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS
MOV DS,AX
;十六加法
MOV SI,3 ;运算数据的偏移量
MOV BX,3 ;储存数据结果的偏移量MOV CX,4 ;循环标志量
INC BX
INC SI
CLC ;标志位CF清零
L1:
DEC SI
DEC BX
MOV AL,FIRST[SI]
ADC AL,SECOND[SI]
MOV THIRD[BX],AL
LOOP L1
;十六减法
MOV SI,3
MOV BX,8
MOV CX,4
INC BX
INC SI
CLC
L2:
DEC SI
DEC BX
MOV AL,FIRST[SI]
SBB AL,SECOND[SI]
MOV THIRD[BX],AL
LOOP L2
;十加法
MOV SI,3
MOV BX,3
MOV CX,4
INC BX
INC SI
CLC
L3:
DEC SI
DEC BX
MOV AL,FIRST[SI]
ADC AL,SECOND[SI]
DAA ;转换为十进制加法MOV FORTH[BX],AL
LOOP L3
;十减法
MOV SI,3
MOV BX,8
MOV CX,4
INC BX
INC SI
CLC
L4:
DEC SI
DEC BX
MOV AL,FIRST[SI]
SBB AL,SECOND[SI]
DAS ;转换为十进制减法
MOV FORTH[BX],AL
LOOP L4
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序结果:
0770:0000到0770:0003是FIRST数,0770:0004到0770:0007是SECOND数,0770:0008到0770:000B是十六进制加法结果,0770:000D到0770:0010是十六进制减法结果,0770:0012
3、编程计算((Z +X*Y -328) -V)/ Y,其中X、Y、Z、V 均为16 位带符号数,假设初始数
据分别装入X、Y、Z、V 单元,要求上式计算结果的商存入AX,余数存入DX 寄存器。
同学自行给出初始值加以验证程序。
源代码:
DATAS SEGMENT
X DW 200 ;设X=200
Y DW 2 ;设Y=2
Z DW 30 ;设Z=30
V DW 4 ;设V=4
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,X
MUL Y
ADC AX,Z
SBB AX,328
SBB AX,V
DIV Y ;运算结果在AX中
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序结果:
结果在AX=31H,商为DX=0
五、心得体会
本次实验主要学习了汇编中四则运算的方法,并在程序中加以循环实现多组数依次完成运算。
这次实验学习到的最主要的知识就是DW和DB两种数据在进行运算时候的不同以及对进位的处理。
在第二个题目中需要涉及到加减乘除四种运算,为了更好的处理进位就把原数据由DW改为了DB,这是因为如果用DW进位时会将该数的进位加在其4位十六进制数的高两位,而不能加在高位的DW中,不方便阅读最终结果。
实验中另一个很大的收获就是有了更深的对标志位的认识。
通过第一个题目认识了不同运算对标志位的影响。
在做第二个题目时,由于在循环过程中用了CMP改变了标志位导致有些结果总是没有加上下面的进位,我改进了判断循环的方法避免了改动标志位。
这个经历对我日后的汇编编程是很宝贵的经验。