汇编程序分析:非压缩的十进制数相乘

2019-11-24  本文已影响0人  温柔倾怀

非压缩的十进制数相乘

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

细节分析

调试程序,将初始化工作完成,运行到十进制数相乘处

  1. 先来看一下定义的数据的存储情况
  1. 分析程序源码,第一次乘,07×08=0038h

结果存放在ax中


  1. 乘法调整指令 AAM
    上图可以看到下一条指令是AAM
    执行之后见下图

AX=0506 ,分析被乘数和乘数,是其乘积的十进制形式
乘积的两位十进制结果,高位放在AH中,低位放在 AL中

  1. 乘积的低位加上上一次乘积的高位(进位)

  2. 乘积低位存储


  1. 乘积高位存储



    再来看一下存储情况


  2. 下一次循环,[si]×B的低位与第一次的高位05相加存放在05的单元


  3. 循环


上一篇下一篇

猜你喜欢

热点阅读