这是我在NASM程序集中编写的第一个程序。以下代码从stdin读取两个32位整数,并使用C库将它们打印到stdout。这是一种回声。
global main
extern scanf
extern printf
segment .text
main:
; read first number
push numa
push in_f
call scanf
add esp, 8
; read second number
push numb
push in_f
call scanf
add esp, 8
; move numbers to registers
mov eax, [numa]
mov ebx, [numb]
; print first number
push eax
push out_f
call printf
add esp, 8
; print second number
push ebx
push out_f
call printf
add esp, 8
; exit
mov ebx, 0
mov eax, 1
int 0x80
segment .rodata
in_f: db '%d', 0
out_f: db '%d', 10, 0
segment .bss
numa: resw 1
; discard: resw 1 <- uncomment to make this code work!
numb: resw 1
然而它并不起作用。这是一个示例输入:
1
2
及其输出:
131073
2
第二个数字始终正确打印,而第一个数字永远不会正确显示(除非第二个数字为零)!似乎第二个数字干扰了第一个数字。实际上,当我在BSS段中的两个数字之间分配一些空格的单词时,程序成功运行(即只是取消注释倒数第二行并且程序正常工作)。
我的计划有什么问题?
PS:我对其他解决方案不感兴趣,我只想了解为什么上面的代码有这种奇怪的行为。