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

20151015(목)_박서연_업무일지_Monitor Program(1)

by 알 수 없는 사용자 2015. 10. 15.
728x90
반응형

2015-10-15 목


*ASSEMBLY

# Monitor Program(1) 만들기


1.  Comm 구조체 만들기

typedef struct _Comm
{
  char* cpCmd;
  void (*fp)(void);
}Comm;

커맨드맵을 위한 구조체로써 

cpCmd는 입력받은 문자와 비교하기위한 문자

fp는 실행시킬 함수를 가리키는 포인터


2. 전역변수 구간에 Comm구조체형 stCmdMap배열 선언 및 초기화

Comm stCmdMap[] = {

                           {"R", PrintR},
                           {"H",PrintHelp},
                           {00}
                       };

Main에서 switch - case -문을 대체하기 위한 배열로 문자와 함수의 구성으로 되어있다. 

함수를 만들 때 마다 {0, 0}사이에 호출하기위한 문자와, 함수로 채워주면 된다.


3. PrintHelp함수 만들기

 void PrintHelp(void)

{
  printf("r = Print Register Information\n");
  printf("h = Print Command List\n");
  return;
}

일반적인 프로그램 메뉴얼을 출력해 주는 함수이다. 뭐를 누르면 뭐가 출력된다를 나타내는 기능을 한다.


4. 프로그램 실행 시 프롬프트 처럼 '>'출력하기

 while(1)

  {
    putchar('>');
    iRet = read(0, cInput,CMDSIZE);
    if(1 == iRet)
    {
      continue;
    }
    cInput[iRet-1= 0;

      .

      .

  }

무한 While문 안에 putchar('>')를 통해 >를 출력하여 준다.

그리고 그다음에 문자열을 입력 받아 cInput에 넣는 read함수를 실행하고 오류 및 Enter입력을 잡아주기 위한 코드를 삽입한다.


5. cInput문자열의 문자를 소문자->대문자로 치환하기

     //소문자를 대문자로 변경

    for(iCnt = 0; iCnt < iRet-1; iCnt++)
    {
      if(cInput[iCnt] >=97 &&cInput[iCnt] <= 122)
      {
        cInput[iCnt] -= 32;
      }
    }

우리가 입력 받았으면 하는 문자는 R, H와 같은 대문자이다. 하지만 이러한 문자들을 r, h와 같이 소문자로 입력을 받더라고 우리는 이를 처리해 주어야 한다. 그렇기 때문에 위와 같이 처리를 해준다.

97 = a, 122 = z이고 65 = A, 90 = Z 이다. 소문자와 대문자는 32 차이가 난다. 

문자열 전체를 돌면서 소문자 일때만 그 문자를 -32 해주어 대문자로 바꾸어 준다.

이렇게 되면 문자열 내의 모든 소문자는 대문자로 치환이 된다.


6. CommandMap 처리하기

 

while(1)
  {
     .
     .

     .


    stpCmd = stCmdMap;

    while(0 != (stpCmd->fp) )
    {  
      if(0 == strcmp(cInput, stpCmd->cpCmd))
      {
        break;
      }
    
      ++stpCmd;
    }

    if(0 != stpCmd->fp)
    {
      (stpCmd->fp)();
    }
    else
    {
      PrintHelp();  
    }    
  }

Comm* 변수 stpCmd를 선언하고 무한 while문 대소문자 변경후에 stCmdMap으로 초기화를 해준다.

그리고 안에서 다시 while문을 돌려 최대 {0,0}을 만날 때까지 계속되도록 조건문을 지정해 준다.

안에서 cInput과 stpCmd->cpCmd가 같으면, 즉 입력받은 값(대소문자 치환 후)과 stCmdMap에 저장한 문자 값이 일치한다면 그대로 while문을 종료하고 아니면 ++stpCmd를 해주어 다음 구조체를 가르킬 수 있도록 해준다.

그리고 밖에서는 두가지 경우가 있다. 저장한 문자값과 cInput이 일치하여 while문을 빠져나온 경우와 {0, 0}이라서 while문이 종료된 경우가 있다. 앞의 경우에는 해당 문자에 대응하는 함수를 실행시켜주고 뒤의 경우에는 PrintHelp를 한번 실행시켜준다.


전체소스

 #include <stdio.h>


#define CMDSIZE 20

typedef struct _Context
{
  unsigned int efl;
  unsigned int eip;
  unsigned int edi;
  unsigned int esi;
  unsigned int ebp;
  unsigned int esp;
  unsigned int ebx;
  unsigned int edx;
  unsigned int ecx;  
  unsigned int eax;

}Context;

typedef struct _Comm
{
  char* cpCmd;
  void (*fp)(void);
}Comm;

void stst(Context* );
void ldst(Context* );
void PrintR(void);
void PrintHelp(void);
static Context stOldState;
Comm stCmdMap[] = {
      {"R", PrintR},
      {"H",PrintHelp},
      {00}
       };//MessageMap 기법  

int main(void)
{  
  int iCnt;
  char cInput[CMDSIZE];
  int iRet;
  Comm* stpCmd;
  stst(&stOldState);

  printf("Monitor Program Start!!\n");

  while(1)
  {
    putchar('>');
    iRet = read(0, cInput,CMDSIZE);
    if(1 == iRet)
    {
      continue;
    }
    cInput[iRet-1= 0;
    
    //소문자를 대문자로 변경
    for(iCnt = 0; iCnt < iRet-1; iCnt++)
    {
      if(cInput[iCnt] >=97 &&cInput[iCnt] <= 122)
      {
        cInput[iCnt] -= 32;
      }
    }
    
    stpCmd = stCmdMap;

    while(0 != (stpCmd->fp) )
    {  
      if(0 == strcmp(cInput, stpCmd->cpCmd))
      {
        break;
      }
    
      ++stpCmd;
    }

    if(0 != stpCmd->fp)
    {
      (stpCmd->fp)();
    }
    else
    {
      PrintHelp();  
    }    
  }
  return 0;
}

void PrintR()
{
  printf("main = %08X\n"&main);
  printf("stOldState = %08X\n\n"&stOldState);

  printf("eax : %08X ",stOldState.eax);
  printf("ebx : %08X \n",stOldState.ebx);
  printf("ecx : %08X ",stOldState.ecx);
  printf("edx : %08X \n",stOldState.edx);  
  printf("esi : %08X ",stOldState.esi);
  printf("edi : %08X \n",stOldState.edi);
  printf("eip : %08X ",stOldState.eip);
  printf("esp : %08X \n",stOldState.esp);
  printf("ebp : %08X ",stOldState.ebp);  
  printf("efl : %08X \n",stOldState.efl);

  return;
}

void PrintHelp(void)
{
  printf("r = Print Register Information\n");
  printf("h = Print Command List\n");
  return;
}

※ 개인의 취향에 따라서 조금 변수명, 함수명이 다를 수 있습니다.


결과 화면


*로봇 제어

#디바이스 드라이버


ozroid.c


Makefile


소스 설명





컴파일 결과



728x90