Assembly 汇编中的加法和乘法

Assembly 汇编中的加法和乘法,assembly,x86,nasm,Assembly,X86,Nasm,我试图解决汇编中的一个问题,我成功地编写了代码,但在显示结果时,我得到了一个奇怪的输出。我想把3个数的平方相加,其中哪一个是负数。这是我的代码,这是我用来组装、链接和运行的代码。谢谢 编译和执行步骤: nasm-g-f elf lab1.asm gcc-o lab1 lab1.o /实验室 我看到了几个错误 首先,printf()。但是,您的anothermsg不会以零字节结束。您必须显式地附加一个 第二,您将整数变量声明为16位(dw=16位),但从内存中获取它们时是32位的(例如mov-ea

我试图解决汇编中的一个问题,我成功地编写了代码,但在显示结果时,我得到了一个奇怪的输出。我想把3个数的平方相加,其中哪一个是负数。这是我的代码,这是我用来组装、链接和运行的代码。谢谢

编译和执行步骤:

nasm-g-f elf lab1.asm
gcc-o lab1 lab1.o
/实验室


我看到了几个错误

首先,
printf()。但是,您的
anothermsg
不会以零字节结束。您必须显式地附加一个

第二,您将整数变量声明为16位(
dw
=16位),但从内存中获取它们时是32位的(例如
mov-eax,dword[variable1]
dword
=32位)。这可能有效,但毫无意义。只需将整数变量声明为32位(
dd
=32位)

第三,由于我不知道的原因(可能是因为前面的问题),您使用
movzx
将32位(或16位,取决于如何解释)值截断为8位,这使得-11的平方计算错误

请参见,将-11存储在
variable2
中,如下所示:

1111111111110101 (binary)
在这两个说明之后:

mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx
imul eax
mov eax,ebx
imul eax
你会得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 00000000000000000000000011110101 (245 decimal)
eax = 00000000000000001110101001111001 (60025 decimal)
然后在这两个说明之后:

mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx
imul eax
mov eax,ebx
imul eax
你会得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 00000000000000000000000011110101 (245 decimal)
eax = 00000000000000001110101001111001 (60025 decimal)
如果您使用
movsx ebx,al
而不是
movzx ebx,al
,您将得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 11111111111111111111111111110101 (-11 decimal)
然后在这两个说明之后:

mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx
imul eax
mov eax,ebx
imul eax
最后:

eax = 00000000000000000000000001111001 (121 decimal)

你的问题是什么?如果你只是在寻找反馈,你可以使用我没有得到我想得到的输出,我得到的是完全不同的数字如果你发布了你得到的输出,你可能会得到一些答案。逐行检查代码,检查寄存器、内存和堆栈中的值。在某些情况下,它们将不包含您期望的值。这就是错误所在。学习使用调试程序gdb。