What is the x86 "ret" instruction equivalent to?

assembly, return, x86

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

Problem

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?

Original source

Related problems