0
我需要在signed和unsigned约定中执行以下操作: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
我需要在signed和unsigned约定中执行以下操作: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)对于未签名的选项:
首先你需要加载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
为什么不告诉我们你的汇编程序“扔”的错误,因为我们没有看着你的肩膀!这可能是'sub dword ptr ax,y',因为ax是一个WORD大小的寄存器,而不是DWORD大小! – Gunner
是的,这是错误,我不知道如何将ax转换为双字 – user1012732