实验二-算术运算实验.doc

上传人:scccc 文档编号:12573831 上传时间:2021-12-04 格式:DOC 页数:17 大小:141KB
返回 下载 相关 举报
实验二-算术运算实验.doc_第1页
第1页 / 共17页
实验二-算术运算实验.doc_第2页
第2页 / 共17页
实验二-算术运算实验.doc_第3页
第3页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验二-算术运算实验.doc》由会员分享,可在线阅读,更多相关《实验二-算术运算实验.doc(17页珍藏版)》请在三一文库上搜索。

1、实验二 算术运算实验一、实 验目的1、 掌 握 MASM for Windows 环境下的汇编语言编程环境使用;2 、 掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、 BCD码的表示形式;3 、 掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志 位的影响及测试方法;4、 掌握无符号数和有符号数运算区别及编程方法 ;5、 掌 握 BCD 码调整指令的使用方法二、软 硬件实验环境1、硬件环境:惠普 64 位一体化计算机及局域网;2、软件环境: windows 8 ,红蜘蛛管理系统, MASM for Windows 。三、实验基本原理 算术运算实验需要

2、对运行结果进行调试及查看状态字,其相关知识如下。1) 标志位在 debug 调试过程中, 标志位用特殊符号表示的, 其标志名和状态符号的对照表参照表 1 所 示。表 1 标志名和状态符号的对照表参照表2) 加减法指令ADD表示加法指令, ADC表示带进位加法指令, SUB表示减法指令, SBB 表示带进位减法指 令。3) 乘除法指令MUL表示无符号数乘法指令, IMUL表示带符号数乘法指令, DIV 表示无符号数除法指令, IDIV 表示带符号数除法指令。4) 符号位扩展指令CBW表示从字节扩展到字的指令, CWD表示从字扩展到双字的指令。5) BCD 码的调整指令在进行十进制加减运算时, 需

3、要将数据用 BCD码表示, 还要考虑到是组合 BCD码还是非组合 BCD码,组合 BCD码是用一个字节表示两位十进制数,非组合BCD码是用一个字节表示一位十进制数,对于组合的 BCD码加减法运算其结果存放在 AL 中。组合的 BCD码加法调整指令 DAA;组合的 BCD码减法调整指令 DAS;非组合的 BCD码加法调整指令 AAA;非组合的 BCD码减法调整指令 AAS;乘法的非组合 BCD码调整指令 AAM;除法的非组合 BCD码调整指令 AAD。8088/8086 指令系统提供了实现加、减、乘、除运算指令,可参照表 2 所示内容。表 2 数据类型的数据运算表四、实验步骤与内容1) 对于表格

4、中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算 结果对标志寄存器中状态标志位的影响: 实验分析本实验要求简单, 仅对指定三组数进行基本运算。 只需使用 ADD、SUB、MUL、 DIV 四个运算命令,并以 MOV命令作为数值转移的手段即可。运算结果和状态标 志的情况可以通过 debug 调试中的 T 命令进行逐步查看。需要注意的主要有以下几点:1. 在进行加法和乘法运算时,会出现对高位的进位扩展。因此,在记录结果的时候不能仅仅记录低 2 位(十六进制)的结果,应记录包含高位的 完整结果;2. 在使用 MUL和 DIV命令时,语句的写法与 ADD和 SUB有区别;3. 除法运算既可得

5、到商,也可得到余数,余数存在 DL中;4. 查看结果时以三个语句为一次运算,输入三个 T 命令后的结果才是此次 运算的结果。 流程图 程序样例1、DATAS SEGMENT ;此处输入数据段代码 BUF1 DB 0ABH,64H,0A2H BUF2 DB 78H,5AH,3FH BUF3 DB 10 DUP(?)DATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV

6、 AH,0HMOV AL,BUF1SIMOV BL,ALMOV AL,BUF2SIADD AX,BX;进行运算MOV BUF3SI,ALADD SI,1HDEC CXJNZ Q1 ;跳转再做一次第二组数的加法运算MOV AX,4CHINT 21HCODES ENDSEND START2、STACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV AH,0HMOV AL,BUF2SIMOV B

