【发布时间】:2017-03-11 16:13:24
【问题描述】:
假设我想在汇编中将一个大数乘以另一个(也许很小)数。大数(被乘数)保存在DX:AX,乘数保存在BX。 MUL 指令仅在 AX 上运行。那么DX怎么办呢?
例如,数字是0001:0000H(65536),我想把它乘以2。
number dw 0000h, 0001h
...
mov ax, [number]
mov dx, [number+2]
mov bx, 2
mul bx ; it is ax*2 or 0000*2
因此结果为零!有什么想法吗?
【问题讨论】:
-
ax包含0000的地址,而不是值。你可能想做mov ax,[number]和mov dx,[number+2](+2,因为dw是2个字节)。 -
把你的号码从 DX:AX 移到 EAX :)
-
是的,这也只是 16bit x86 吗?你想要有符号还是无符号的数字? (
mul与imul) -
加载dx寄存器没有效果。 16 位乘法只使用 dx 作为输出寄存器:高位。这里 dx:ax 中的结果全为零。
-
您不能将 16 位 8086 汇编中的 32 位数字与一条指令相乘。这就是使它成为 16 位指令集的原因。您需要不止一个 16 位乘法和一些移位和加法: (a+b*2^16) * (c + d*2^16) = ac + (bc + a d)*2^16 + (bd*2^32)。您可能会跳过最后一项,因为它的值大于 32 位。
标签: assembly x86-16 bigint extended-precision