2017-01-20 6 views
2

スタックは上位メモリアドレスから下位メモリアドレスに成長します。次のコードは私を混乱させます行#1 espが行#3のebpレジスタにコピーされます。しかし、行番号#16のは変数がebp + 8によってアクセスされますなぜebp-8でないのか説明できますか?典型的な32ビットの呼び出し規約と、典型的なプロローグについてアセンブリ - 手順プロローグを理解するのに役立ちます

(gdb) disass main 
Dump of assembler code for function main: 
0x08048474 <main+0>: push ebp 
0x08048475 <main+1>: mov ebp,esp 
0x08048477 <main+3>: sub esp,0x8 
0x0804847a <main+6>: and esp,0xfffffff0 
0x0804847d <main+9>: mov eax,0x0 
0x08048482 <main+14>: sub esp,eax 
0x08048484 <main+16>: cmp DWORD PTR [ebp+8],0x1 
0x08048488 <main+20>: jg  0x80484ab <main+55> 
0x0804848a <main+22>: mov eax,DWORD PTR [ebp+12] 
0x0804848d <main+25>: mov eax,DWORD PTR [eax] 
0x0804848f <main+27>: mov DWORD PTR [esp+4],eax 
0x08048493 <main+31>: mov DWORD PTR [esp],0x80485e5 
0x0804849a <main+38>: call 0x804831c <[email protected]> 
0x0804849f <main+43>: mov DWORD PTR [esp],0x0 
0x080484a6 <main+50>: call 0x804833c <[email protected]> 
0x080484ab <main+55>: mov eax,DWORD PTR [ebp+12] 
0x080484ae <main+58>: add eax,0x4 
0x080484b1 <main+61>: mov eax,DWORD PTR [eax] 
0x080484b3 <main+63>: mov DWORD PTR [esp],eax 
0x080484b6 <main+66>: call 0x8048414 <function1> 
+1

これはローカル変数ではないため、スタック経由で渡される引数です。したがって、それは最初の 'esp'よりも高いアドレスにあります。 – Jester

+0

Ohhhhh関数のパラメータを忘れてしまった、ありがとう@ジェスタ – Raven

答えて

3

ebp+08h上記又はにおける値は、プロシージャのパラメータです。

ebp以下の値はローカルバールです。

ebpの値が古いフレームポインタで、ebp+04hの値が戻りアドレスです。

the calling conventionsを参照してください。 esp以下メモリへのアクセス

は(注意:espないebp)を予測不能であるが(スタックが下方に成長するので、正確)上記アドレスは正常です。
SYS V x64 ABIは、rspの下にある赤いゾーンを定義します。これはとにかくうまくいきます。

+0

ありがとう@マーガレットブルーム – Raven

関連する問題