我需要在有符号和无符号约定中执行以下操作:x*x-y+2,其中 x 是一个字节和 ya 双字。到目前为止,这是我使用无符号约定尝试过的内容,但似乎我写错了,因为它引发了错误。错误是什么?
mov al, x
mov ah, 0
mul x
mov dx, 0
sub dword ptr ax, y
add ax, 2
问问题
3678 次
1 回答
1
1) 对于无符号选项:
首先,您需要将 x 加载到寄存器中以对其进行平方:
mov eax,0
mov al, x
mul al
这基本上是这样做的:AX = x*x,并且 AX 是字长,因为 EAX 的上半部分全为零,那么本质上 EAX = x*x,并且 EAX 已经是双字长。现在我们需要减去 y 并添加 2:
mov ebx, y
sub eax, ebx
add eax, 2
你有它!答案在 EAX 内部。
2) 对于签名选项:
我们基本上会这样做,但是这次我们将使用 CWDE 指令,它将 AX 中的值扩展为 EAX,同时保持符号信息正确,因此:
mov al, x
imul ax
cwde
mov ebx, y
sub eax, ebx
add eax, 2
于 2013-11-05T17:18:36.527 回答