2015-10-15 목
*ASSEMBLY
# Monitor Program(1) 만들기
1. Comm 구조체 만들기
typedef struct _Comm |
커맨드맵을 위한 구조체로써
cpCmd는 입력받은 문자와 비교하기위한 문자
fp는 실행시킬 함수를 가리키는 포인터
2. 전역변수 구간에 Comm구조체형 stCmdMap배열 선언 및 초기화
Comm stCmdMap[] = {
|
Main에서 switch - case -문을 대체하기 위한 배열로 문자와 함수의 구성으로 되어있다.
함수를 만들 때 마다 {0, 0}사이에 호출하기위한 문자와, 함수로 채워주면 된다.
3. PrintHelp함수 만들기
void PrintHelp(void)
|
일반적인 프로그램 메뉴얼을 출력해 주는 함수이다. 뭐를 누르면 뭐가 출력된다를 나타내는 기능을 한다.
4. 프로그램 실행 시 프롬프트 처럼 '>'출력하기
while(1)
|
무한 While문 안에 putchar('>')를 통해 >를 출력하여 준다.
그리고 그다음에 문자열을 입력 받아 cInput에 넣는 read함수를 실행하고 오류 및 Enter입력을 잡아주기 위한 코드를 삽입한다.
5. cInput문자열의 문자를 소문자->대문자로 치환하기
//소문자를 대문자로 변경
|
우리가 입력 받았으면 하는 문자는 R, H와 같은 대문자이다. 하지만 이러한 문자들을 r, h와 같이 소문자로 입력을 받더라고 우리는 이를 처리해 주어야 한다. 그렇기 때문에 위와 같이 처리를 해준다.
97 = a, 122 = z이고 65 = A, 90 = Z 이다. 소문자와 대문자는 32 차이가 난다.
문자열 전체를 돌면서 소문자 일때만 그 문자를 -32 해주어 대문자로 바꾸어 준다.
이렇게 되면 문자열 내의 모든 소문자는 대문자로 치환이 된다.
6. CommandMap 처리하기
|
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}, {0, 0} };//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
소스 설명
컴파일 결과
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151020-21번-여지윤 GPIO6/모니터프로그램 (15) | 2015.10.21 |
---|---|
20151020 엄민웅 armCortex3 TIM, asm MEMORY_MODIFY (6) | 2015.10.20 |
20151019 안향진 TIM2 delay_파이선 led on/off_code/data/stack view, load, memory clear (9) | 2015.10.20 |
20151016 박제혁 module_param, 장치의 타입, 모니터 프로그램 (12) | 2015.10.16 |
20151014 남수진 라즈베리파이 디바이스 드라이브 (8) | 2015.10.14 |
20151013 김태현 라즈베리파이 커널 업데이트(작성중) (3) | 2015.10.13 |
20151012-김재홍-어셈블리_Context Switching (9) | 2015.10.13 |
20151008 - 김성주 - M3 : RCC / 어셈블리 : pushad를 이용한 구조체 삽입 (6) | 2015.10.08 |