"введите" против "push ebp; mov ebp, esp; sub esp, imm" и "оставьте" против "mov esp, ebp; pop ebp" - PullRequest
40 голосов
/ 11 мая 2011

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

push ebp
mov  ebp, esp
sub  esp, imm

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

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

mov  esp, ebp
pop  ebp

инструкция.

Ответы [ 3 ]

36 голосов
/ 11 мая 2011

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

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

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

3 голосов
/ 02 мая 2014

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

Вот микрокод внутри процессора:

; 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

3 голосов
/ 11 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...