글
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
구조체 .c영역
#include <stdio.h>
typedef struct _context
{
unsigned int EFL;
unsigned int EIP;
unsigned int EDI;
unsigned int ESI;
unsigned int EBP;
unsigned int ESP;
unsigned int EBX;
unsigned int EDX;
unsigned int ECX;
unsigned int EAX;
}context;
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
.asm영역
.386
.MODEL FLAT
.STACK 4096
PUBLIC _STST
.CODE
_STST PROC NEAR32
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
push ebp ; entry code
mov ebp,esp ; entry code
pushfd ; FLAG레지스터 저장
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
mov esp, [ebp + 8] ; 구조체 주소를 esp로옮김
add esp, 40 ; esp가 구조체 가장 아래 데이터에 저장할 준비
pushad ;레지스터 정보 저장
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
mov eax, ebp ; 현재ebp를 eax로 옮긴다음
add eax, 8 ; +8을 해주면 eax는 &status를 가리키는 주소를 가지게된다.
mov [esp + 12], eax ; status주소를 구조체내의 esp에 저장한다.
※현재 ESP는 EDI를 가리키고있다.
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
mov eax, [ebp] ; 레지스터에 있는 ebp의 값은 eax로 옮기고
mov [esp + 8], eax ; [ebp]에 있는 값을 ebp에 넣는다.
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
mov eax, [ebp + 4] ; R.A값을 eax로 넣고
push eax ; push해주면 구조체내의 eip로 들어간다.
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
push [ebp - 4] ; 마지막으로 FLAG레지스터의 값은 EFL로 들어간다.
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
mov esp,ebp ; exit code
pop ebp ; exit code
ret ; exit code
_STST ENDP
END
실행은 각자 해보는거져 >.<
(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)
CDECL vs STDCALL
함수를 리턴할 때 쓰는 방식
Left CDECL RIGHT STDCALL
콜러가 스택을 정리하는 방식
'어셈블리' 카테고리의 다른 글
call,ret (0) | 2014.08.08 |
---|---|
어셈블리 push&pop (0) | 2014.08.01 |
루프 (0) | 2014.07.31 |
20140728 어셈블리 ++연산 --연산 (0) | 2014.07.28 |
20140725 어셈블리 (0) | 2014.07.25 |
RECENT COMMENT