Я отлаживаю функцию, чтобы узнать больше о структуре стека в памяти. Я использую GDB на ОС Ubuntu x86. Моя функция состоит из следующего:
function func(){
long local1=0;
printf("address of swap is %p\n",&local1);
}
В GDB я устанавливаю точку останова внутри функции и распечатываю значения кадра, используя info frame
. Я могу получить адрес сохраненных регистров ebp и eip, который, как я предполагаю, содержит сохраненный базовый указатель и адрес возврата соответственно. Я также распечатываю адрес local1. Поэтому, используя эти адреса, я создал следующий стек:
bffff03c --> eip (stores the return address)
bffff038 --> ebp (saved base pointer)
bffff02c --> local1 address
Теперь я должен что-то упустить, потому что между ebp и local1 существует 8-байтный разрыв. Я предположил, что тип данных local1 составляет 4 байта, что оставляет адрес между bffff030 -> bffff038
неучтенным. Был бы очень признателен за помощь с этим.
EDIT
вот код сборки. единственная аномалия, о которой я мог подумать, это инструкция SUB
, следующая за mov esp,ebp
, хотя я не уверен, как она связана с пропуском.