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

2013.09.24_ Assambly 소스 _ 김성엽

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

0924_MEMtoCPU.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 PrintReg(CONTEXT *);
void STST(CONTEXT *);
void LDST(CONTEXT *);

int main()
{
  CONTEXT  stpReg = {0,};
  PrintReg(&stpReg);
  STST(&stpReg);
  PrintReg(&stpReg);
  getchar();

  LDST(&stpReg);  // STST로 가게해줌. while 문 역할
      // 메모리안에 있는 정보를 CPU 로 옮겨준다.

  printf("Kernel Panic\n");

  return 0;
}

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

} 



 0924_Monitor.asm Source 

.386

.MODEL FLAT

PUBLIC  _STST  ; Store Status
PUBLIC  _LDST  ; Load Status

.CODE

_STST  PROC  NEAR32
  PUSH  EBP   ; establish stack frame
  MOV  EBP,ESP

;  PUSH EFL  
  pushfd

;  Trap Flag set 임의 제거
  mov  eax, [ebp-4]
  and  eax, 0FFFFFEFFh
  mov  [ebp-4], eax

;  &context 위치 가리킴
  mov  esp,  [ebp+8]

;  EAX 로 이동
  add  esp,  40

  pushad

;  EIP(return Address) 대입
  push  [ebp+4]

;  EFL 대입
  push  [ebp-4]

;  메모리상의 esp 에 &CONTEXT 의 주소 대입 
  add  esp, 24
  mov  eax, ebp
  add  eax, 8
  push  eax
  
  push  [ebp]
  
  MOV  ESP,EBP ; restore ESP if local variables used
  POP  EBP   ; restore EBP
  RET     ; return

; Store Status
_STST  ENDP


; Load Status
_LDST  PROC  NEAR32
  
  MOV  ESP, [ESP+4]  ; CONTEXT 주소로 ESP를 옮김 , ESP = &CONTEXT
  POPFD      ; EFL 을 CPU 로 , EFL = CONTEXT.EFL

  POP  EAX    ; EIP 백업 (EAX Reg 에다가) , EAX = Old EIP
  
  MOV  EBX, ESP  ; EBX 에 ESP 를 백업 , Current ESP Backup
    
  MOV  ESP, [ESP+12]  ; &CONTEXT 위치로 ESP를 이동, ESP = Old ESP
  PUSH  EAX    ; POP 해놓은 Old EIP 넣음 , SAVE Old EIP

  MOV  ESP, EBX  ; ESP = Current ESP 
  
  POPAD      ; PUSHAD 와 반대순서로 CPU에 올라가고, ESP는 무시

  MOV  ESP, [ESP-20]  ; ESP를 Return Address 로 돌려주기
  SUB  ESP, 4    
  
  RET     ; return

_LDST  ENDP

  END



실행화면


 

  ▶ STST 함수 

  CPU -> Memory , CPU 안에 있는 레지스터 값을 메모리에 저장

  

  ▶ LDST 함수

  Memory -> CPU , 메모리 안에 있는 레지스터를 CPU 로 돌려줘서 다시 STST 함수가 실행 되도록 하여 

  무한반복문 동작을 한다.






728x90