2016-12-17 76 views
-2

说我在下面有这个汇编代码。那么printf如何知道要打印什么呢?它是否只是打印出地址上的任何东西?在这种情况下,“推消息”?程序集中的printf如何知道要打印什么?

SECTION .data 

msg: db "Hello World!",10,0 

SECTION .text 

extern printf 
global main 

main: 
    push ebp 
    move ebp, esp 

    push msg 
    call printf 

    move esp, ebp 
    pop ebp 
    ret 
+3

是的,它看起来像其他任何函数的参数。阅读ABI /调用约定来了解如何将args传递给函数。 http://stackoverflow.com/tags/x86/info –

+0

它从堆栈内存('ss:esp')中获取格式字符串地址,作为返回地址之后的下一个值,无论您如何设置内存到某个值,在'call'之前执行'push'是一种方便和普通的“正常”方式,但是我可以用'mov','sub'和'jmp'指令模拟相同的内容(不推送'或'call')。 – Ped7g

回答

0

当你push msg,你推字节的载体,其是你的变量msg堆栈的第一个字节的ADDRES。当调用printf时,它会执行并从第一个(您传递的)字节开始输出每个字节的字节,直到一个信号字符告诉它停止。该信号字符是在字符串上输入后的0