2012-02-24 30 views
0

次のコードをするのかどう...x86アセンブリコードの基本的な

0x080489b0 <+0>: push %ebp 
    0x080489b1 <+1>: mov %esp,%ebp 
    0x080489b3 <+3>: sub $0x14,%esp 
    0x080489b6 <+6>: push %ebx 

これは最初の2行にスタックを設定し、その後増加し、本質的にESPダウン14%をプッシュ最後に%ebxをスタックにプッシュします(空でも)。これはスタックを増やし、%espをもう1つ下に押し込みます。

私はこれらのステップで間違っていますか?助けてくれてありがとう!

答えて

1

大体正しいです。 3番目の命令(sub $ 0x14、%esp)は実際には、アライメント上の理由から0x14 = 20バイトでスタックを拡張することを意味します。 4行目は、%ebxの4バイトの内容をスタックにプッシュし、%espから4を副作用として差し引くことを意味します。これは、%ebxが呼び出し先保存レジスタであるためです。関数が%ebxの内容を変更した場合は、%ebxをスタックにプッシュしてから%ebxを変更し、%ebxをスタックからポップすることが期待されます呼び出し元が%ebxの変更に気づかないことを示します。 x86上の他のcallee-saveレジスタは%esiと%ediです。

+0

さて、0x14が16進数であることを忘れてしまったので、スタックを20バイト増加させます。私はスタックが成長していると思っていましたが、何が助けになるか見当がつかないので、それほど確かではありませんでした。 – yiati

1

sub $0x14, %espはスタックポインタから16進数0x14(10進数20)を減算します。これは5 dwordで使用されるスペースに相当します。

+0

ああ私は常に16進数をPに変換することを忘れています:Pスタックはこれから5 dwordだけ拡大します。ありがとう! – yiati

+0

5 "ローカル" dwordsまたは20バイト文字列を保持する "ローカル"変数のためのスペースを設定できます。 – Gunner