Указатель стека в сборке. ESP очки всегда пустое место или нет? - PullRequest
0 голосов
/ 04 января 2019

Изначально ESP относится к пустому пространству памяти.

Когда я нажимаю что-то, например, нажатие 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 Ответ

0 голосов
/ 04 января 2019

Раздел «Операция» в руководстве (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 документируют это.


re: part2: add esp, 12 перемещает ESP на 12 байтов или 12B / 4B = 3 «стековых слота». 1 + 3 = 4.

...