Поп или добавить 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, потому что это операция только для регистров и делает не используйте блок загрузки, поэтому ваш процессор сможет использовать блок загрузки для чего-то еще в то время.