1 / 12
文档名称:

实验二算术运算实验.pdf

格式:pdf   大小:483KB   页数:12页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验二算术运算实验.pdf

上传人:业精于勤 2023/3/2 文件大小:483 KB

下载得到文件列表

实验二算术运算实验.pdf

文档介绍

文档介绍:该【实验二算术运算实验 】是由【业精于勤】上传分享,文档一共【12】页,该文档可以免费在线阅读,需要了解更多关于【实验二算术运算实验 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
文档
实验二算术运算实验
一、实验目的
1、掌握MASMforWindows环境下的汇编语言编程环境使用;
2、掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、BCD
码的表示形式;
3、掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志
位的影响及测试方法;
4、掌握无符号数和有符号数运算区别及编程方法;
5、掌握BCD码调整指令的使用方法
二、软硬件实验环境
1、硬件环境:惠普64位一体化计算机及局域网;
2、软件环境:windows8,红蜘蛛管理系统,MASMforWindows。
三、实验基本原理
算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。
1)标志位
在debug调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表1所
示。
表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所示容。
表2数据类型的数据运算表
四、实验步骤与容
1)对于表格中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算
结果对标志寄存器中状态标志位的影响:
①实验分析
本实验要求简单,仅对指定三组数进行基本运算。只需使用ADD、SUB、
MUL、DIV四个运算命令,并以MOV命令作为数值转移的手段即可。运算结果
和状态标志的情况可以通过debug调试中的T命令进行逐步查看。
需要注意的主要有以下几点:
,会出现对高位的进位扩展。因此,在记录结
:.
文档
果的时候不能仅仅记录低2位(十六进制)的结果,应记录包含高位的
完整结果;
,语句的写法与ADD和SUB有区别;
,也可得到余数,余数存在DL中;
,输入三个T命令后的结果才是此次
运算的结果。
②流程图
③程序样例
1、
DATASSEGMENT
;此处输入数据段代码
BUF1DB0ABH,64H,0A2H
BUF2DB78H,5AH,3FH
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,2
:.
文档
Q1:
MOVAH,0H
MOVAL,BUF1[SI]
MOVBL,AL
MOVAL,BUF2[SI]
ADDAX,BX;进行运算
MOVBUF3[SI],AL
ADDSI,1H
DECCX
JNZQ1;跳转再做一次第二组数的加法运算
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
2、
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,2
Q1:
MOVAH,0H
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
SUBAX,BX
MOVBUF3[SI],AL
ADDSI,1H;dotheoperation
DECCX
JNZQ1;doitagainwiththesecondgroupofnumbers
MOVAX,4CH
INT21H
CODESENDS
:.
文档
ENDSTART
3、DATASSEGMENT
;此处输入数据段代码
BUF1DB0ABH,64H,0A2H
BUF2DB78H,5AH,3FH
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,2
MOVCX,1
Q1:
MOVAH,0H
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
DIVBX
MOVBUF3[SI],AL
ADDSI,1H;dotheoperation
DECCX
JNZQ1;doitagainwiththesecondgroupofnumbers
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
④实验结果
0ABH+78H
64H+5AH
:.
文档
0ABH-78H
64H-5AH
0A2H*3FH
0A2H/3FH
计算状态标志
算式结果AFCFZFOFSFPF
0ABH+78H123H100000
0ABH-78H33H000001
64H+5AH0BEH000001
64H-5AH0AH100001
0A2H*3FH27DEH100001
0A2H/3FH2H余24H100001
2)在数据段定义了两个多精度的有符号16进制数,BUF1和BUF2。求两数的和
与差,并将计算值存放在BUF2为首地址的缓冲区中;同时将两组数据当作十进
制数据来处理,再次求两数的和与差,并将结果存放在BUF2为首地址的缓冲区
:.
文档
中。试编程实现上述运算。
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
①实验分析
本实验的思想是把这个两个多精度数进行按精度(每两位)进行运算,考虑进位与借位,
每种运算都可以使用循环和带进位加法,或循环和带进位减法进行实现。对于十进制数运算
的要求,再辅以DAA和DAS两种十进制调整命令,将结果变为BCD码即可。
本实验中需要注意的有以下几点:
。为在运算时保护BUF2的数据,
需定义另一个存储空间来存储和BUF2一样的数据;
,即使用CLC命令,避免上
一运算的进位影响下一位运算的结果;
,因此十进制加减结果必
须存入AL里,且转换为压缩BCD码的结果要靠读取AL来获得。
②程序流程图
③程序样例
:.
文档
1、DATASSEGMENT
;此处输入数据段代码
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
MOVAH,00H
Q1:
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
ADCAL,BL
MOVBUF2[SI],AL
INCSI
DECCX
JNZQ1
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
2、DATASSEGMENT
;此处输入数据段代码
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
:.
文档
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
MOVAH,00H
Q1:
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
SBBAL,BL
MOVBUF2[SI],AL
INCSI
DECCX
JNZQ1
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
3、DATASSEGMENT
;此处输入数据段代码
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
:.
文档
MOVAH,00H
Q1:
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
ADCAL,BL
DAA
MOVBUF2[SI],AL
INCSI
DECCX
JNZQ1
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
4、DATASSEGMENT
;此处输入数据段代码
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB10DUP(?)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
MOVAH,00H
Q1:
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
SBBAL,BL
DAA
:.
文档
MOVBUF2[SI],AL
INCSI
DECCX
JNZQ1
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
④实验结果
十六进制结果十进制结果
BUF1+BUF2C5DE5CA9+25456309+
BUF1-BUF25F522E1F+65523425+
3)编程计算280*584/190,运算结果用十六进制表示。要求上式计算结果的商存
入AX,余数存入DX寄存器。
①实验分析
本实验要求很简单,可用基本运算直接完成。值得注意的就是最后进行除法
运算时,DIV命令的执行结果自动将商存在AX中,余数存于DX中,可直接满
足实验要求,故无需多余操作。
②程序流程图
实验流程即为从算式最左至最右逐步运算的基本运算律,故流程图略。
③程序样例
DATASSEGMENT
DATASENDS
:.
文档
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAX,280
MOVBX,584
MULBX
MOVBX,190
DIVBX
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
④实验结果
商为AX中的035CH余数为DX中的0078H
五、实验感想与收获
本次实验的难度比上一次有了很大的提高,也带给我们更多的收获。
第一个实验中我就已经在尝试使用循环的结构来进行加减法,这给我第二个实验的进行提
供了极大的便利。但是在进行第二个实验的时候,由于一开始在每个循环节中对SI+1的操
作没有使用INC指令,而是使用了ADDSI,1这样的指令,影响了进位符,并最终导致了
结果的输出错误。经过了数次调试后终于发现了这个问题,并解决。在这个过程中,我对
ADD,ADC,SUB,SBB等指令的作用和原理有了很深入的理解,并且能够灵活的运用这几个
指令。可以说非常的有收获。