files - macro assembly
"Enter" versus "push ebp; mov ebp, esp; sub esp, imm "y" dejar "frente a" mov esp, ebp; pop ebp " (3)
Al diseñar el 80286, los diseñadores de CPU de Intel decidieron agregar dos instrucciones para ayudar a mantener las pantallas.
Aquí el código micro dentro de la 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
La alternativa a ENTER sería:
; ingrese n, 0; 14 ciclos en el 486
push bp ;1 cycle on the 486
sub sp, n ;1 cycle on the 486
; ingrese n, 1; 17 ciclos en el 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
; ingrese n, 3; 23 ciclos en el 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
Ect. El largo camino puede aumentar el tamaño de tu archivo, pero es mucho más rápido.
en la última nota, el programador ya no usa la pantalla ya que fue un trabajo muy lento, lo que hace que ENTRAR sea bastante inútil ahora.
Fuente: https://courses.engr.illinois.edu/ece390/books/artofasm/CH12/CH12-3.html
¿Cuál es la diferencia entre la enter
y
push ebp
mov ebp, esp
sub esp, imm
¿instrucciones? ¿Hay una diferencia de rendimiento? Si es así, ¿cuál es más rápido y por qué los compiladores siempre usan el último?
Similarmente con la leave
y
mov esp, ebp
pop ebp
instrucciones.
Hay una diferencia de rendimiento, especialmente para enter
. En los procesadores modernos, esto decodifica a unos 10 a 20 μops, mientras que la secuencia de tres instrucciones es de aproximadamente 4 a 6, dependiendo de la arquitectura. Para más detalles, consulte las tablas de instrucciones de Agner Fog .
Además, la instrucción enter
usualmente tiene una latencia bastante alta, por ejemplo 8 relojes en un core2, en comparación con la cadena de dependencia de 3 relojes de la secuencia de tres instrucciones.
Además, la secuencia de tres instrucciones puede ser distribuida por el compilador para fines de programación, dependiendo del código de curso circundante, para permitir una ejecución más paralela de las instrucciones.
No hay una ventaja de velocidad real con ninguno de ellos, aunque el método largo probablemente funcionará mejor debido al hecho de que los CPU están actualmente más "optimizados" para las instrucciones simples más cortas que son más genéricas en uso (además, permite la saturación de la ejecución puertos si tienes suerte).
La ventaja de LEAVE
(que todavía se usa, simplemente vea las ventanas dlls) es que es más pequeño que derribar manualmente un marco de pila, esto ayuda mucho cuando su espacio es limitado.
Los manuales de instrucciones de Intel (volumen 2A para ser precisos) tendrán más detalles básicos sobre las instrucciones, por lo que debería Dr Agner Fogs Optimization manuales