Поп или добавить esp, 4? В чем разница?
Я видел этот вопрос, но я не нашел в нем своего ответа.
Итак, почему я предпочитаю использовать add esp, 4
или add esp, 8
вместо того, чтобы использовать pop
один или два раза? Есть ли какая-либо разница (производительность, безопасность и т.д.) Вообще или это вопрос личного выбора?
Ответы
Ответ 1
pop
тоже add esp, 4
, он просто сохраняет все, что есть в верхней части стека в его операнде раньше. Если вам нужно то, что в стеке, возможно, pop
быстрее, чем mov wherever, [esp]; add esp, 4
, но если вам просто нужно очистить стек add esp, 4
, все будет в порядке.
Ответ 2
Как правило, инструкция pop
не эквивалентна add esp, N
.
pop
используется для удаления данных из стека и сохранения их в каком-либо регистре; он также агностик, в какое направление стек растет, хотя это обычно не проблема.
Вручное добавление или вычитание из указателя стека esp
не сохраняет удаленные данные в регистре. Скорее всего, это будет более эффективно, если вам не нужно ничего делать с удалением данных из стека.
Ответ 3
pop
загружает данные из памяти (стек - указывается ss: [esp]) в регистр, т.е. использует процессорную нагрузку, а add esp
не использует блок загрузки. Процессоры с Pentium Pro делают Исполнение вне порядка
т.е. выполнять как можно больше инструкций в цикле, поскольку у него есть внутренние ворота (единицы), доступные, если эти инструкции могут выполняться одновременно и, при необходимости, повторно упорядочивает порядок инструкций, чтобы полностью использовать единицы.
Поскольку большинство процессоров имеют только два блока нагрузки, если вам не нужны данные из стека (т.е. вы хотите просто пропустить данные), лучше add esp
, потому что это операция только для регистров и делает не используйте блок загрузки, поэтому ваш процессор сможет использовать блок загрузки для чего-то еще в то время.