0

我需要在有符号和无符号约定中执行以下操作: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

4

1 回答 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 回答