34

このコードを考えると:

       swap:

            push ebp ; back up the base pointer,
            mov ebp, esp
            ; push the context of the registers on the stack

            push eax
            push ebx
            push ecx
            push edx

            mov eax, [ebp+8] ; address of the first parameter
            mov ebx, [ebp+12] ; address of the second parameter
            mov dl, [eax]
            mov cl, [ebx]

            mov [eax], cl

            mov [ebx], dl

            ; restore the context of the registers from the stack

            pop edx
            pop ecx  
            pop ebx
            pop eax
            ; restore the ebp
            pop ebp
            ret

(これは単なるメソッドです。以前は、最初と 2 番目のパラメーターをスタックにプッシュしていました。)

私の質問は、最初のパラメーターのアドレスを取得するためにベースポインターに 8 を追加し、次に 12 を取得するのはなぜですか?

それらはdwordであるため、それぞれが4バイトであるという事実がわかりました..したがって、ebp + 8からebp + 12までは意味があります。しかし、なぜ最初のものは ebp + 8 なのですか? ESP がスタックの TOP を指す場合、mov ebp, esp は、EBP がスタックの TOP を指すことを意味するためです。次に、スタックに 4 つの値をプッシュします: eax、ebx、ecx、および edx。EBP + 8 が最初のパラメーターを指しているのはなぜですか?

4

2 に答える 2

51

関数が呼び出されると、スタックは次のようになります。

+-------------+
| Parameter 2 |
+-------------+
| Parameter 1 |
+-------------+
| Return Addr |  <-- esp
+-------------+    

「スタックフレーム」が設定された後:

+-------------+
| Parameter 2 | <-- [ebp + 12]
+-------------+
| Parameter 1 | <-- [ebp + 8]
+-------------+
| Return Addr |  
+-------------+    
| saved ebp   | <-- ebp
+-------------+ <-- esp

これでコンテキストが保存されました:

+-------------+
| Parameter 2 | <-- [ebp + 12]
+-------------+
| Parameter 1 | <-- [ebp + 8]
+-------------+
| Return Addr |  
+-------------+    
| saved ebp   | <-- ebp
+-------------+ 
| saved eax   |  
+-------------+    
| saved ebx   |  
+-------------+    
| saved ecx   |  
+-------------+    
| saved edx   | <-- esp
+-------------+    

多くのシステムではスタックが下に向かって成長することを忘れないでください (これは x86 ファミリにも当てはまります)。そのため、スタックの一番上に最小のメモリ アドレスが割り当てられます。

于 2012-04-22T01:41:29.210 に答える
7

スタックには他に 2 つの項目があるためです。このルーチンの開始時にプッシュする前の ebp と、ルーチンの呼び出しによってスタックに置かれる戻りアドレスです。

于 2012-04-22T01:41:54.067 に答える