EAX在被访问时发生变化

时间:2011-11-25 21:06:18

标签: assembly x86 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

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

我期望的输出:

EAX is : 90
EAX is : 90
EAX is : 10
EAX is : 10
EAX is : 9
EAX is : 9

我得到的输出:

EAX is : 90
EAX is : 12
EAX is : 10
EAX is : 12
EAX is : 11
EAX is : 12

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

2 个答案:

答案 0 :(得分:6)

eax包含函数调用的返回值,因此在调用printf后其值会发生变化。

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

答案 1 :(得分:1)

Printf在eax中返回输出字符串的长度,这就是为什么每隔一秒运行12次。并且,不,调用复杂函数不能保证所有寄存器都不受影响。

相关问题