Указатель стека в сборке. 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.

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