EAX在被访问时发生变化

Son*_*ell 0 x86 assembly masm

我有以下汇编代码

    .386
    .model flat, c
    .stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
scanf PROTO arg2:Ptr Byte, printlist:VARARG
    .data
in1fmt byte "%d",0
msg2fmt byte 0Ah,"%s%d",0
msg3 byte "EAX is : ",0
number sdword 10
    .code
main proc
    mov eax, 90
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    mov eax, number
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    sub eax, 1
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    INVOKE printf, ADDR msg2fmt, ADDR msg3, eax
    ret
main endp
    end
Run Code Online (Sandbox Code Playgroud)

由于某种原因,EAX的输出不断变化,而不是预期的.

我期望的输出:

EAX is : 90
EAX is : 90
EAX is : 10
EAX is : 10
EAX is : 9
EAX is : 9
Run Code Online (Sandbox Code Playgroud)

我得到的输出:

EAX is : 90
EAX is : 12
EAX is : 10
EAX is : 12
EAX is : 11
EAX is : 12
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果为eax分配了一个值,它应该是相对安全的,直到其他东西使用eax?

nin*_*alj 6

eax包含函数调用的返回值,因此当然在调用printf其值后更改.

更一般地说,您应该了解调用者保存的寄存器与被调用者保存的寄存器.