我试图解决程序集中的问题而且我设法编写代码但是在显示结果时我得到了一个奇怪的输出。我想要添加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
答案 0 :(得分:0)
我看到了几个错误。
首先,printf()
接受ASCIIZ格式字符串(所有C字符串都是ASCIIZ,IOW,NUL终止)。但是,anothermsg
并不以零字节结束。你必须明确附加一个。
其次,将整数变量声明为16位(dw
= 16位),但是将它们从内存中取出为32位(例如mov eax, dword [variable1]
,dword
= 32位)。这可能有用,但没有多大意义。只需将整数变量声明为32位(dd
= 32位)。
第三,由于我不知道的原因(可能是因为前一个问题),你使用movzx
将32位(或16位,取决于解释它的方式)值截断为8位,这使得-11的平方的计算错误。
请参阅,您将_11存储在variable2
中:
1111111111110101 (binary)
在这2条指令之后:
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)