为什么省略printf打印垃圾的参数?

Son*_*ell 1 c x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么?是否有一个设置的内存地址printf使用期望找到一个参数?为什么没有任何参数被打印出来?

小智 6

原因是格式说明符告诉printf它应该收到多少个参数.Printf从堆栈中获取数据; 如果你没有为它提供任何数据,那么它将把所有发生在堆栈上的东西拉出来并视为一个参数.