-1

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

编译和执行步骤:

nasm -g -f elf lab1.asm
gcc -o lab1 lab1.o
./lab

SECTION .data
message:    db  "Hello, this is Iva.", 0AH
anothermsg  db  "The sum of the numbers %d, %d and %d is %d", 0AH
len:        equ $-message
variable1:  dw  7
variable2:  dw  -11
variable3:  dw  19
SECTION .text
    extern printf
    global main
main:   

mov eax, dword [variable1]
movzx ebx, al
mov eax, ebx

imul eax
push eax



mov eax, dword [variable2]
movzx ebx,al
mov eax,ebx

imul eax
push eax

mov eax, dword [variable3]
movzx ebx,al
mov eax,ebx

imul eax
pop ebx
add eax,ebx
pop ebx
add eax,ebx

push eax

push dword [variable3]
push dword [variable2]
push dword [variable1]
push anothermsg


call printf

mov eax,1
mov ebx,0
int 80h
4

1 回答 1

0

我看到几个错误。

首先,printf()接受 ASCIIZ 格式的字符串(所有 C 字符串都是 ASCIIZ、IOW、NUL 终止的)。但是,您的anothermsg不以零字节结尾。您必须明确附加一个。

其次,您将整数变量声明为 16 位(dw= 16 位),但从内存中获取它们为 32 位(例如mov eax, dword [variable1]dword= 32 位)。这可能有效,但意义不大。只需将整数变量声明为 32 位(dd= 32 位)。

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

看,您将 -11 存储variable2为:

1111111111110101 (binary)

在这两条指令之后:

mov eax, dword [variable2]
movzx ebx,al

你得到:

eax = ????????????????1111111111110101 (??? are the memory contents right after variable2)
ebx = 00000000000000000000000011110101 (245 decimal)

然后在这两条指令之后:

mov eax,ebx
imul eax

你得到:

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,ebx
imul eax

最后:

eax = 00000000000000000000000001111001 (121 decimal)
于 2013-02-05T04:37:43.470 回答