"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
инструкции.
Ответы
Ответ 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