1、实验二 算术运算实验一、 实验目的1、 掌 握 MASM for Windows 环 境 下 的 汇 编 语 言 编 程 环 境 使 用 ;2、 掌 握 汇 编 语 言 程 序 设 计 的 基 本 流 程 及 汇 编 语 言 中 的 二 进 制 、 十 六 进 制 、 十 进 制 、BCD码 的 表 示 形 式 ;3、 掌 握 汇 编 语 言 对 多 精 度 十 六 进 制 和 十 进 制 的 编 程 方 法 及 运 算 类 指 令 对 各 状 态 标 志位 的 影 响 及 测 试 方 法 ;4、 掌 握 无 符 号 数 和 有 符 号 数 运 算 区 别 及 编 程 方 法 ;5、 掌 握
2、BCD 码 调 整 指 令 的 使 用 方 法二、 软硬件实验环境1、硬 件 环 境 : 惠 普 64 位 一 体 化 计 算 机 及 局 域 网 ;2、软 件 环 境 : windows 8, 红 蜘 蛛 管 理 系 统 , MASM for Windows。三、实验基本原理算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。 1) 标志位在 debug 调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表 1所示。表 1 标志名和状态符号的对照表参照表2) 加减法指令ADD 表示加法指令,ADC 表示带进位加法指令,SUB 表示减法指令,SBB 表示带进位减法指
3、令。3) 乘除法指令MUL 表示无符号数乘法指令,IMUL 表示带符号数乘法指令,DIV 表示无符号数除法指令,IDIV 表示带符号数除法指令。4) 符号位扩展指令CBW 表示从字节扩展到字的指令,CWD 表示从字扩展到双字的指令。5) BCD 码的调整指令在进行十进制加减运算时,需要将数据用 BCD 码表示,还要考虑到是组合 BCD 码还是非组合 BCD 码,组合 BCD 码是用一个字节表示两位十进制数,非组合 BCD 码是用一个字节表示一位十进制数,对于组合的 BCD 码加减法运算其结果存放在 AL 中。组合的 BCD 码加法调整指令 DAA;组合的 BCD 码减法调整指令 DAS;非组合
4、的 BCD 码加法调整指令 AAA;非组合的 BCD 码减法调整指令 AAS;乘法的非组合 BCD 码调整指令 AAM;除法的非组合 BCD 码调整指令 AAD。8088/8086 指令系统提供了实现加、减、乘、除运算指令,可参照表 2 所示内容。表 2 数据类型的数据运算表四、实验步骤与内容1) 对于表格中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算结果对标志寄存器中状态标志位的影响: 实验分析本实验要求简单,仅对指定三组数进行基本运算。只需使用ADD、SUB、MUL、DIV 四个运算命令,并以 MOV 命令作为数值转移的手段即可。运算结果和状态标志的情况可以通过 debug 调
5、试中的 T 命令进行逐步查看。需要注意的主要有以下几点:1. 在进行加法和乘法运算时,会出现对高位的进位扩展。因此,在记录结果的时候不能仅仅记录低 2 位(十六进制)的结果,应记录包含高位的完整结果;2. 在使用 MUL 和 DIV 命令时,语句的写法与 ADD 和 SUB 有区别;3. 除法运算既可得到商,也可得到余数,余数存在 DL 中;4. 查看结果时以三个语句为一次运算,输入三个 T 命令后的结果才是此次运算的结果。流程图程序样例1、DATAS SEGMENT;此处输入数据段代码 BUF1 DB 0ABH,64H,0A2HBUF2 DB 78H,5AH,3FHBUF3 DB 10 DU
6、P(?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV AH,0HMOV AL,BUF1SIMOV BL,ALMOV AL,BUF2SIADD AX,BX ;进行运算MOV BUF3SI,ALADD SI,1H DEC CXJNZ Q1 ;跳转再做一次第二组数的加法运算MOV AX,4CHINT 21HCODES ENDSEND START2、STACKS SE
7、GMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,2Q1:MOV AH,0HMOV AL,BUF2SIMOV BL,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
8、 START3、 DATAS SEGMENT;此处输入数据段代码 BUF1 DB 0ABH,64H,0A2HBUF2 DB 78H,5AH,3FHBUF3 DB 10 DUP(?)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME 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
9、 ;do the operationDEC CXJNZ Q1 ;do it again with the second group of numbersMOV AX,4CHINT 21HCODES ENDSEND START实验结果0ABH+78H64H+5AH0ABH-78H64H-5AH0A2H*3FH0A2H/3FH计算 状态标志算式 结果 AF CF ZF OF SF PF0ABH+78H 123H 1 0 0 0 0 00ABH-78H 33H 0 0 0 0 0 164H+5AH 0BEH 0 0 0 0 0 164H-5AH 0AH 1 0 0 0 0 10A2H*3FH 27D
10、EH 1 0 0 0 0 10A2H/3FH 2H 余 24H 1 0 0 0 0 12) 在数据段定义了两个多精度的有符号 16 进制数,BUF1 和 BUF2。求两数的和与差,并将计算值存放在 BUF2 为首地址的缓冲区中;同时将两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在 BUF2 为首地址的缓冲区中。试编程实现上述运算。BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52H 实验分析本实验的思想是把这个两个多精度数进行按精度(每两位)进行运算,考虑进位与借位,每种运算都可以使用循环和带进位加法,或循环和带进位减法
11、进行实现。对于十进制数运算的要求,再辅以 DAA 和 DAS 两种十进制调整命令,将结果变为 BCD 码即可。本实验中需要注意的有以下几点:1. 本实验要求就过存入以 BUF2 为首地址的缓冲区。为在运算时保护 BUF2 的数据,需定义另一个存储空间来存储和 BUF2 一样的数据;2. 在进行不同运算的间隙应当进行清除进位标志的操作,即使用 CLC 命令,避免上一运算的进位影响下一位运算的结果;3. DAA 和 DAS 都只能对 AL 里的结果转换为压缩 BCD 码,因此十进制加减结果必须存入 AL 里,且转换为压缩 BCD 码的结果要靠读取 AL 来获得。 程序流程图 程序样例1、DATAS
12、 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:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL,BUF2SIMOV BL,ALMOV AL,BUF1SIADC AL,BLMOV BUF2SI,ALINC S
13、IDEC 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 ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,4MOV AH,00HQ1:MOV AL
14、,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 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;此处输入数据段代码 BUF1 DB 92H,98H,45H,64H,78HBUF2 DB 33H,46H,17H,45H,52H