В настоящее время я изучаю ассемблер для процессоров Intel. Поскольку стек "растет вниз", почему мы должны добавить для доступа к определенному элементу
[ebp + 8] ;; This will access the first param
Я знаю, что мы должны пропустить старое значение ebp и адрес возврата, и поэтому мы используем 8 (потому что каждый из них имеет длину 4 байта). Это довольно странно.
Также, если ebp является резервной копией для esp, каково значение ebp в основной функции. Ex:
_start:
;; what's ebp value here ?
push eax
push ebx
call someFunction ;; this will create a stack frame
+-----------+
| param1 |
+-----------+
| param0 | <--- this is [ebp + 8] ( assuming mov ebp, esp )
+-----------+
|ret_address|
+-----------+
| ebp |
+-----------+ <--- esp
И еще, когда мы выделяем память для локалов, мы должны вычесть из ebp ... Пожалуйста, дайте не однозначный ответ. Спасибо!