質問: 1; return 0; } ``` これをコンパイルし、逆アセンブルしたものがこちらです。 ``` simple: file format mach-o-x86-64 Disassembly of section .text: 0000000100000f9e <_main>: 100000f9e: 55 push rbp 100000f9f: 48 89 e5 mov rbp,rsp 100000fa2: c7 45 fc 01 00 00 00 mov DWORD PTR [rbp-0x4],0x1 100000fa9: b8 00 00 00 00 mov eax,0x0 100000fae: 5d pop rbp 100000faf: c3 ret ``` ### Q1. 逆アセンブルしたソースに出現する" mov eax,0x0"の意味 それまではrbpやrspしかレジスタが登場していないにも関わらず、突如eaxを0に代入する部分の意味があまりよく分かりませんでした。 Cのソースで0が登場しているのは"return 0"の部分ですが、eaxに関連があるのか分かりませんでした。 ### Q2. DWORD PTR[rbp-0x4]について(※勘違いでした) ~~(元の質問)初歩的な質問になりますが、push rbs, mov rbs, rspが終わった後に出現するDWORD PTRrbp-xは、スタックフレームを確保するためにxバイトだけメモリを確保する(スタックを下位アドレスにむけて伸ばす)と解釈してよろしいのでしょうか。~~ (自己解決) DWORD PTR[rbs-x]は、rbsのアドレスからxバイト、下位アドレスの方に向かったところにあるメモリのアドレスに値を入れる、ということでした。 私の質問内容を実現しているのは、 mov rbp, rsp sub rsp, 0x10 のようにrspを操作してスタックフレームを確保する技術のようです。 独学なので、初歩的な質問ですが、よろしくお願いいたします。
回答: 1. 標準的な呼び出し規約では`eax`や`rax`を用いて関数の戻り値を受け渡しします 2. 伸ばすというよりは用意した(された)領域を`i`として`i = 1`を実行しています ~~さらに言うならば上位アドレスへ伸びてますね~~ よく考えたら上位下位ってどっちがどっちだか決まってない気がしてきましたorz