2011-12-15 18 views
-1

X-86またはIA32アセンブリ言語についての質問があります(実際には、同じテキストブックに置き換えて使用しているようですが)。以下のコードがあります。次の操作アセンブリ言語+レジスタ間の移動値

%ebpの現在の値(スタックアドレス)をレジスタに追加して0x20を追加し、その結果を現在の値%ebpに格納します。これは私が基本的には、GDBを使った実際の計算では%ebp + 0x20です前のスタックフレームのフレームポインタを計算しているコードです。誰でも私が逃していることを教えてもらえますか?私は「スタックアドレス」を言うとき

movl %ebp, %edx //move the "stack address" of %ebp into the register 
addl $0x20, %edx // add 0x20 to the value in %edx which is actually the address of the stack of %ebp 
movl %edx, (%ebp) //overwrite the contents of %ebp with our calculated values from the previous 2 steps 

はまた、私は %espスタックポインタを意味するものではありません。スタックに格納されている値の代わりにその場所のメモリアドレスを意味します(意味がある場合)。

+0

スタックアドレスは '%esp'にありますstachポインタではない'%ebp'ベースポインタ –

+0

正しいと思われます。どのような問題が発生していますか? – BlackBear

+0

基本的に私のプログラムはちょうどsegfaultsです計算は私のコードがそれを行うと思うように実行されていないという事実のために仮定しています – cpowel2

答えて

1
movl %ebp, %edx 
addl $0x20, %edx 
movl %edx, (%ebp) 

最初の行は、あなたがそのスタックアドレスと述べ、EDXにEBPの32ビット値を移動させ、そうではありませんが、それはすることができ、意味、EBPは、あなたが入れた場合にのみ、スタックのアドレスを指すことができますそれにESPの値、

第二行はEDXには0x20、及びEDXを追加し、よりように、合計で上書きされEDX = EDX

3行目は、前の行からの和を、移動させるCに+の0x20 EBPで指し示された32ビットのメモリアドレス。つまり、EBPが指し示すメモリ位置のどの値であれ、EDXの32ビット値で上書きされます。そうです。

関連する問題