Новый кадр в 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, где стек растет в памяти.

Другие вопросы по тегам