我正在尝试在程序集中执行 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 位的。这很容易通过 SUBSBB 来计算进位。

因此,代码可能如下所示:

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 会更方便。

您随后可以检查结果是否适合您的签名字节。