“enter” vs “push ebp; mov ebp, esp; sub esp, imm” and “leave” vs “mov esp, ebp; pop ebp”

前端 未结 3 1903
迷失自我
迷失自我 2020-11-27 17:14

What is the difference between the enter and

push ebp
mov  ebp, esp
sub  esp, imm

instructions? Is there a performence differe

相关标签:
3条回答
  • 2020-11-27 17:18

    There is a performance difference, especially for enter. On modern processors this decodes to some 10 to 20 µops, while the three instruction sequence is about 4 to 6, depending on the architecture. For details consult Agner Fog's instruction tables.

    Additionally the enter instruction usually has a quite high latency, for example 8 clocks on a core2, compared to the 3 clocks dependency chain of the three instruction sequence.

    Furthermore the three instruction sequence may be spread out by the compiler for scheduling purposes, depending on the surrounding code of course, to allow more parallel execution of instructions.

    0 讨论(0)
  • 2020-11-27 17:19

    There is no real speed advantage using either of them, though the long method will probably run better due to the fact CPU's these days are more 'optimized' to the shorter simpler instructions that are more generic in use (plus it allows saturation of the execution ports if your lucky).

    The advantage of LEAVE (which is still used, just see the windows dlls) is that its smaller than manually tearing down a stack frame, this helps a lot when your space is limited.

    The Intel instruction manuals (volume 2A to be precise) will have more nitty gritty details on the instructions, so should Dr Agner Fogs Optimization manuals

    0 讨论(0)
  • When designing the 80286, Intel's CPU designers decided to add two instructions to help maintain displays.

    Here the micro code inside the 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
    

    Alternative to ENTER would be:

    ; enter n, 0 ;14 cycles on the 486

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

    ; enter n, 1 ;17 cycles on the 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
    

    ; enter n, 3 ;23 cycles on the 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. The long way might increase your file size, but is way quicker.

    on last note, programmer don't really use display anymore since that was a very slow work around, making ENTER pretty useless now.

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

    0 讨论(0)
提交回复
热议问题