2016-12-17 15 views
-2

以下のアセンブリコードがあります。だから、printfが何を印刷するのかを知っているのと同じように?それはちょうど常に上にプッシュされているアドレスにあるものを印刷しますか?この場合、 "push msg"?アセンブリの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

はい、他の関数と同様にargsを調べます。どのようにargが関数に渡されるかは、ABI /呼び出し規約を参照してください。 //stackoverflow.com/tags/x86/info –

+0

スタックメモリ( 'ss:esp')から書式文字列アドレスを取ります。戻りアドレスの次の値として、それをどのように設定するかは関係ありません'call'の前に' push 'を実行するのは便利で一般的な "普通の"方法ですが、私は 'mov'、' sub'、 'jmp'命令で同じことをシミュレートすることができます(' push 'または' call')を呼び出します。 – Ped7g

答えて

0

あなたpush msg、あなたがスタックにあなたの変数msgあるバイトのベクトルの最初のバイトのADDRESをプッシュしています。 printfが呼び出されると、最初に渡されたもの(1つは渡したもの)から、停止するように指示するシグナル文字まで、バイトごとのバイトであるベクトルが実行され、出力されます。その信号文字は、文字列のEnterの後に0です。

関連する問題