我有以下汇编代码
.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?
答案 0 :(得分:6)
eax
包含函数调用的返回值,因此在调用printf
后其值会发生变化。
更一般地说,您应该了解调用者保存的寄存器与被调用者保存的寄存器。
答案 1 :(得分:1)
Printf在eax中返回输出字符串的长度,这就是为什么每隔一秒运行12次。并且,不,调用复杂函数不能保证所有寄存器都不受影响。