………………………………………………最新资料推荐………………………………………本科实验报告实验名称:实验二算术运算类操作实验(基础与设计)课程名称:CPU与汇编实验实验时间:任课教师:实验地点:实验教师:实验类型:□原理验证■综合设计□自主创新学生姓名:学号/班级:组号:无学院:信息与电子同组搭档:无专业:信息工程成绩:一、实验要求和目的1.了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;2.掌握各类运算类指令对各状态标志位的影响及测试方法;3.熟悉汇编语言二进制多字节加减法基本指令的使用方法;4.熟悉无符号数和有符号数乘法和除法指令的使用;5.掌握符号位扩展指令的使用;6.掌握BCD 码调整指令的使用方法。
二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识1.加减法处理指令2.乘除法指令和符号位扩展指令3.BCD 码的调整指令四、实验内容(一)对于两组无符号数,087H 和034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响:1.流程图2.程序代码:DA TAS SEGMENT DA TAS ENDS STACKS SEGMENT STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART :MOV AX,DATASMOV DS,AXMOV AX,0C2HMOV BX,5FHADD AX,BX ;addMOV AX,0C2HMOV BX,5FHSUB AX,BX ;subMOV AX,0C2HMOV BX,5FHMUL BX ;mulMOV AX,0C2H MOV BX,5FH DIV BX ;div MOV AH,4CH INT 21H CODES ENDS ENDSTART(将数据改变得到另一组输出结果) 3.实验结果以第一组数的加法为例(已将截图以上输入-t 进行debug 的步骤省略)此时右下角信息(NV UP ……)代表标志寄存器的值。
4.结果分析: 由资料可得:开始结束 将两组数据分别存入AX ,BX 中,将二者中的数据相加,存入AX 中 将两组数据分别存入AX ,BX 中,用AX 中数据减去BX 中数据,存入AX 中 将两组数据分别存入AX ,BX 中,将二者中的数据相乘,存入AX 中 将两组数据分别存入AX ,BX 中,用AX 中数据除以BX 中数据,存入AX 中1.CF(carry flag):进位标志位,运算结果需要进位为1,不需进位为02.PF(parity flag):奇偶标志位,当运算结果的低8位中的“1”的个数为偶数时PF=1,为奇数时,PF=0。
3.AF(auxiliary flag):辅助进位标志,第3位有进位为1,无进位为04.ZF(zero flag):零标志位,当运算结果为零时ZF=1,否则ZF=0。
5.SF(sign flag):符号标志位,当运算结果的最高位为1时SF=1,否则SF=0。
6.OF(overflow flag):溢出标志位,当算术运算结果超出了带符号数的范围,即溢出时,OF=1,否则OF=0.其中注意在本程序中,SUB影响全部的条件标志:1.减法的CF反应的是无符号数运算中的借位情况:当减数>被减数是CF=1,否则CF=0;2.OF:如果两个数的符号相反而结果的符号与减数相同,则OF=1,否则OF=0;3.SF(运算结果<0为1否则为0)、ZF(零标志)、AF(辅助进位标志)、PF(奇偶标志)根据其含义设置。
(二)在数据段定义了两个多精度的有符号16 进制数,FIRST 和SECOND ,1)求两数的和与差,并将结果存放在THIRD 为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH 为首地址的缓冲区中。
试编程实现上述运算。
FIRST DW 45H,82H,96H,57HSECOND DW 12H,46H,83H,45H1.流程图MOV AX,DATASMOV DS,AXMOV SI,0MOV DI,0MOV CX,3;设置寄存器值,作为计数器L1: ;十六进制显示加法MOV AL,FIRST[SI+3]MOV BL,ALMOV AL,SECOND[SI+3]ADC AL,BLMOV THIRD[DI+4],ALDEC SIDEC DIDEC CXJNZ L1;若CX不为零,则未到最高位,循环DEC DI;CX为零,跳出循环MOV AL,FIRST[SI+3]CBW;扩充,符号位存入AHMOV BX,AXMOV AL,SECOND[SI+3]CBWADC AX,BXMOV WORD PTR THIRD[DI+4],AX;将AX强制显示。
即高位存入下一位。
MOV DI,5;重置寄存器值,避开加法结果位置。
MOV SI,0MOV CX,3L2:;十六进制显示减法MOV AL,FIRST[SI+3]MOV BL,SECOND[SI+3]SBB AL,BLMOV THIRD[DI+4],ALDEC SIDEC DIDEC CXJNZ L2DEC DIMOV AL,FIRST[SI+3]CBWMOV BL,SECOND[SI+3]CBWSBB AX,BXMOV WORD PTR THIRD[DI+4],AXMOV DI,0MOV SI,0MOV CX,3L3:;十进制显示加法MOV AL,FIRST[SI+3]MOV BL,ALMOV AL,SECOND[SI+3]ADC AL,BLDAA;显示为十进制MOV FORTH[DI+4],ALDEC SIDEC DIDEC CXJNZ L3DEC DIMOV AL,FIRST[SI+3]CBWMOV BX,AXMOV AL,SECOND[SI+3]CBWADC AX,BXDAAMOV WORD PTR FORTH[DI+4],AX MOV DI,5MOV SI,0MOV CX,3L4:;十进制显示减法MOV AL,FIRST[SI+3]MOV BL,SECOND[SI+3]SBB AL,BLDASMOV FORTH[DI+4],ALDEC SIDEC DIDEC CXJNZ L4DEC DIMOV AL,FIRST[SI+3]CBWMOV BL,SECOND[SI+3]CBWSBB AX,BXDASMOV WORD PTR FORTH[DI+4],AX MOV AH,4CHINT 21HCODES ENDSEND START3.调试结果4.结果分析(1)CWB为扩充,符号位置于AH;(2)将AX放入THIRD中时,由于AX为WORD型,THIRD为BYTE型,故需要PTR 指令;(3)最高位相加时,将进位结果强制存入数组,结果如图显示,第二位00为最高位进位结果。
(三)编程计算((Z +X*Y -328) -V)/ Y,其中X、Y、Z、V 均为16 位带符号数,假设初始数据分别装入X、Y、Z、V 单元,要求上式计算结果的商存入AX,余数存入DX 寄存器。
同学自行给出初始值加以验证程序。
1.流程图2.程序代码DA TAS SEGMENTX DW 0FF3HY DW 1117HZ DW000FHV DW5B12HDA TAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,X开始计算x*y取值计算x*y+z计算x*y+z-328计算x*y+z-328-v计算(x*y+z-328-v)/yIMUL Y ;x*y,保存在DX,AX中MOV CX,AXMOV BX,DX ;此时DX,AX存入BX,DX中MOV AX,Z ;扩展,存入AXCWDADD CX,AXADC BX,DXSUB CX,328SBB BX,0MOV AX,VCWDSUB CX,AXSBB BX,DXIDIV YMOV AH,4CHINT 21HCODES ENDSENDSTART3.调试结果经检验结果正确4.结果分析需注意数据计算可能产生的进位,及时使用CWB扩充,保证结果正确。
五.总结通过这次实验,自己对汇编语言终于有了一个系统的认识,并初步理解了汇编中四则运算的机制,熟悉了课上所学的CBW, CWD, PTR, IMUL, IDIV, DAA, DAS等命令的使用。