2011-05-11 13 views

Respuesta

31

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 Agner Fog's.

Además, la instrucción enter generalmente 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, el compilador puede distribuir las tres secuencias de instrucciones para programarlas, dependiendo del código del campo circundante, para permitir una ejecución más paralela de las instrucciones.

+0

Puedo preguntar donde se obtiene esta información? ¿Y para "dejar"? –

+4

Consulte http://www.agner.org/optimize/microarchitecture.pdf para obtener una descripción global de cómo el procesador ejecuta el código y http://www.agner.org/optimize/instruction_tables.pdf para conocer las latencias de instrucciones detalladas. 'leave' está en algunas arquitecturas de igual rendimiento, pero AFAIK en ningún caso es más rápido. Consume menos memoria en el caché de instrucciones, aunque – hirschhornsalz

+1

Si la secuencia de 3 instrucciones es más rápida que 'enter', ¿de qué sirve? –

3

No hay una ventaja de velocidad real con ninguno de ellos, aunque el método largo probablemente funcionará mejor debido a que los CPU están actualmente más "optimizados" para las instrucciones más simples que son más genéricas (además de permitir saturación de los puertos de ejecución si tienes suerte).

La ventaja de LEAVE (que todavía se utiliza, basta con ver 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.

El Intel manuales de instrucciones (volumen 2A para ser precisos) tendrá más detalles Nitty Gritty en las instrucciones, por lo que debe Dr Agner Fogs Optimization manuals

2

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 

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

Cuestiones relacionadas