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
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
2013년 9월 24일 어셈블리 - 이수현 (0) | 2013.09.24 |
---|---|
20130924 USART -이세웅 (0) | 2013.09.24 |
AVR UART 인터럽트 - 전영기 (0) | 2013.09.24 |
시리얼통신, 무한반복 함수 어셈 (0) | 2013.09.24 |
어셈블리 - 전영기 (0) | 2013.09.24 |
20130924 어셈블리 - 이세웅 (0) | 2013.09.24 |
2013_09_23 어셈블리 레지스터 값 불러오기 (한성원) (0) | 2013.09.24 |
130924화 어셈블리 과제 조유진 (0) | 2013.09.24 |