北京理工大学汇编实验报告2.docx
《北京理工大学汇编实验报告2.docx》由会员分享,可在线阅读,更多相关《北京理工大学汇编实验报告2.docx(16页珍藏版)》请在冰豆网上搜索。
北京理工大学汇编实验报告2
本科实验报告实验名称:
实验二算术运算实验
课程名称:
课程设计Ⅰ(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表示从字扩展到双字的指令。
5BCD码的调整指令
在进行十进制加减运算时,需要将数据用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
框图:
Y
程序功能:
通过循环分别求得BUF1、BUF2中低四位字节的和,并存在BUF3对应字节单元中。
值得注意的是有符号数相加时需要对最高位字节先进行符号扩展,所以BUF1、BUF2的高位字节的和需要放在循环外单独计算,最后将高位单元的字型的和存储在BUF3中。
十六进制减法程序同理。
组合BCD码加减法在最后需要进行DAA/DAS调整。
开始CX=0?
结束
初始化
BUF1,BUF2,BUF3单元
循环次数CX设为4SI加一DI加一BX加一CX减一将BUF1,BUF2,BUF3
偏移地址放入SI、DI、
BX中
将[SI]和[DI]低位字节单元中的内容求和并保存到[BX]对应字节单元N
[SI]和[DI]中最高位字节扩展后求和并保存到[BX]字单元中
2.十六进制作差
DATASSEGMENT
BUF1DB92H,98H,45H,64H,78HBUF2DB33H,46H,17H,45H,52HBUF3DB6DUP(?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATASSTART:
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,78HBUF2DB33H,46H,17H,45H,52HBUF3DB6DUP(?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATASSTART:
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,78HBUF2DB33H,46H,17H,45H,52HBUF3DB6DUP(?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATASSTART:
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
计算状态标志
算式结果AFCFZFOFSFPF0ABH+78H123HACNCNZNVPLPO0ABH-78H33HNANCNZNVPLPE64H+5AHBEHNANCNZNVPLPE64H-5AH0AHACNCNZNVPLPE0A2H*3FH27DEACCYNZOVPLPE
ACCYNZOVPLPE0A2H/3FH商02
余数42
无符号数运算标志位意义总结:
状态
标志
位
加法
减法乘法除法
01010101
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
无影响无影响
PF1的个数
为奇数
个1的个数
为偶数
个
1的个数
为奇数
个
1的个数
为偶数
个
无影响无影响
DEBUG运行结果截图:
0ABH+078H=0123H
0ABH-78H=0033H64H+5AH=BEH64H-5AH=0AH02AH*3FH=27DE0A2H/3FH=商02余数42(2BUF1、BUF2均为有符号数BUF1DB92H,98H,45H,64H,78HBUF2DB33H,46H,17H,45H,52H16进制结果BUF1+BUF2C5DE5CA9CA00BUF1-BUF25F522E1F2600经过计算验证,运行结果均正确。
10进制结果254563093101595228192600DEBUG运行结果截图:
1.十六进制数求和2.十六进制数作差
3.十进制求和4.十进制作差(3280*584/190商:
035CH余数:
0078HDEBUG运行结果截图:
AX=035C,DX=0078经验算后证明结果正确。
六、实验感想经过本次实验,我对汇编语言中的二进制、十六进制、十进制、BCD码的表示形式有了一定了解,对有关BCD码调整指令方面的知识有了更深刻的认识,熟悉了二进制多字节加减法基本指令的使用方法以及无符号数和有符号数乘法和除法指令的使用,通过分析和思考,掌握了各类运算类指令对各状态标志位的影响和测试方法,以及无符号数和有符号数运算区别及编程方法。
在编第二小题的程序时,开始时我忽略了给出的有符号数这个条件,使用了无符号数的方法进行编程,后来老师指出了这个问题。
经过更正这个错误,尝试了无符号数和有符号数的不同的编程方式,我对无符号数和有符号数运算的区别及编程方法有了更加深刻的认识。
在课堂上学的知识只给我留下了较浅的印象,只有通过自己动手编程才能有效巩固所学的知识。