十六位乘法汇编实现

 

十六位乘法汇编实现

乘法和除法相比算是比较容易的实现了,但是也有细节。比如右移存储最后一位是考虑到最后一位不会被后来的乘数打扰,除法中的左移也是有这种思想。

代码实现:

data   segment
MUL1   Dw  1234H
MUL2   Dw  1234H
MULR   Dd  0
data   ends

code   segment
       assume cs:code, ds:data

start  proc  near

       mov   ax, data       ; 初始化段基地址寄存器DS
       mov   ds, ax

       mov   cx , 16         ; 初始化循环次数
       mov   ax , 0
      ; mov   dl , MUL2
       mov   dx , MUL1
MARK1:
       test  dx , 01h
       jz    MARK2             ;结果等于0 表明该位位0 无需累加
       add   ax , MUL2         ;结果不为0,累加后再右移
       jmp   MARK3
MARK2:
       clc                    ;清0进位位,防止在不累加的情况下,结果右移受影响
MARK3:
       rcr   ax , 1           ;带C的右移,把进位一起移进来
       rcr   bx , 1           ;带C的右移,把ax最低位移入bx最高位
       ror   dx , 1           ;不带C,仅仅右移乘数,保证乘数在程序运行结束后不变
       loop MARK1                           
       mov MULR , bX       
       mov MULR+2 , ax
       jmp  $                  ; 死循环

code   ends
       end  start