Assembly 无法解释这个简单程序的奇怪行为

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

这是我在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
其输出:

131073
2
第二个数字始终正确打印,而第一个数字永远不会正确显示(除非第二个数字为零)!似乎第二个数字与第一个数字相互干扰。事实上,当我在BSS段的两个数字之间分配一些空白字时,程序工作成功(即,只需取消对倒数第二行的注释,程序就工作了)

我的程序怎么了


PS:我对其他解决方案不感兴趣,我只想了解上面的代码为什么会有这种奇怪的行为。

将两个变量的resw更改为resd。堆栈是dword对齐的,不会变成64位(32位*2个字)整数吗?啊,好的,明白了!英特尔称“字”为16位,所以dword是32位。现在一切都清楚了。谢谢
131073
2