過去の質問とは別に重ねて質問させて頂きます。
ちょっとわからないことが多すぎるので3つに分けて質問させて頂きます。
下記のC言語を逆アセンブルしてアセンブラを見てみました。
c言語
int main(){ printf("helloWorld\n"); printf("Tata");
逆アセンブル結果
sub rsp, 28h lea rcx, aHelloworld ; "helloWorld\n" call sub_140001090 lea rcx, aTata ; "tata" call sub_140001090 xor eax, eax add rsp, 28h retn endp
サブルーチン sub_140001090
.text:0000000140001040 sub_140001040 proc near ; CODE XREF: sub_140001090+3C↓p .text:0000000140001040 ; DATA XREF: .pdata:000000014001E00C↓o .text:0000000140001040 .text:0000000140001040 var_18 = qword ptr -18h .text:0000000140001040 arg_0 = qword ptr 8 .text:0000000140001040 arg_8 = qword ptr 10h .text:0000000140001040 arg_10 = qword ptr 18h .text:0000000140001040 arg_18 = qword ptr 20h .text:0000000140001040 .text:0000000140001040 mov [rsp+arg_18], r9 .text:0000000140001045 mov [rsp+arg_10], r8 .text:000000014000104A mov [rsp+arg_8], rdx .text:000000014000104F mov [rsp+arg_0], rcx .text:0000000140001054 sub rsp, 38h .text:0000000140001058 call sub_140001030 .text:000000014000105D mov rcx, [rsp+38h+arg_18] .text:0000000140001062 mov [rsp+38h+var_18], rcx .text:0000000140001067 mov r9, [rsp+38h+arg_10] .text:000000014000106C mov r8, [rsp+38h+arg_8] .text:0000000140001071 mov rdx, [rsp+38h+arg_0] .text:0000000140001076 mov rcx, [rax] .text:0000000140001079 call sub_140004188 .text:000000014000107E add rsp, 38h .text:0000000140001082 retn .text:0000000140001082 sub_140001040 endp
①何のために最初にsub命令で、最終的にaddをしているか。
調べたところによると変数などの領域を確保するとありますが、どうして領域が確保されるかわかりません。
最終的addをするのであれば領域は変わらないのでは。
rspの領域を確保するというイメージができていませんので
②サブルーチン(sub_140001090)で一度arg_0という変数に8バイトアラインされた値を格納し、順番にアドレスにして言ってますが、イメージ的には下の図のような感じでよろしいでしょうか?
1マスが8バイトで下に行けば行くほどアドレス値は大きくなります。
③サブルーチン(sub_140001090)内でr8,r9,rdx,rcxが使われているのは何故でしょう。
これもコンパイラがそう決めているからということなのでしょうか?
独学でやっているので初心者すぎる質問かもしれないですがご回答をどうかよろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。