Stack Example
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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; }