实验四 运算类程序实验
一、实验目的
1. 掌握运算类指令编程及调试方法;
2. 掌握运算类指令对各状态标志位的影响及测试方法。
二、实验所用设备
1. PC微机一台。
三、实验内容
80x86指令系统提供了实现加、减、乘、除运算的基本指令,可对表4-1所示
的数据类型进行算术运算。
表4-1 数据类型算术运算表
1.二进制双精度加法运算
本实验要求计算X+Y=Z,将结果Z输出到屏幕,其中X=001565A0H,Y=0021B79EH。
实验利用累加器AX,先求低十六位和,并存入低址存储单元,后求高16位和,再存入高址存储单元。由于低位和可能向高位有进位,因而高位字相加语句需用ADC指令,则低位相加有进位时,CF=1,高位字相加时,同时加上CF中的1。在80386以上微机中可以直接使用32位寄存器和32位加法指令完成本实验的功能。
2.十进制数的BCD码减法运算
本实验要求计算X-Y=Z,其中,X、Y、Z为BCD码,其中X=0400H,Y=0102H。 3.乘法运算
本实验要求实现十进制数的乘法,被乘数和乘数均以BCD码形式存放于内存中,被乘数为54320H,乘数为3H,运算结束后,将乘积在屏幕上显示。 4.用减奇数开平方运算
80x86指令系统中有乘除法指令但没有开平方指令,因此,开平方运算是通过程序来实现的。用减奇数法可求得近似平方根,获得平方根的整数部分。我们知道,N个自然数中的奇数之和等于N2,即:1+3+5=9=32
1+3+5+7=16=42
1+3+5+7+9+11+13+15=64=82
第 16 页
若要做S的开方运算,那麽就可以从S中逐次减去自然数中的奇数1,3,5,7?,一直进行到相减数为0或不够减下一个自然数的奇数为止,然后统计减去自然数的奇数个数,它就是S的近似平方根。
本实验要求利用减奇法计算0040H的开平方值,并将运算结果显示在屏幕上。
四、实验步骤
1. 2. 3. 4.
运行Tddebug软件,选择Edit菜单编写实验程序;
使用Compile菜单中的Compile和Link对实验程序进行汇编、连接; 使用Rmrun菜单中的Run,运行程序,观察运行结果;
使用Rmrun菜单中的Debug,调试程序,观察调试过程中,数据传输指令执行后,各寄存器及数据区的内容;
5. 更改数据区中的数据,考察程序的正确性。
五、实验报告内容及要求
根据实验要求编写程序并调试,写出程序调试过程及运行情况。 1. 二进制双精度加法运算
DATA SEGMENT
X DW 65A0H,0015H Y DW 0B79EH,0021H Z DW 2 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,2 CLC
MOV SI,0
L1: MOV AX,X[SI] ADC AX,Y[SI] MOV Z[SI],AX INC SI INC SI LOOP L1
MOV BX,Z[2] CALL LIST_BX MOV BX,Z CALL LIST_BX MOV AH,4CH INT 21H LIST_BX PROC
MOV CH,4 MOV CL,4 NEXT: ROL BX,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,39H
第 17 页
JLE PRINT ADD DL,7 PRINT: MOV AH,2 INT 21H DEC CH JNZ NEXT RET LIST_BX ENDP
CODE ENDS END START
程序结果:00371D3E
2. 十进制数的BCD码减法运算 DATA SEGMENT X DW 0400H Y DW 0102H DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,X LEA DI,Y MOV DL,10D MOV BL,[SI] MOV AL,[SI+1] MUL DL ADD BL,AL MOV DL,10D MOV CL,[DI] MOV AL,[DI+1] MUL DL ADD CL,AL SUB BL,CL MOV AL,BL MOV BL,10D DIV BL MOV BH,AL
第 18 页
MOV BL,AH MOV CX,4 MOV AH,02H LOOP2: ROL BX,4 MOV DL,BL AND DL,0FH ADD DL,'0' CMP DL,'9' JB PRINT ADD DL,'A'-('9'+1) PRINT: INT 21H LOOP LOOP2 CODE ENDS
END START
程序结果:0208
3. 乘法运算
DATA SEGMENT
X DD 54320H Y DB 03H DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,X+2 MOV CX,3 MOV AX,0 LOOP1: MOV DL,10D MOV BL,[SI] ROL BL,4 AND BL,0FH MUL DX ADD AX,BX MOV DL,10D MOV BL,[SI] AND BL,0FH MUL DX ADD AX,BX DEC SI
LOOP LOOP1 LEA DI,Y MOV BL,[DI]
第 19 页
MUL BX MOV SI,4 MOV BX,AX MOV CX,DX MOV AH,02H LOOP2: ROL CX,4 MOV DL,CL AND DL,0FH ADD DL,'0' CMP DL,'9' JBE PRINT1
ADD DL,'A'-('9'+1) PRINT1: INT 21H DEC SI JNZ LOOP2 MOV SI,4 LOOP3: ROL BX,4 MOV DL,BL AND DL,0FH ADD DL,'0' CMP DL,'9' JBE PRINT2
ADD DL,'A'-('9'+1) PRINT2: INT 21H DEC SI JNZ LOOP3 MOV DL,'H' INT 21H CODE ENDS
END START
程序结果:00027C90H
4.用减奇数开平方运算 DATA SEGMENT
RES DB 5 DUP('0') DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,0040H MOV CX,1D MOV AX,0D BEGIN: SUB BX,CX JB EXIT
第 20 页