Assembly 无法解释这个简单程序的奇怪行为
这是我在NASM汇编中编写的第一个程序。下面的代码从stdin读取两个32位整数,并使用C库将它们打印到stdout。这是一种回声Assembly 无法解释这个简单程序的奇怪行为,assembly,x86,nasm,Assembly,X86,Nasm,这是我在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
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
其输出:
131073
2
第二个数字始终正确打印,而第一个数字永远不会正确显示(除非第二个数字为零)!似乎第二个数字与第一个数字相互干扰。事实上,当我在BSS段的两个数字之间分配一些空白字时,程序工作成功(即,只需取消对倒数第二行的注释,程序就工作了)
我的程序怎么了
PS:我对其他解决方案不感兴趣,我只想了解上面的代码为什么会有这种奇怪的行为。将两个变量的resw更改为resd。堆栈是dword对齐的,不会变成64位(32位*2个字)整数吗?啊,好的,明白了!英特尔称“字”为16位,所以dword是32位。现在一切都清楚了。谢谢
131073
2