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?