Search code examples
assemblyx86return

What is the x86 "ret" instruction equivalent to?


Say I'm writing a routine in x86 assembly, like, "add" which adds two numbers passed as arguments.

For the most part this is a very simple method:

push ebp
mov ebp, esp
mov eax, [ebp+8]
add eax, [ebp+12]
mov esp, ebp
pop ebp
ret

But, is there any way I could rewrite this method to avoid the use of the "ret" instruction and still have it produce the exact same result?


Solution

  • This does not need any free registers to simulate ret, but it needs 4 bytes of memory (a dword). Uses indirect jmp. Edit: As noted by Ira Baxter, this code is not reentrant. Works fine in single-threaded code. Will crash if used in multithreaded code.

    push ebp
    mov  ebp, esp
    mov  eax, [ebp+8]
    add  eax, [ebp+12]
    mov  ebp, [ebp+4]
    mov  [return_address], ebp
    pop  ebp
    
    add  esp,4
    jmp  [return_address]
    
    .data
    return_address dd 0
    

    To replace only the ret instruction, without changing the rest of the code. Not reentrant. Do not use in multithreaded code. Edit: fixed bug in below code.

    push ebp
    mov  ebp, esp
    mov  ebp, [ebp+4]
    mov  [return_address], ebp
    pop  ebp
    
    add  esp,4
    jmp  [return_address]
    
    .data
    return_address dd 0