2011-11-25 99 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次運行。而且,不,調用一個複雜的函數並不能保證所有的寄存器都不受影響。