北京理工大学汇编实验报告.doc
《北京理工大学汇编实验报告.doc》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验报告.doc(20页珍藏版)》请在冰点文库上搜索。
.
本科实验报告
实验名称:
实验二算术运算实验
课程名称:
课程设计Ⅰ(CPU与汇编)(实验)
实验时间:
第5-10周周五下午
任课教师:
聂青
实验地点:
10-102
实验教师:
苏京霞
实验类型:
☑原理验证
□综合设计
□自主创新
学生姓名:
罗逸雨
学号/班级:
112014120805211401
组号:
3
学院:
信息与电子学院
同组搭档:
专业:
通信工程
成绩:
一、实验目的
1)掌握MASMforWindows环境下的汇编语言编程环境使用;
2)掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、BCD码的表示形式;
3)掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志位的影响及测试方法;
4)掌握无符号数和有符号数运算区别及编程方法;
二、实验环境与原理
1.实验软硬件环境
1)硬件环境:
惠普64位一体化计算机及局域网;
2)软件环境:
Windows8,红蜘蛛管理系统,MASMforWindows。
2.实验原理
算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。
1)标志位
在debug调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表1所示。
2)加减法指令
ADD表示加法指令,ADC表示带进位加法指令,SUB表示减法指令,SBB表示带进位减法指令。
3)乘除法指令
MUL表示无符号数乘法指令,IMUL表示带符号数乘法指令,DIV表示无符号数除法指令,IDIV表示带符号数除法指令。
4)符号位扩展指令
CBW表示从字节扩展到字的指令,CWD表示从字扩展到双字的指令。
5)BCD码的调整指令
在进行十进制加减运算时,需要将数据用BCD码表示,还要考虑到是组合BCD码还是非组合BCD码,组合BCD码是用一个字节表示两位十进制数,非组合BCD码是用一个字节表示一位十进制数,对于组合的BCD码加减法运算其结果存放在AL中。
组合的BCD码加法调整指令DAA;
组合的BCD码减法调整指令DAS;
非组合的BCD码加法调整指令AAA;
非组合的BCD码减法调整指令AAS;
乘法的非组合BCD码调整指令AAM;
除法的非组合BCD码调整指令AAD。
8088/8086指令系统提供了实现加、减、乘、除运算指令,可参照表2所示内容。
三、实验步骤
1)试编程以下各组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响:
总结各运算对状态标志位的影响,及其意义。
2)在数据段定义了两个多精度的有符号16进制数,BUF1和BUF2。
求两数的和与差,并将计算值存放在BUF3为首地址的缓冲区中;同时将两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在BUF3为首地址的缓冲区中。
试编程实现上述运算。
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
3)编程计算280*584/190,运算结果用十六进制表示。
要求上式计算结果的商存入AX,余数存入DX寄存器。
四、程序清单与框图
(1)
程序:
CODESSEGMENT
ASSUMECS:
CODES
START:
MOVAX,0ABH
MOVBX,78H
ADDAX,BX;0ABH+078H
MOVAX,0ABH
MOVBX,78H
SUBAX,BX;0ABH-078H
MOVAX,64H
ADDAX,5AH;64H+5AH
MOVAX,64H
SUBAX,5AH;64H-5AH
MOVAL,0A2H
MOVBL,3FH
MULBL;0A2H*3FH
MOVAX,0A2H
MOVBL,3FH
DIVBL;0A2H/3FH
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(2)
程序:
1.十六进制求和
DATASSEGMENT
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB6DUP(?
);最高位符号位扩展后占一个字,共6个字节
ADW0H
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,BUF1
LEADI,BUF2
LEABX,BUF3
CLC;进位清空
MOVCX,4
L:
MOVAL,[SI]
ADCAL,[DI]
MOV[BX],AL
INCSI
INCDI
INCBX;BX自增,指向下一个字节单元
DECCX
JNZL
MOVAL,byteptr[SI]
CBW;符号扩展
MOVDX,AX
MOVAL,byteptr[DI]
CBW;符号扩展
ADCAX,DX
MOVwordptr[BX],AX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
开始
框图:
初始化BUF1,BUF2,BUF3单元
将BUF1,BUF2,BUF3偏移地址放入SI、DI、BX中
循环次数CX设为4
将[SI]和[DI]低位字节单元中的内容求和并保存到[BX]对应字节单元中
SI加一
DI加一
BX加一CX减一
N
CX=0?
Y
[SI]和[DI]中最高位字节扩展后求和并保存到[BX]字单元中
结束
程序功能:
通过循环分别求得BUF1、BUF2中低四位字节的和,并存在BUF3对应字节单元中。
值得注意的是有符号数相加时需要对最高位字节先进行符号扩展,所以BUF1、BUF2的高位字节的和需要放在循环外单独计算,最后将高位单元的字型的和存储在BUF3中。
十六进制减法程序同理。
组合BCD码加减法在最后需要进行DAA/DAS调整。
2.十六进制作差
DATASSEGMENT
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB6DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,BUF1
LEADI,BUF2
LEABX,BUF3
CLC
MOVCX,4
L:
MOVAL,[SI]
SBBAL,[DI]
MOV[BX],AL
INCSI
INCDI
INCBX
DECCX
JNZL
MOVAL,byteptr[SI]
CBW;符号扩展
MOVDX,AX
MOVAL,byteptr[DI]
CBW;符号扩展
SBBDX,AX
MOVwordptr[BX],DX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
3.十进制求和
DATASSEGMENT
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB6DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,BUF1
LEADI,BUF2
LEABX,BUF3
CLC
MOVCX,5
L:
MOVAL,[SI]
ADCAL,[DI]
DAA
MOV[BX],AL
INCDI
INCSI
INCBX
DECCX
JNZL
MOVAL,0
ADCAL,0;存最高位进位
DAA
MOVbyteptr[BX],AL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
4.十进制作差
DATASSEGMENT
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB6DUP(?
)
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,BUF1
LEADI,BUF2
LEABX,BUF3
CLC
MOVCX,5
L:
MOVAL,[SI]
SBBAL,[DI]
DAS
MOV[BX],AL
INCDI
INCSI
INCBX
DECCX
JNZL
MOVAL,0
SBBAL,0
DAS
MOVbyteptr[BX],AL
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)
程序:
CODESSEGMENT
ASSUMECS:
CODES
MOVAX,280
MOVBX,584
MULBX
MOVBX,190
DIVBX
MOVAH,4CH
INT21H
CODESENDS
END
五、实验结果与分析
(1)
计算
状态标志
算式
结果
AF
CF
ZF
OF
SF
PF
0ABH+78H
123H
AC
NC
NZ
NV
PL
PO
0ABH-78H
33H
NA
NC
NZ
NV
PL
PE
64H+5AH
BEH
NA
NC
NZ
NV
PL
PE
64H-5AH
0AH
AC
NC
NZ
NV
PL
PE
0A2H*3FH
27DE
AC
CY
NZ
OV
PL
PE
0A2H/3FH
商02余数42
AC
CY
NZ
OV
PL
PE
无符号数运算标志位意义总结:
状态标志位
加法
减法
乘法
除法
0
1
0
1
0
1
0
1
CF
最高位无进位
最高位有进位
最高位无借位
最高位有借位
CF=OF=0
乘积的高一半为0(字节操作的(AH)或字操作的(DX))
CF=OF=1
乘积的高一半不为0
无
定
义
AF
低四位向高四位无进位
低四位向高四位进位
低四位向高四位无进位
低四位向高四位进位
无影响
无影响
ZF
结果不为0
结果为0
结果不为0
结果为0
无影响
无影响
OF
无溢出
两个同符号数相加,结果符号与其相反,发生溢出。
无溢出
两数符号相反,而结果符号与减数相同,发生溢出。
CF=OF=0
乘积的高一半为0(字节操作的(AH)或字操作的(DX))
CF=OF=1
乘积的高一半不为0
SF
最高位为0
最高位为1
最高位为0
最高位为1
无影响
无影响
PF
1的个数为奇数个
1的个数为偶数个
1的个数为奇数个
1的个数为偶数个
无影响
无影响
DEBUG运行结果截图:
0ABH+078H=0123H
0ABH-78H=0033H
64H+5AH=BEH
64H-5AH=0AH
02AH*3FH=27DE
0A2H/3FH=商02余数42
(2)
BUF1、BUF2均为有符号数
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
16进制结果
10进制结果
BUF1+BUF2
C5DE5CA9CA00
254563093101
BUF1-BUF2
5F522E1F2600
595228192600
经过计算验证,运行结果均正确。
DEBUG运行结果截图:
1.十六进制数求和
2.十六进制数作差
3.十进制求和
4.十进制作差
(3)280*584/190商:
035CH余数:
0078H
DEBUG运行结果截图:
AX=035C,DX=0078
经验算后证明结果正确。
六、实验感想
经过本次实验,我对汇编语言中的二进制、十六进制、十进制、BCD码的表示形式有了一定了解,对有关BCD码调整指令方面的知识有了更深刻的认识,熟悉了二进制多字节加减法基本指令的使用方法以及无符号数和有符号数乘法和除法指令的使用,通过分析和思考,掌握了各类运算类指令对各状态标志位的影响和测试方法,以及无符号数和有符号数运算区别及编程方法。
在编第二小题的程序时,开始时我忽略了给出的有符号数这个条件,使用了无符号数的方法进行编程,后来老师指出了这个问题。
经过更正这个错误,尝试了无符号数和有符号数的不同的编程方式,我对无符号数和有符号数运算的区别及编程方法有了更加深刻的认识。
在课堂上学的知识只给我留下了较浅的印象,只有通过自己动手编程才能有效巩固所学的知识。
Word资料