汇编语言中的双字操作

时间:2013-11-04 23:30:34

标签: x86 unsigned cpu-architecture signed x86-16

我需要在有符号和无符号约定中执行以下操作:x * x-y + 2,其中x是字节,y是双字。 这是我到目前为止尝试使用无符号约定,但似乎我写错了,因为它抛出了一个错误。这是什么错误?
mov al, x
mov ah, 0
mul x
mov dx, 0
sub dword ptr ax, y
add ax, 2

1 个答案:

答案 0 :(得分: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