본문 바로가기
코스웨어/13년 스마트컨트롤러

어셈블리 - 전영기

by 알 수 없는 사용자 2013. 9. 24.
728x90
반응형


monitor.asm


.386

.MODEL FLAT


PUBLIC _STST

PUBLIC _LDST


.CODE

_STST PROC NEAR32    ;cpu에서 context구조체로

PUSH EBP

MOV EBP, ESP



PUSHFD

MOV EAX, [EBP - 4]

AND EAX, 0FFFFFEFFH

MOV [EBP - 4], EAX

MOV ESP, [EBP + 8]

ADD ESP, 40


PUSHAD

PUSH [EBP + 4]

PUSH [EBP - 4]

MOV ESP, [EBP + 8]

MOV EAX, [EBP]

MOV [ESP + 16], EAX

MOV EAX, EBP

ADD EAX, 8

MOV [ESP + 20], EAX

MOV EAX, 0


MOV ESP, EBP

POP EBP

RET

_STST ENDP


_LDST PROC NEAR32        ;context 구조체에서 cpu로

MOV ESP, [ESP + 4] ;ESP = &CONTEXT

POPFD ;EFL = CONTEXT.EFL

POP EAX ;EAX = LODEIP

MOV EBX, ESP ;EBX = CURRENTESP

MOV ESP, [ESP + 12] ;ESP = OLDESP

PUSH EAX ;SAVE OLDEIP

MOV ESP, EBX ;ESP = CURRENTESP

POPAD

MOV ESP, [ESP - 20]

SUB ESP, 4


RET

_LDST ENDP


END


-------------------------------------------------------------------------------

main.c

#include <stdio.h>



typedef struct _context

{

int efl;

int eip;

int edi;

int esi;

int ebp;

int esp;

int ebx;

int edx;

int ecx;

int eax;

} context;


void print_reg(context *);

void STST(context *);

void LDST(context *);


int main()

{

context stReg = {0,};

print_reg(&stReg);

printf("-------------------------------------------------\n");

STST(&stReg);

print_reg(&stReg);

getchar();            //반복구간 시작

LDST(&stReg);    //반복구간 끝

printf("Kernel Panic\n");

return 0;

}


void print_reg(context *stpI)

{

printf( "EAX VALUE : 0x%08X\t\t"

"ECX VALUE : 0x%08X\n"

, stpI->eax, stpI->ecx);

printf( "EDX VALUE : 0x%08X\t\t"

"EBX VALUE : 0x%08X\n"

, stpI->edx, stpI->ebx);

printf( "ESP VALUE : 0x%08X\t\t"

"EBP VALUE : 0x%08X\n"

, stpI->esp, stpI->ebp);

printf( "ESI VALUE : 0x%08X\t\t"

"EDI VALUE : 0x%08X\n"

, stpI->esi, stpI->edi);

printf( "EIP VALUE : 0x%08X\t\t"

"EFL VALUE : 0x%08X\n"

, stpI->eip, stpI->efl);


}


결과

728x90