汇编语言的算术运算相比数据传送会更难一些,因此实验03相比实验02也会更难一些。下面先给出本次实验的内容。
实验内容
(2) 用DEBUG单步调试下述指令,观察每条指令的运行结果以及标志寄存器FLAG 的置位情况。
1) MOV CL,4
2) MOV AL, F0
3) SHL AL,1
4) SHR AL,1
5) SAR AL,1
6) SAR AL, CL
7) MOV CL,2
8) ROR AL, CL
9) MOV CL,4
10) RCL AL, CL
(3) 设 X,Y,Z,V 均为 16 位带符号数,分别存放在 X,Y,Z,V 存储单元中,部分代码如下
MOV AX,DATAS
MOV DS,AX
MOV AX,WORD PTR X
MOV BX,WORD PTR Y
IMUL BX
MOV CX,AX
MOV BX,DX
MOV AX,WORD PTR Z
CWD
ADD CX,AX
ADC BX.DX
SUB CX,0540H
SBB BX,0
MOV AX,WORD PTR V
CWD
SUB AX,CX
SBB DX,BX
MOV BX,WORD PTR X
IDIV BX
MOV AH 4CH
INT 21H
所示,请完成下述任务:
1) 自行在程序的数据定义部分对 X,Y,Z,V 进行赋值(要求:大于 100H 且 X,Y,Z,V 不相等);
2) 调试程序,描述该程序实现什么功能?
3) 代码部分中,两次出现 CWD 指令,其作用各是什么?
4) 最后的结果存放在哪里,结果为多少,为什么?
5) 给出第 5/13/19 行后的标志寄存器 FLAG 的状态,试说明原因
(4) 请为下面每个算术运算式编写三个程序,分别使它们处理的数是无符号数、有 符号数和非压缩的 BCD 码。式中 A、B、C 和 D 等变量都代表 16 位数据(要 求:大于 100H 且 A,B,C,D 不相等)。可自定义这些变量的初值,给出算式的 运算结果,验证其正确性。
1) A-(B+C)*D
2) (B+C)-B/ (D-C)
(5) 试分析下面的程序段完成的是什么功能。
MOV CL,4
SHL DX,CL
MOV BL,AH
SHL AX,CL
SHR BL,CL
OR DL,BL
(6) 编写程序段完成如下要求
1) 用位操作指令实现 AL(无符号数)乘以 10. 假设(AL)=23H。
2) 用逻辑运算指令实现数字 0~9 的 ASCII 码与非压缩 BCD 码的互相转换。
3) 把 DX.AX 中的双字右移 4 位。
4) 补充教材例 2.45,使之在段定义部分初始化字符串 STRING,并将结果 RESULT 的值利用 DOS 中断显示出来。(注:空格字符的个数可控制在两 位十进制数)
实验可能遇见的问题:
个人认为本次实验难度在于第四和第五题。其中,第四题的无符号数部分可以直接相减,因为无符号数的计算结果是不会为负的,所以减法和除法的结果都不会有影响。对于有符号数,需要减法的时候使用符号拓展指令并且进行SBB DX,0指令;乘法和除法使用IMUL和IDIV指令。非压缩BCD码的乘除运算则相对复杂,可以参考以下文章:
非 BCD 码的乘除及其混合运算_bcd+abd怎么转换成乘法的非-CSDN博客
第五题是将DX.AX寄存器的内容整体左移四位,由于使用了两个分开的寄存器,所以中间进行了一些数据的传送。