不使用 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
开始:
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