Сейчас я изучаю язык ассемблера высокого уровня и изучаю концепцию стека. Я думаю, что понимаю это достаточно хорошо, однако на практике у меня есть несколько вопросов.
Стек увеличивается, причем регистр ESP всегда указывает на вершину стека ... адрес в низком объеме памяти. Если что-то помещено в стек, ESP следует уменьшить.
EBP используется в качестве указателя кадра и, насколько я понимаю, всегда должен быть больше, чем ESP.
Еще со следующей программой:
stdout.put(esp, nl);
stdout.put(ebp, nl);
push(ike);
stdout.put(esp, nl);
stdout.put(ebp, nl);
push(ike);
stdout.put(esp, nl);
stdout.put(ebp, nl);
pop(eax);
pop(eax);
pop(eax);
pop(eax);
stdout.put(esp, nl);
stdout.put(ebp, nl);
Кажется, это не так. Глядя на вывод:
0018FF6C
0018FF70
0018FF68
0018FF70
0018FF64
0018FF70
0018FF74
0018FF70
EBP всегда одинаков, ESP уменьшается на 4 байта для первого нажатия, затем еще на 4 байта для второго нажатия.
Именно после этого я запутался. После моих первых двух всплывающих окон ESP должен вернуться к тому, с чего все началось. Как я могу сделать еще два всплывающих окна, если я ничего не положил в стек? Что я выскакиваю?
Дальнейшее выталкивание и распечатка из EAX показывает некоторые цифры, а затем 0 и затем дополнительные цифры. Итак, я определенно что-то попсовал ... но что? К какой части памяти моей программы она принадлежит и почему ничего не влияет?
Почему EBP вообще не затрагивается?
Кроме того, почему ESP уменьшается на 4 байта, а не на 8?
Если бы кто-то мог помочь мне понять это, я был бы очень признателен.