次のようなコードがあります。
#include<stdio.h>
main()
{
xxx(1234);
}
int xxx(int b)
{
int c;
c=b;
return c;
}
xxx(1234);
私は gdb を使用して、ESP レジスタの値と、行にブレークポイントを作成することによってどのように機能するかを示しますc=b;
。
プログラムを実行し、最初のブレークポイントで停止し、 と を使用i r esp
しx/x $esp
ます。esp が 0xbbbbefff などを指しており、このアドレスには 0xbb33bb33 などのその他の値が含まれていることを示しています。2 番目のブレークポイントに進みます。上記の 2 つのコマンドを繰り返して、アドレス 0xbbbbefff の値を調べると、0x000004d2 (10 進数で 1234) が表示されます。
ESP がスタックの先頭を指していることはわかっています。値をスタックにプッシュすると、下位アドレスに移動し、そのアドレスのメモリに値が格納されます。たとえば、最初のブレークポイントで ESP がアドレス 0xbbbbefff を指している場合、2 番目のブレークポイントで ESP は 0xbbbbefff-4=0xbbbbeffa のような場所を指し、0x000004d2 を含み、0xbbbbefff のメモリにはまだ 0xbb33bb33 が含まれている必要があります。しかし、gdb で 0x000004d2 値が 0xbbbbefff (xxx 関数を呼び出す前の前のトップ スタック) に含まれていることがわかりました。
スタックについて間違って理解していますか?