Stack Example
From Skull Security
| Assembly Language Tutorial | |
|---|---|
Please choose a tutorial page:
| |
This code should compile and run in Visual Studio (I've tested it):
#include <stdio.h>
void __declspec(naked) swap(int *a, int *b)
{
__asm
{
push ebp ; Preserve ebp.
mov ebp, esp ; Set up the frame pointer.
sub esp, 8 ; Make room for two local variables.
push esi ; Preserve esi on the stack.
push edi ; Preserve edi on the stack.
mov ecx, [ebp+8] ; Put the first parameter (a pointer) into ecx.
mov edx, [ebp+12] ; Put the second parameter (a pointer) into edx.
mov esi, [ecx] ; Dereference the pointer to get the first parameter.
mov edi, [edx] ; Dereference the pointer to get the second parameter.
mov [ebp-4], esi ; Store the first as a local variable
mov [ebp-8], edi ; Store the second as a local variable
mov esi, [ebp-8] ; Retrieve them in reverse
mov edi, [ebp-4]
mov [ecx], esi ; Put the second value into the first address.
mov [edx], edi ; Put the first value into the second address.
pop edi ; Restore the edi register
pop esi ; Restore the esi register
add esp, 8 ; Remove the local variables from the stack
pop ebp ; Restore ebp
ret ; Return (eax isn't set, so there's no return value)
}
}
int main(int argc, char* argv[])
{
int a = 3;
int b = 4;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
while(1)
;
return 0;
}
