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

时间:2014-05-01 17:22:43

标签: 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
    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:我对其他解决方案不感兴趣,我只想了解为什么上面的代码有这种奇怪的行为。

0 个答案:

没有答案