我通过汇编代码使用printf。我注意到在下面的例子中,如果我省略了期望的参数,垃圾被打印。为什么省略printf打印垃圾的参数?
.386
.model flat, c
.stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
.data
msg3fmt byte 0Ah,"%s",0Ah,"test output",0Ah,0
.code
main proc
INVOKE printf, ADDR msg3fmt
ret
main endp
end
我的问题是为什么?有没有一个设置的内存地址printf使用期望找到一个参数?为什么打印任何东西,因为没有参数通过?
我在问为什么背后发生了什么,而不是一般的答案,行为是未定义的。 –
@Sonny这是关于未定义行为的事情。 '为什么'是未定义的。这是......未定义的行为。你看到的行为可能有一个可能的原因“堆栈中找不到参数”,但在ARM上,前几个可变参数是在寄存器中,所以答案是错误的。你可以想出各种有效的可变参数和C调用约定。所以唯一清晰,简洁的说法是,它调用未定义的行为。 –
@詹姆斯,但我问为什么发生了什么事情。说许多场景是可能的并且解释特定场景的原因是有区别的。 –