不使用 MUL 的 8086 中的 32 位乘法

32-bit multiplication in 8086 without using MUL

开始:

MOV AX,0012h
MOV BX,0000h
MOV CX,0033h
MOV DX,0000h

MOV [100h],AX
MOV [102h],BX
MOV [104h],CX
MOV [106h],DX
MOV SI,40h

tekrar:

MOV DI,AX  ;sonucu indeks kaydeder
AND DI,01h
XOR DI,01h
JZ topla_kaydir

devam:

RCR DX,1
RCR CX,1
RCR BX,1
RCR AX,1

SHR [100h],1
SHR [102h],1 
DEC SI
CMP SI,0
JNZ tekrar
JMP son

topla_kaydir:

ADD DX,[104h]
ADC CX,[104h]

JMP devam     

这是我的代码的一部分。我想在不使用 mul 操作和扩展寄存器的情况下将两个 32 位数字相乘。我无法得到正确的结果。

MOV DI,AX  ;sonucu indeks kaydeder
AND DI,01h
XOR DI,01h
JZ topla_kaydir

如果AX的最低位设置为标签topla_kaydir
则此代码跳转 简单地写:

test ax,1
jnz topla_kaydir

topla_kaydir:
ADD DX,[104h]
ADC CX,[104h]

您将 CX 设置为低位字,将 DX 设置为高位字。此添加需要遵守该顺序。
如果打算提高 DX:CX 中的 32 位值,那么您应该这样写:

add cx,[104h]
adc dx,[106h]

SHR [100h],1
SHR [102h],1

这些 SHR 没什么意义。他们产生的价值并没有在任何地方使用!
您需要的是将其中一个数字(找到设置位时添加到结果的数字)的值加倍。

shl [104h],1
rcl [106h],1

MOV SI,40h

当您的源只有 32 位时,不要迭代 64 次!没意义。

mov si,32