Wiki: Stack Example

WARNING: Wiki content is an archive, no promise about quality!

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;
}

Category: Assembly Examples