EAX는

2011-11-25 2 views
0

은 내가 예상하지 EAX의 출력이 지속적으로 변경 몇 가지 이유를 들어 다음과 같은 어셈블리 코드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 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 회 실행됩니다. 그리고 복잡한 함수를 호출한다고해서 모든 레지스터가 변경되지 않는다고 보장 할 수는 없습니다.