Подтвердить что ты не робот

"enter" vs "push ebp; mov ebp, esp; sub esp, imm" и "leave" vs "mov esp, ebp; pop ebp"

В чем разница между enter и

push ebp
mov  ebp, esp
sub  esp, imm

инструкции? Есть ли разница в производительности? Если да, то что быстрее и почему компиляторы всегда используют последнее?

Аналогично с leave и

mov  esp, ebp
pop  ebp

инструкции.

4b9b3361

Ответ 1

Существует разница в производительности, особенно для enter. На современных процессорах это декодирует до примерно 10-20 мкп, тогда как три последовательности команд составляют от 4 до 6, в зависимости от архитектуры. Подробнее см. таблицы инструкций Agner Fog.

Кроме того, команда enter обычно имеет довольно высокую задержку, например 8 тактов на ядре2, по сравнению с цепочкой зависимостей 3 тактовых последовательности из трех команд.

Кроме того, три команды могут быть распределены компилятором для целей планирования, в зависимости от окружающего кода, чтобы обеспечить более параллельное выполнение инструкций.

Ответ 2

Нет никакого реального преимущества по скорости, используя любой из них, хотя длинный метод, вероятно, будет работать лучше из-за того, что в наши дни CPU более "оптимизирован" для более простых более простых инструкций, которые более универсальны в использовании (плюс это позволяет насыщать портов выполнения, если вам повезет).

Преимущество LEAVE (которое все еще используется, просто увидеть DLL файлы Windows) заключается в том, что он меньше, чем ручная срывание кадра стека, это очень помогает, когда ваше пространство ограничено.

Инструкции Intel по эксплуатации (тома 2A, если быть точным) будут содержать более подробные подробные инструкции, поэтому Руководства по оптимизации Dr Agner Fogs

Ответ 3

При проектировании 80286 разработчики Intel решили добавить две инструкции для поддержки дисплеев.

Здесь микрокод внутри CPU:

; ENTER Locals, LexLevel

push    bp              ;Save dynamic link.
mov     tempreg, sp     ;Save for later.
cmp     LexLevel, 0     ;Done if this is lex level zero.
je      Lex0

lp:
dec     LexLevel
jz      Done            ;Quit if at last lex level.
sub     bp, 2           ;Index into display in prev act rec
push    [bp]            ; and push each element there.
jmp     lp              ;Repeat for each entry.

Done:
push    tempreg         ;Add entry for current lex level.

Lex0:
mov     bp, tempreg     ;Ptr to current act rec.
sub     sp, Locals      ;Allocate local storage

Альтернативой ENTER будет:

; введите n, 0; 14 циклов на 486

push    bp              ;1 cycle on the 486
sub     sp, n           ;1 cycle on the 486

; введите n, 1; 17 циклов на 486

push    bp              ;1 cycle on the 486
push    [bp-2]          ;4 cycles on the 486
mov     bp, sp          ;1 cycle on the 486
add     bp, 2           ;1 cycle on the 486
sub     sp, n           ;1 cycle on the 486

; введите n, 3; 23 цикла на 486

push    bp              ;1 cycle on the 486
push    [bp-2]          ;4 cycles on the 486
push    [bp-4]          ;4 cycles on the 486
push    [bp-6]          ;4 cycles on the 486
mov     bp, sp          ;1 cycle on the 486
add     bp, 6           ;1 cycle on the 486
sub     sp, n           ;1 cycle on the 486

ЭСТ. Длинный путь может увеличить размер вашего файла, но быстрее.

в последней заметке программист больше не использует дисплей, так как это была очень медленная работа, что делает ENTER довольно бесполезным сейчас.

Источник: https://courses.engr.illinois.edu/ece390/books/artofasm/CH12/CH12-3.html