Когда происходит call
, я понимаю, что адрес вызывающей стороны помещается в стек, а когда выполняется ret
, он переходит на извлеченное значение из стека.
Что произойдет, если я наберу sh значение и забуду его вставить? Не будет ли ret
просто pop
, что это будет адрес возврата из стека, и будет ли он ошибочно принят любым значением, которое на самом деле находится на вершине стека? Например:
Function:
mov ax, "A"
push ax
ret
call Function
Кроме того, мне интересно то же самое о pusha
и popa
. Если I push
значение после pusha
, то теперь popa
использует это значение, когда оно выталкивает столько регистров, сколько использует, оставляя оригинальный первый регистр в стеке и восстанавливая каждый регистр в значение регистра + 1?