휴가 -2Day



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


구조체 .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
by 날라차숑 2014. 8. 7. 16:19