“Enter” versus “push ebp; mov ebp, esp; sub esp, imm “y” dejar “frente a” mov esp, ebp; pop ebp “

¿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 comstackdores 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 architecture. 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 comstackdor para fines de progtwigció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 stack, 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

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 boost el tamaño de tu archivo, pero es mucho más rápido.

en la última nota, el progtwigdor 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