X86 汇编语言中的双字运算

X86 汇编语言中的双字运算,x86,unsigned,cpu-architecture,signed,x86-16,X86,Unsigned,Cpu Architecture,Signed,X86 16,我需要在有符号和无符号约定中执行以下操作:x*x-y+2,其中x是字节,y是双字。 以下是我迄今为止使用未签名约定所做的尝试,但似乎我写了一些错误,因为它抛出了一个错误。错在哪里? mov-al,x mov-ah,0 mul x mov-dx,0 子dword ptr ax,y 加上斧头,2 1)对于未签名选项: 首先,您需要将x加载到寄存器中以使其平方: mov eax,0 mov al, x mul al 实际上是这样的:AX=x*x,AX是字大小,因为EAX的上半部分都是零,那么

我需要在有符号和无符号约定中执行以下操作:x*x-y+2,其中x是字节,y是双字。 以下是我迄今为止使用未签名约定所做的尝试,但似乎我写了一些错误,因为它抛出了一个错误。错在哪里?

mov-al,x
mov-ah,0
mul x
mov-dx,0
子dword ptr ax,y
加上斧头,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

你为什么不告诉我们你的汇编程序“抛出”的错误,因为我们没有回头看你!!!它可能是
子dword ptr ax,y
,因为ax是一个字大小的寄存器,而不是dword大小的寄存器!是的,这就是错误所在,我不知道如何将ax转换为dword