我正在尝试在程序集中执行 x^3 - y^3(已签名)
I'm trying to do x^3 - y^3 (signed) in assembly
我正在使用 8086 汇编 (tasm)
我想做一个简单的程序,它采用 x^3 - y^3(x 和 y 是 db)并将答案保存到另一个 db(如果结果太大而 db 无法容纳,则打印一条消息)
这是我的代码:
mov al, x ;mov x to al for multiply
imul x; ax = al*x (=x^2)
imul x; ax = ax*x (low), dx = ax*x (high) (=x^3)
mov low_x, ax; save low x^3 (dw)
mov high_x, dx; save high x^3 (dw)
mov al, y ;mov y to al for multiply
imul y; ax = al*y (=y^2)
imul y; ax = ax*y (low), dx = ax*y (high) (=y^3)
mov low_y, ax; save low y^3 (dw)
mov high_y, dx; save high y^3 (dw)
现在呢?我怎样才能在数字之间进行分组以获得正确答案?
谢谢!
首先,请注意 imul r/m8
会产生 ax
而不是 dx:ax
的结果。如果你打算使用16位乘法,你应该确保将操作数放入16位寄存器。
至于减法,听起来你想合成一个 32 位的。这很容易通过 SUB
和 SBB
来计算进位。
因此,代码可能如下所示:
movsx cx, y
mov ax, cx
imul cx
imul cx
mov low_y, ax; save low y^3 (dw)
mov high_y, dx; save high y^3 (dw)
movsx cx, x
mov ax, cx
imul cx
imul cx
mov low_x, ax; save low x^3 (dw)
mov high_x, dx; save high x^3 (dw)
sub ax, low_y
sbb dx, high_y
请注意,我调换了顺序,因为如果您先计算 y^3
,那么计算 x^3-y^3
会更方便。
您随后可以检查结果是否适合您的签名字节。
我正在使用 8086 汇编 (tasm) 我想做一个简单的程序,它采用 x^3 - y^3(x 和 y 是 db)并将答案保存到另一个 db(如果结果太大而 db 无法容纳,则打印一条消息) 这是我的代码:
mov al, x ;mov x to al for multiply
imul x; ax = al*x (=x^2)
imul x; ax = ax*x (low), dx = ax*x (high) (=x^3)
mov low_x, ax; save low x^3 (dw)
mov high_x, dx; save high x^3 (dw)
mov al, y ;mov y to al for multiply
imul y; ax = al*y (=y^2)
imul y; ax = ax*y (low), dx = ax*y (high) (=y^3)
mov low_y, ax; save low y^3 (dw)
mov high_y, dx; save high y^3 (dw)
现在呢?我怎样才能在数字之间进行分组以获得正确答案? 谢谢!
首先,请注意 imul r/m8
会产生 ax
而不是 dx:ax
的结果。如果你打算使用16位乘法,你应该确保将操作数放入16位寄存器。
至于减法,听起来你想合成一个 32 位的。这很容易通过 SUB
和 SBB
来计算进位。
因此,代码可能如下所示:
movsx cx, y
mov ax, cx
imul cx
imul cx
mov low_y, ax; save low y^3 (dw)
mov high_y, dx; save high y^3 (dw)
movsx cx, x
mov ax, cx
imul cx
imul cx
mov low_x, ax; save low x^3 (dw)
mov high_x, dx; save high x^3 (dw)
sub ax, low_y
sbb dx, high_y
请注意,我调换了顺序,因为如果您先计算 y^3
,那么计算 x^3-y^3
会更方便。
您随后可以检查结果是否适合您的签名字节。