Новый кадр в ASM
Теоретически, когда я выполняю вызов:
стек
Local variables
EBP
RET ADDRESS
Args
...
Хорошо, дело в том, почему, когда я выполняю "pop esi", я получаю RET-АДРЕС, а не EBP?
# NASM
BITS 32
section .text
global _start
_start:
call function
mov eax,0x41414141
function:
# esi get the address of "mov eax,0x41414141"
# but theorically, we should obtain the EBP value, no?
pop esi
# Exit
xor eax,eax
xor ebx,ebx
mov al,0x01
int 0x80
1 ответ
Решение
Функция, которую вы показываете, "голая", то есть она не устанавливает стековый фрейм.
Это то, что вы делаете вручную на ассемблере, если вам это нужно. Обычно это выглядит примерно так:
function:
push ebp
mov ebp, esp
...
И затем вы также должны вручную разорвать его перед возвращением, как правило,
mov esp, ebp
pop ebp
ret n
(или я мог бы использовать leave
инструкция)
Если бы у вас было это, ваша схема была бы правильной, хотя она перевернута с того, как я лично думаю об этом на платформе Intel, где стек растет в памяти.