“Enter” vs “push ebp; mov ebp, esp; sub esp, imm “e” leave “vs” mov esp, ebp; pop ebp “

Qual è la differenza tra enter e

 push ebp mov ebp, esp sub esp, imm 

Istruzioni? C’è una differenza di rendimento? Se è così, che è più veloce e perché i compilatori usano sempre quest’ultimo?

Analogamente con il leave e

 mov esp, ebp pop ebp 

Istruzioni.

    C’è una differenza di prestazioni, soprattutto per enter . Nei processori moderni questo decodifica da 10 a 20 μop, mentre la sequenza di tre istruzioni è da 4 a 6, a seconda dell’architettura. Per i dettagli consultare le tabelle di istruzioni di Agner Fog .

    Inoltre, l’istruzione enter ha solitamente una latenza piuttosto elevata, ad esempio 8 clock su un core2, rispetto alla catena di dipendenze a 3 clock della sequenza di tre istruzioni.

    Inoltre la sequenza di tre istruzioni può essere distribuita dal compilatore per scopi di pianificazione, a seconda del codice circostante, naturalmente, per consentire l’esecuzione parallela di istruzioni.

    Non esiste un reale vantaggio in termini di velocità con nessuno dei due, anche se il metodo lungo probabilmente funzionerà meglio a causa del fatto che le CPU in questi giorni sono più “ottimizzate” per le istruzioni più semplici più brevi che sono più generiche in uso (in più consente la saturazione dell’esecuzione porti se sei fortunato).

    Il vantaggio di LEAVE (che è ancora usato, basta vedere le windows di Windows) è che è più piccolo che abbattere manualmente uno stack frame, questo aiuta molto quando lo spazio è limitato.

    I manuali di istruzioni Intel (il volume 2A per la precisione) avranno più dettagli nitty sulle istruzioni, quindi i manuali di ottimizzazione Dr Neil Agner

    Durante la progettazione di 80286, i progettisti di CPU di Intel hanno deciso di aggiungere due istruzioni per aiutare a mantenere i display.

    Ecco il codice micro all’interno della 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 potrebbe essere:

    ; immettere n, 0; 14 cicli sul 486

     push bp ;1 cycle on the 486 sub sp, n ;1 cycle on the 486 

    ; immettere n, 1; 17 cicli sul 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 

    ; immettere n, 3; 23 cicli sul 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. La lunga strada potrebbe aumentare le dimensioni del file, ma è molto più veloce.

    in ultima analisi, i programmatori non usano più il display dato che è stato un lavoro molto lento, rendendo il ENTER piuttosto inutile ora.

    Fonte: https://courses.engr.illinois.edu/ece390/books/artofasm/CH12/CH12-3.html