EAX меняется при доступе - PullRequest
0 голосов
/ 26 ноября 2011

У меня следующий код сборки

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

6 голосов
/ 26 ноября 2011

eax содержит возвращаемое значение вызова функции, поэтому, конечно, после вызова printf его значение изменяется.

В общем, вы должны узнать о регистрах, сохраненных вызывающей стороной, и регистрах, сохраненных вызываемой стороной.

1 голос
/ 26 ноября 2011

Printf возвращает длину выходной строки в формате eax, поэтому вы видите 12 при каждом втором запуске.И нет, вызов сложной функции не гарантирует, что все регистры не будут затронуты.

...