7、L,ALMOV AL,BUF1SISUB AX,BXMOV BUF3SI,ALADD SI,1H ;do the operationDEC CXJNZ Q1 ;do it again with the second group of numbersMOV AX,4CHINT 21HCODES ENDSEND START3、DATAS SEGMENT;此处输入数据段代码BUF1 DB 0ABH,64H,0A2HBUF2 DB 78H,5AH,3FHBUF3 DB 10 DUP (?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMEN

8、TASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,2MOV CX,1Q1:MOV AH,0HMOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SIDIV BXMOV BUF3SI,ALADD SI,1H ;do the operationDEC CXJNZ Q1 ;do it again with the second group of numbersMOV AX,4CHINT 21HCODES ENDSEND START实验结果0ABH+78H64H+5AH0ABH-78H64H-5AH0

9、A2H*3FH0A2H/3FH计算状态标志算式结果AFCFZFOFSFPF0ABH+78H123H1000000ABH-78H33H00000164H+5AH0BEH00000164H-5AH0AH1000010A2H*3FH27DEH1000010A2H/3FH2H余 24H1000012)在数据段定义了两个多精度的有符号 16进制数, BUF1和 BUF2。求两数的和 与差,并将计算值存放在 BUF2为首地址的缓冲区中;同时将两组数据当作十进 制数据来处理,再次求两数的和与差,并将结果存放在 BUF2为首地址的缓冲区 中。试编程实现上述运算。BUF1 DB 92H ,98H,45H, 64

10、H,78HBUF2 DB 33H ,46H,17H, 45H,52H 实验分析本实验的思想是把这个两个多精度数进行按精度 (每两位) 进行运算, 考虑进位与借位, 每种运算都可以使用循环和带进位加法, 或循环和带进位减法进行实现。 对于十进制数运算 的要求,再辅以 DAA和 DAS两种十进制调整命令,将结果变为 BCD码即可。本实验中需要注意的有以下几点:1. 本实验要求就过存入以 BUF2为首地址的缓冲区。 为在运算时保护 BUF2的数据, 需 定义另一个存储空间来存储和 BUF2一样的数据;2. 在进行不同运算的间隙应当进行清除进位标志的操作, 即使用 CLC命令, 避免上一 运算的进位影

11、响下一位运算的结果;3. DAA和 DAS都只能对 AL 里的结果转换为压缩 BCD码,因此十进制加减结果必须存 入 AL 里,且转换为压缩 BCD码的结果要靠读取 AL 来获得。 程序流程图 程序样例1、 DATAS SEGMENT;此处输入数据段代码BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52HBUF3 DB 10 DUP (?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART :MO

12、V AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SIADC AL,BLMOV BUF2SI,ALINC SIDEC CXJNZ Q1MOV AX,4CHINT 21HCODES ENDSEND START2 、DATAS SEGMENT;此处输入数据段代码BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52HBUF3 DB 10 DUP (?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS EN

13、DSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART :MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SISBB AL,BLMOV BUF2SI,ALINC SIDEC CXJNZ Q1MOV AX,4CHINT 21HCODES ENDSEND START3、DATAS SEGMENT;此处输入数据段代码BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52HBUF3

14、 DB 10 DUP (?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART :MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SIADC AL,BLDAAMOV BUF2SI,ALINC SIDEC CXJNZ Q1MOV AX,4CHINT 21HCODES ENDSEND START4、 DATAS SEGMENT;此处输入数据

15、段代码BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52HBUF3 DB 10 DUP (?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART :MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SISBB AL,BLDAAMOV BUF2SI,ALINC SIDEC CXJNZ

16、Q1MOV AX,4CHINT 21HCODES ENDSEND START 实验结果十六进制结果十进制结果BUF1 + BUF2C5 DE 5C A9+25 45 63 09+BUF1 - BUF25F 52 2E 1F+65 52 34 25+3) 编程计算 280*584/190 ,运算结果用十六进制表示。要求上式计算结果的商 存入 AX,余数存入 DX寄存器。 实验分析本实验要求很简单, 可用基本运算直接完成。 值得注意的就是最后进行除法 运算时, DIV命令的执行结果自动将商存在 AX中,余数存于 DX中,可直接满足 实验要求,故无需多余操作。 程序流程图实验流程即为从算式最左至最右

17、逐步运算的基本运算律,故流程图略。程序样例DATAS SEGMENTDATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,280MOV BX,584MUL BXMOV BX,190DIV BXMOV AH,4CHINT 21HCODES ENDSEND START 实验结果商为 AX中的 035CH 余数为 DX中的 0078H五、 实 验感想与收获 本次实验的难度比上一次有了很大的提高,也带给我们更多的收获。 第一个实验中我就已经在尝试使用循环的结构来进行加减法,这给我第二个实验的进行提 供了极大的便利。但是在进行第二个实验的时候,由于一开始在每个循环节中对 SI+1 的操 作没有使用 INC 指令,而是使用了 ADD SI,1 这样的指令,影响了进位符,并最终导致了结 果的输出错误。经过了数次调试后终于发现了这个问题,并解决。在这个过程中,我对 ADD,ADC,SUB,SBB等指令的作用和原理有了很深入的理解,并且能够灵活的运用这几个指 令。可以说非常的有收获。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1