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