当前位置:文档之家› 北京理工大学汇编实验二报告

北京理工大学汇编实验二报告

北京理工大学汇编实验二报告本科实验报告实验名称:算术运算类操作实验课程名称:CPU与汇编实验实验时间:2015.10.29 任课教师:王耀威实验地点:10-102实验教师:潘丽敏实验类型:□原理验证■综合设计□自主创新学生姓名:王晓玥学号/班级:1120131332/05111311 组号:学院:信息与电子学院同组搭档:专业:信息工程成绩:一、实验要求和目的1、了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;2、掌握各类运算类指令对各状态标志位的影响及测试方法;3、熟悉汇编语言二进制多字节加减法基本指令的使用方法;4、熟悉无符号数和有符号数乘法和除法指令的使用;5、掌握符号位扩展指令的使用。

6、掌握 BCD 码调整指令的使用方法二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有 MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识1、加减法处理指令主要有加法指令 ADD,带进位加法 ADC,减法指令 SUB,带进位减法指令 SBB。

2.乘除法指令和符号位扩展指令主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令 IDIV,以及符号位从字节扩展到字的指令 CBW 和从字扩展到双字的指令 CWD。

3.BCD 码的调整指令主要有非压缩的BCD 码加法调整指令DAA,压缩的 BCD 码减法调整指令 DAS,非压缩的 BCD 码加法调整指令 AAA,非压缩的 BCD 码减法调整指令 AAS,乘法的非压缩 BCD码调整指令 AAM,除法的非压缩 BCD 码调整指令 AAD。

8088/8086 指令系统提供了实现加、减、乘、除运算的上述基本指令,可对表 1 所示的数据类型进行数据运算。

表 1-2-1 数据类型数据运算表数制二进制BCD码带符号无符号组合非组合运算符+、-、×、÷+、-+、-、×、÷操作数字节、字、多精度字节(二位数字)字节(一位数字)四、实验内容与步骤1、对于两组无符号数,087H 和 034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响:(1)实验流程将一组操作数分别用ADD,SUB,MUL,DIV运算(2)实验代码:DATAS SEGMENTBUF1 DB 087HBUF2 DB 034HBUF3 DB 4 DUP(?);此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AX,0MOV SI,AX;两数相加MOV AL,BUF1MOV BL,BUF2ADD AL,BLMOV BUF3[SI],ALMOV AL,0MOV AL,0INC SIMOV BUF3[SI],AL;两数相减MOV AL,BUF1MOV BL,BUF2SUB AL,BLINC SIMOV BUF3[SI],ALMOV AL,0SBB AL,0INC SIMOV BUF3[SI],AL;两数相乘MOV AL,BUF1MOV BL,BUF2MUL BLINC SIMOV BUF3[SI],ALINC SIMOV BUF3[SI],AH;两数相除,AL中存放商,AH中存放余数MOV AX,0MOV AL,BUF1MOV BL,BUF2DIV BLINC SIMOV BUF3[SI],ALINC SIMOV BUF3[SI],AH;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START(3)实验结果:1)第一组操作数87H,34H2)第二组操作数0C2H,5FH(4)计算结果计算状态标志表达式结果CF AF ZF OF SF PF 087H+034H 00BB 0 0 0 0 1 1 087H-034H 0053 0 0 0 1 0 1 087H*034H 1B6C 1 0 0 1 0 0 087H/084H 02(1F) 1 0 0 0 0 1 0C2H+05FH 0121 0 0 0 0 0 0 0C2H-O5FH 0063 0 0 1 0 0 1 0C2H*05FH 47FE 0 0 0 0 0 1 0C2H/05FH 02(04) 0 0 0 0 0 0(5)各运算对状态标志位的影响及其意义。

状态加法减法乘法除法标志位CF 最高有效位向高位有进位为1,否则为0 最高有效位向高位有借位为1,否则为CF OF=0,乘积的高一半为0(字节操作的AH或字操作的DX);CF OF=1,乘积的高一半不为0不确定AF 无影响ZF 运算结果非0,ZF=0,否则为1无影响OF 两个不同符号数相加,或同符号数相加,结果同符号数相减,或不同符号数相减时结果符号CF OF=0,乘积的高一半为0(字节操作的AH或符号与其相同,则为0;同符号数相加,结果符号与其相反,则为1 与减数不同,则为0;两数符号相反,结果符号与减数相同,则为1字操作的DX);CF OF=1,乘积的高一半不为0SF 结果不为负则为0;否则为1无影响PF 无影响2、在数据段定义了两个多精度的有符号 16 进制数,FIRST 和 SECOND ,1)求两数的和与差,并将结果存放在 THIRD 为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH 为首地址的缓冲区中。

试编程实现上述运算。

FIRST DB 45 H,82H,96 H,57HSECOND DB 12 H,46H,83 H,45H (1)程序流程图将两组数字存入内用ADC从最低位对操作数进行相是否否是上次运是否(2)程序代码:DATAS SEGMENTFIRST DB 45H,82H,96H,57H SECOND DB 12H,46H,83H,45H THIRD DB 8 DUP (?)FORTH DB 8 DUP (?)DATAS ENDS相加结束,进进行十进制结束调整STACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AX,0MOV BX,4MOV CX,4L:MOV AL,[BX+3]ADC AL,[BX-1]MOV [BX+7],ALDEC BXLOOP LMOV BX,4MOV CX,4M:MOV AL,[BX-1]SBB AL,[BX+3]DEC BXLOOP MMOV BX,4MOV CX,4N:MOV AL,[BX+3]ADC AL,[BX-1]DAAMOV [BX+15],ALDEC BXLOOP NMOV BX,4MOV CX,4O:MOV AL,[BX-1]SBB AL,[BX+3]DASDEC BXLOOP OMOV AH,4CHINT 21HCODES ENDSEND START(3)运行结果16 进制结果10 进制结果FIRST +SECOND 57 C9 19 9C 58 29 80 02 FIRST -SECOND 33 3C 13 12 33 36 13 123、编程计算((Z +X*Y -328) -V)/ Y,其中 X、Y、Z、V 均为 16 位带符号数,假设初始数据分别装入 X、Y、Z、V 单元,要求上式计算结果的商存入 AX,余数存入 DX 寄存器。

同学自行给出初始值加以验证程序。

(1)流程图及代码DATAS SEGMENTX DW 0D9HY DW 05CHZ DW 22HV DW 33Hresult DW 2 DUP(?);此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,XIMUL YMOV BX,AXMOV CX,DXMOV AX,ZCWDADD BX,AXADC CX,DXSUB BX,328SBB CX,0MOV AX,VCWDSUB BX,AXSBB CX,DXMOV AX,BXMOV DX,CXIDIV YMOV RESULT,AXMOV RESULT+2,DX;此处输入代码段代码MOV AH,4CHINT 21HCODES ENDSEND START(2)运行结果运算结果为AX=00D5H,DX=0017H,经验证,结果正确。

相关主题