さっきした質問と内容が若干
異なるので改めて質問させていただきます。
s
1 .text 2msg: .ascii "hello world\n" 3msgend: .equ len, msgend - msg 4 .globl _main 5_main: 6 subl $12, %esp 7 movl $len, 8(%esp) 8 movl $msg, 4(%esp) 9 movl $1, (%esp) 10 call _write 11 addl $12, %esp 12 ret
上記が元ネタのコードです。
この中の
s
1subl $12, %esp
の意味が理解できないです。
単純に考えてみると
sub命令で espレジスタの値のアドレスから12バイト分アドレスを下げる。
スタックは高位アドレスから低位アドレスへ積まれていくので
スタック領域を確保するという意味の上でならわかります。
私が考えるこのときのスタック
stack
1 esp ------------------------------ 2 | | 3 | | 4 | | 5 ebp------------------------------
これが
sub 12 espによって
stack
1 esp ---------------------------- 2 | | 3 | 12バイト分領域確保 | 4 | | 5 ------------------------------ 6 | | 7 | | 8 | | 9 ebp------------------------------
ただ、私が考えるespやスタックの概念が正しいのであれば
movl $len, 8(%esp)
このコードが矛盾していることになると思うのですが・・・
まずこれは、
今のespから8バイト後からラベルlenのアドレスに入っている値を書き込む
ということだと思うのですが
そうなると・・・
stack
1 esp ------------------------------ 2 | | 3 | | 4 | | 5 ebp------------------------------
これが
sub 12 espによって
stack
1 len 2 esp ---------------------------- 3 | | 4 | 12バイト分領域確保 | 5 | | 6 ------------------------------ 7 | | 8 | | 9 | | 10 ebp------------------------------
このようにスタック領域外に書き込まれることになると思うのですが
どこに勘違いがあるのでしょうか?
分からないので教えてください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/23 02:39