2011-11-25 105 views
0

我有以下汇编代码EAX在改变

.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 ?

回答

6

eax包含函数调用的返回值,所以当然在调用printf后其值发生变化。

更一般来说,您应该了解有关主叫保存的寄存器和被保存的寄存器。

1

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