-
目录
一、实验目的
二、实验内容
三、实验步骤以及结果
四、实验结果与分析
五、实验总结
一、实验目的
- 掌握加减法运算指令对各状态标志位的影响及测试方法
- 掌握汇编语言长整数的加法的操作方法
-
二、实验内容
- 对于以下几组数,
087H和034H
0C2H和5FH
0F3H和0F3H,编程求这两组数的和与差
1)若这几组数都是无符号数,记录计算结果并考虑计算结果对标志寄存器中CF、OF、ZF、SF、PF 等状态标志位的以下表的格式记录下来。
2)如果是有符号数的加法和减法,上面小题的指令适用吗?此时如何看待计算结果?
操作数1 | 操作数2 | 操作指令 | 计算结果 | CF | ZF | OF | SF | AF | PF |
087H | 034H | ADD | 0CBH | 0 | 0 | - | |||
2. Data1 和Data2 是两个三字节的无符号整数,尝试编写汇编程序计算得到Data1 和Data2的和,将结果存到以ans为首地址的缓冲器区中 假如Data1 存放的数据为 0FFEEDDH,Data2 :102236H,则结果 101113H。
3. 计算(V-(X*Y+Z-540))/X,其中X、Y、Z、V均为16位带符号数,假设初始数据分别装入X,Y,Z,V单元,要求将计算的结果放入以ans为首地址的缓冲器区中。
参考初始值:
V:0124H X :0FE1CH Y:023FH Z:8230H
三、实验步骤以及结果
1.对于以下几组数,
087H和034H
0C2H和5FH
0F3H和0F3H,编程求这两组数的和与差
1)若这几组数都是无符号数,记录计算结果并考虑计算结果对标志寄存器中CF、OF、ZF、SF、PF 等状态标志位的以下表的格式记录下来。
2)如果是有符号数的加法和减法,上面小题的指令适用吗?此时如何看待计算结果?
第一版代码如下:
stack segment stack
stack ends
dataseg segment
data1 db 087h,0c2h,0f3h
data2 db 034h,5fh,0f3h
dataseg ends
code segment
assume cs:code, ds:dataseg, ss:stack
start: mov ax, dataseg
mov ds, ax
mov al,data1
add al,data2
mov al,data1
sub al,data2
mov al,[data1+1]
add al,[data2+1]
mov al,[data1+1]
sub al,[data2+1]
mov al,[data1+2]
add al,[data2+2]
mov al,[data1+2]
sub al,[data2+2]
mov ah, 4ch
int 21h
code ends
end start
结果符合题意,结果在下面表格中。
操作数1 | 操作数2 | 操作指令 | 计算结果 | CF | ZF | OF | SF | AF | PF |
087H | 034H | ADD | 0CBH | 0 | 0 | 0 | 1 | 0 | 1 |
087H | 034H | SUB | 053H | 0 | 0 | 1 | 0 | 0 | 1 |
0C2H | 5FH | ADD | 21H | 1 | 0 | 0 | 0 | 1 | 1 |
0C2H | 5FH | SUB | 63H | 0 | 0 | 1 | 0 | 1 | 1 |
0F3H | 0F3H | ADD | 0E6H | 1 | 0 | 0 | 1 | 0 | 0 |
0F3H | 0F3H | SUB | 00H | 0 | 1 | 0 | 0 | 0 | 1 |
2. Data1 和Data2 是两个三字节的无符号整数,尝试编写汇编程序计算得到Data1 和Data2的和,将结果存到以ans为首地址的缓冲器区中 假如Data1 存放的数据为 0FFEEDDH,Data2 :102236H,则结果 101113H。
代码如下:
stack segment stack
stack ends
dataseg segment
data1 db 0FFh,0EEh,0DDh
data2 db 10h,22h,36h
ans db 4 dup(?)
dataseg ends
code segment
assume cs:code, ds:dataseg, ss:stack
start: mov ax, dataseg
mov ds, ax
mov ah,[data1+2]
adc ah,[data2+2]
mov [ans+2],ah
mov ah,[data1+1]
adc ah,[data2+1]
mov [ans+1],ah
mov ah,[data1]
adc ah,[data2]
mov ans,ah
mov ah, 4ch
int 21h
code ends
end start
Debug观察结果是否属实:
可见DS=076A
程序将结束时查看内存内容:
076A:0006即DS:ans,发现从0006到0008的值为10 11 13,符合题意。
3. 计算(V-(X*Y+Z-540))/X,其中X、Y、Z、V均为16位带符号数,假设初始数据分别装入X,Y,Z,V单元,要求将计算的结果放入以ans为首地址的缓冲器区中。
//实验3我的结果有问题,可参考IBM-PC汇编语言程序设计(第2版)P67右下角
参考初始值:
V:0124H X :0FE1CH Y:023FH Z:8230H
核心代码:
X*Y的结果 DX:AX=FFFBCOE4
X*Y+Z-540的结果 DX:AX=FFFC40F8
V-(X*Y+Z-540)的结果0003c02c
最终结果:
商为FFF9(即-7),余数为4F7C
四、实验结果与分析
可见第三部分。
-
五、实验总结
- 既定任务基本完成,除任务1的思考部分。
- 任务1填表格部分印象深刻,需要一个个查找标志是什么意思,还要与代码对照理解,进而理解溢出、进位、符号等等功能的作用。
长整数加减法可拆分为短整数有进位加减法,通常一个add下面要跟一个adc X,0,sub也是同理