Указатель стека в сборке. ESP очки всегда пустое место или нет?
Первоначально ESP относится к пустому пространству памяти.
Когда я нажимаю что-то, такое как push 1, то это относится к ячейке памяти 1 или к следующему пустому месту?
вот пример
push ebp
mov ebp, esp
/*
---------
(empty space) <- esp, ebp
---------
ebp (initially stack pointer was here)
---------
*/
Другой вопрос заключается в том, что когда я создаю пустое пространство в стеке, какая точка ESP будет указывать?
Вот пример: (каждая ячейка памяти составляет 4 байта)
/*
--------
1 <- initial esp
--------
*/
sub esp, 12
; now esp points to this one
/*
--------
4 <- esp
--------
3
--------
2
--------
1
--------
*/
; or this one
/*
--------
3 <- esp
--------
2
--------
1
--------
*/
Предположим, что числа являются адресами памяти
1 ответ
Раздел "Операция" в руководстве ( https://www.felixcloutier.com/x86/push) показывает, что push изменяет ESP перед сохранением в [ESP]
,
ESP ← ESP – 4;
Memory[SS:ESP] ← SRC;
(* push dword *)
pop
делает наоборот: загрузить из [ESP]
а затем изменить ESP.
Как и многие другие ISA (например, ARM), x86 использует "полный" стек, где указатель стека обычно указывает на последнее нажатие, а не на пустое место под ним.
Интересный факт: pop esp
после приращения перезаписывает ESP, так mov esp, [esp]
,push esp
читает значение, которое будет сохранено перед уменьшением ESP. Ручные записи Intel документируют это.
ре: часть2: add esp, 12
перемещает ESP на 12 байтов или 12B/4B = 3 "стека слотов". 1+3 = 4.