Stack Example

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