汇编程序分析:非压缩的十进制数相乘
2019-11-24 本文已影响0人
温柔倾怀
非压缩的十进制数相乘
- 已知在A单元开始的存储区中存有多位非压缩十进制数
- 在B单元中有一位非压缩的十进制数
- 要求编程完成二者的乘法运算并将结果存于从C单元开始的存储区
data segment
A DB 7,5,3,6 ;十进制表示的 非压缩
N EQU $-A ;N=A单元开始的十进制位数
B DB 8 ;一位非压缩 一个字节表示一个十进制数
C DB 5 DUP(?)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov si,offset A
mov di,offset C
mov byte ptr [di],0 ;C=0
mov CX,N ;循环乘N次
CLC ;清CF标志位
;乘
re: mov al,[si]
inc si
MUL B ; B 非压缩 8位 乘法指令隐含乘AL,结果存放在AH:AL
;al=07 *B(08)
;AX = 0038 (乘积放在AX中)
AAM ;乘法调整指令 乘积的两位十进制结果,高位放在AH中,低位放在AL中
;调整之后AX=0506 使用十进制的形式表示
add al,[di] ;[di]是C单元存放结果的单元,乘积的低位+前一次的高位
aaa ;加法调整指令
mov [di],al ;低位存放在C开始的单元,将低位06 存放在C
inc di ;存放的位置指向下一个单元
mov [di],ah ;将乘积的高位存放在[di]
loop re
mov ah,4ch
int 21h
code ends
end start
细节分析
调试程序,将初始化工作完成,运行到十进制数相乘处
- 先来看一下定义的数据的存储情况
- 分析程序源码,第一次乘,07×08=0038h
结果存放在ax中
- 乘法调整指令 AAM
上图可以看到下一条指令是AAM
执行之后见下图
AX=0506 ,分析被乘数和乘数,是其乘积的十进制形式
乘积的两位十进制结果,高位放在AH中,低位放在 AL中
-
乘积的低位加上上一次乘积的高位(进位)
-
乘积低位存储
-
乘积高位存储
再来看一下存储情况
-
下一次循环,[si]×B的低位与第一次的高位05相加存放在05的单元
-
循环