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

2013년 9월 24일 어셈블리 - 김경순

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

==============================================================================================

monitor.asm


.386
.MODEL FLAT

PUBLIC _STST
PUBLIC _LDST

.CODE
;Store Status
_STST PROC NEAR32
PUSH EBP
MOV EBP , ESP

PUSHFD ;EFL backup
MOV EAX , [EBP-4 ]     ;TF비트 제거를 위하여 
AND EAX , 0FFFFFEFFH
MOV [EBP-4] , EAX
MOV ESP , [EBP+8]
ADD ESP , 40
PUSHAD
MOV EAX , [EBP+4]      ;EIP(r.a)
PUSH EAX
MOV EAX , [EBP-4]         ;EFL
PUSH EAX
ADD ESP , 24
MOV EAX , EBP
ADD EAX , 8
PUSH EAX
PUSH [EBP] ;old EBP

MOV ESP , EBP
POP EBP
RET
_STST ENDP
;Load Status (Memory -> Cpu)
_LDST PROC NEAR32
MOV ESP , [ESP+4]     ;ESP = &context // context 주소이동 
POPFD ;EFL = context.efl // EFL 임시저장
POP EAX ;EAX = oldeip // EIP 임시저장
MOV EBX , ESP         ;EBX = current_esp // ESP 임시저장 
MOV ESP , [ESP+12]         ;ESP = oldesp // ESP를 oldesp로 이동 
PUSH EAX ;save oldeip // 백업해둔 EIP 값 넣기 
MOV ESP , EBX         ;ESP =current_esp  // ESP  복귀 ?
POP EDI ;EDI 부터 EAX 까지 
POP     ESI
POP EBP
ADD ESP , 4 ;ESP는 제외 
POP EBX
POP EDX
POP ECX
POP EAX ;EDI 부터 EAX 까지
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 *stpReg);
void STST(context *);
void LDST(context *);

int main(void)
{
context stReg = {0,};
Print_Reg(&stReg);
STST(&stReg);
Print_Reg(&stReg);

getchar();
LDST(&stReg);
printf("Kernel Panic\n");

return 0;
}


void Print_Reg(context *stpReg)
{
printf("-------------------------------------------------------\n");
printf("EAX VALUE : %08X ECX VALUE : %08X\n" , stpReg->eax , stpReg->ecx);
printf("EDX VALUE : %08X EBX VALUE : %08X\n" , stpReg->edx , stpReg->ebx);
printf("ESP VALUE : %08X EBP VALUE : %08X\n" , stpReg->esp , stpReg->ebp);
printf("ESI VALUE : %08X EDI VALUE : %08X\n" , stpReg->esi , stpReg->edi);
printf("EIP VALUE : %08X EFL VALUE : %08X\n" , stpReg->eip , stpReg->efl);
printf("-------------------------------------------------------\n");
return;

}


==============================================================================================

실행결과


종료하지 않고 계속 반복 





728x90