美文网首页
汇编程序分析:非压缩的十进制数相乘

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

作者: 温柔倾怀 | 来源:发表于2019-11-24 14:57 被阅读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
    
    

    细节分析

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

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

    结果存放在ax中


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

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

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

    2. 乘积低位存储


    1. 乘积高位存储



      再来看一下存储情况


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


    3. 循环


    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/hmylwctx.html