【发布时间】:2015-03-25 03:20:34
【问题描述】:
我有代码示例,用于在 8086 上将两个 16 位数字相乘并尝试更新它以使两个 32 位数字相乘。
start:
MOV AX,0002h ; 16 bit multiplicand
MOV BX,0008h ; 16 bit multiplier
MOV DX,0000h ; high 16 bits of multiplication
MOV CX,0000h ; low 16 bits of multiplication
MOV SI,10h ; loop for 16 times
LOOP:
MOV DI,AX
AND DI,01h
XOR DI,01h
JZ ADD
CONT:
RCR DX,1
RCR CX,1
SHR AX,1
DEC SI
CMP SI,0
JNZ LOOP
JMP END ; ignore here, it's not about multiplication.
ADD:
ADD DX,BX
JMP CONT
上面的代码语句将两个 16 位数字相乘。
要更新 32 位两个数字,我知道我需要如下更新:
- 将
AX更改为00000002h并将BX更改为00000008h。 - 多用两个寄存器(我不知道应该用哪个寄存器)来保存第二个和第三个16位乘法(因为乘法将是64位。16位4次。我目前有DX和CX。)
- 将循环编号更新为
20h(在这种情况下为SI)(对于 32 位编号,循环编号为 32 次)
8086 是 16 位微处理器,所以它的寄存器也是。我无法为寄存器分配 32 位长的数字。
8086 的寄存器:
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
SREG: DS, ES, SS, and only as second operand: CS.
来源:http://www.electronics.dit.ie/staff/tscarff/8086_instruction_set/8086_instruction_set.html
我的问题是:
- 如何为一个 32 位数字处理两个不同的寄存器。 (寄存器是 16 位的,所以我必须将数字分成两个寄存器)
- 我可以为此目的使用哪些寄存器?我可以随意使用any注册吗?
提前致谢。
【问题讨论】:
-
我猜这是一个家庭作业式的问题,否则你可能会重用一些已经编写和测试过的代码。如果是作业,请查看Stack Overflow: How can I multiply and divide using only bit shifting and adding? 并尝试弄清楚如果您是原始 ZX Spectrum ROM 的作者,您将如何在Z80 处理器上实现“大数字”。结合。完成
-
将两个 32 位数字相乘,您需要 64 位目标来存储结果。它是四个 16 位寄存器。考虑将结果存储在内存中
-
我不明白它与 Z80 和您提供的 stackoverflow 链接有什么关系。 stackoverflow 链接没有提供有关我的任何问题的任何信息。 @xmojmr
-
这是我已经在我的问题中输入的内容。我对算法没有问题,我对编码有问题。我不知道如何使用(以及哪些寄存器)将 32 位两个数字相乘。 @AlexanderZhak
-
您是否需要按位执行此操作,还是允许您使用
mul?
标签: assembly multiplication x86-16