2013-11-04 250 views
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
汇编语言中的双字操作

+0

为什么不告诉我们你的汇编程序“扔”的错误,因为我们没有看着你的肩膀!这可能是'sub dword ptr ax,y',因为ax是一个WORD大小的寄存器,而不是DWORD大小! – Gunner

+0

是的,这是错误,我不知道如何将ax转换为双字 – user1012732

回答

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