Stack Example

From SkullSecurity
Jump to navigation Jump to search
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;
}