Difference between revisions of "Stack Example"

From SkullSecurity
Jump to navigation Jump to search
(New page: {{Infobox assembly}} Category: Assembly Examples I've tested this, and it should work as intended: <pre> #include <stdio.h> void __declspec(naked) swap(int *a, int *b) { __asm { ...)
 
Line 1: Line 1:
{{Infobox assembly}}
[[Category: Assembly Examples]]
I've tested this, and it should work as intended:
<pre>
#include <stdio.h>
#include <stdio.h>


Line 23: Line 17:
mov edi, [edx] ; Dereference the pointer to get the second parameter.
mov edi, [edx] ; Dereference the pointer to get the second parameter.


mov [ecx], edi ; Put the second value into the first address.
mov [ebp-4], esi ; Store the first as a local variable
mov [edx], esi ; Put the first value into the second address.
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 edi        ; Restore the edi register
Line 48: Line 48:
return 0;
return 0;
}
}
</pre>

Revision as of 18:32, 13 March 2007

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