2016-12-17 74 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