十六位乘法汇编实现
乘法和除法相比算是比较容易的实现了,但是也有细节。比如右移存储最后一位是考虑到最后一位不会被后来的乘数打扰,除法中的左移也是有这种思想。
代码实现:
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
PREVIOUS8位无符号数除法不恢复余数算法
NEXT随机过程2