시스템 프로그래밍 프로젝트 #7 최종 (Assembler in C)

Problem: 지금까지의 프로젝트를 참고하여 2 pass assembler를 만들면 됩니다. 먼저 어셈블러(Assembler)란? 하드웨어가 직접 이해하여 실행하는 기계어는 일반적으로 비트 열 또는 16진수로 표현되기 때문에 인간이 이해하기 어렵다. 그래서 인간이 이해하기 쉽도록 기계어와 거의 일대일로 대응하는 기호로 표현된 언어로 어셈블러 언어가 있으며, 어셈블러 언어를 기계어로 번역하는 프로그램을 어셈블러, 번역하는 것을 어셈블이라고 합니다. 어셈블러의 역할을 그림으로 간단하게 나타내 보면 다음과 같습니다. 이 글에서 구현 할 2 패스 어셈블러의 알고리즘을 보겠습니다. pass 1 : ...

March 19, 2020 · 6 min · Sobamemil

시스템 프로그래밍 프로젝트 #1

Problem: Input File: [sample.txt 0.00MB](https://blog.kakaocdn.net/dna/WEEud/btqA6oyqdRE/AAAAAAAAAAAAAAAAAAAAAF6o8u7LK5SB9AIdNSz_-IRJgLPtbZjLxGCM5EIoOvqI/sample.txt?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1788188399&allow_ip=&allow_referer=&signature=AakSu1DOyqICwWZkF6%2F%2FvvgPYME%3D&attach=1&knm=tfile.txt) Execution Result: 소스 Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <stdio.h> #include <string.h> #include <stdlib.h> void main() { FILE *fp; char buf[80]; int n = 0; if ((fp = fopen("sample.s", "r")) == NULL) { fprintf(stderr, "file not found...\n"); exit(1); } while(fgets(buf, sizeof(buf), fp) != NULL) { n += get_token_num(buf); } fclose(fp); printf("Number of token = %d\n", n); } int get_token_num(char *bp) { char *cp; int n = 0; for(cp = strtok(bp, " \t\n"); cp != NULL; ) { n++; cp = strtok(NULL, " \t\n"); } return(n); } Explanation: ...

January 12, 2020 · 1 min · Sobamemil

시스템 프로그래밍 프로젝트 #4

Problem: Input File: [numb.txt 0.00MB](https://blog.kakaocdn.net/dna/EqJyk/btqA57RastK/AAAAAAAAAAAAAAAAAAAAAMzaoxsjOizEuGCR5qF4Fzsa0iAquIjz6f_89H3gPle-/numb.txt?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1788188399&allow_ip=&allow_referer=&signature=wyxmqU%2F2ZPAkscVFgGfrU1oKVrU%3D&attach=1&knm=tfile.txt) Execution Result: 소스 Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> void get_token_num(char *bp); void hextodec(char *test, int len); // hex to decimal function void atohex(char *ascii, int len); // ascii to hex function int sum = 0; int cnt = 0; int main() { FILE *fp = NULL; char buf[80]; if((fp = fopen("numb.s", "r"))==NULL) { printf("file not found...\n"); exit(1); } while(fgets(buf, sizeof(buf), fp) != NULL) { get_token_num(buf); } fclose(fp); printf("\nsum = %d\n", sum); return 0; } void get_token_num(char *bp){ int i,len; char test[10]; char* result = strtok(bp," \t\n"); // 문자열 자르기 while(result!=NULL) { // 자른 token이 NULL 일떄까지 loop if(result[0] == 'X'){ // 자른 token 의 원소가 'X' 이면 hexadecimal for(i=2; i<=strlen(result)-2; i++){ // 처리할 부분만 잘라냄 test[i-2] = result[i]; cnt++; } printf("token : %s\t",result); printf("\t\t"); hextodec(test, cnt); cnt=0; } else if(result[0] == 'C'){ // 자른 token의 첫 원소가 'C' 이면 ASCII printf("token : %s\t",result); for(i=2; i<=strlen(result)-2; i++){ // 처리할 부분만 잘라냄 test[i-2] = result[i]; cnt++; } test[cnt] = '\0'; atohex(test, cnt); cnt=0; } else { // 자른 token이 문자열 상수이면 decimal printf("token : %s\t",result); sum += atoi(result); printf("\t\tdec : %d\n", atoi(result)); } result = strtok(NULL," \t\n"); } } void hextodec(char *test, int len){ // 16진수로 된 문자열 int decimal = 0; // 10진수를 저장할 변수 int i; int position = 0; for (i = len - 1; i >= 0; i--) { // 문자열을 역순으로 반복 char ch = test[i]; // 각 자릿수에 해당하는 문자를 얻음 if (ch >= 48 && ch <= 57) { // 문자가 09이면(ASCII 코드 4857) // 문자에서 0에 해당하는 ASCII 코드 값을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - 48) * pow(16, position); } else if (ch >= 65 && ch <= 70) { // 문자가 AF이면(ASCII 코드 6570) // 대문자로 된 16진수의 처리 // 문자에서 (A에 해당하는 ASCII 코드 값 - 10)을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - (65 - 10)) * pow(16, position); } else if (ch >= 97 && ch <= 102) { // 문자가 af이면(ASCII 코드 97102) // 소문자로 된 16진수의 처리 // 문자에서 (a에 해당하는 ASCII 코드 값 - 10)을 빼고 // 16에 자릿수를 거듭제곱한 값을 곱함 decimal += (ch - (97 - 10)) * pow(16, position); } position++; } printf("dec : %d\n", decimal); sum += decimal; } void atohex(char *ascii, int len){ char outword[10]; int i, tmp_len; for(i = 0; i<len; i++){ sprintf(outword+i*2, "%02X", ascii[i]); } tmp_len = strlen(outword); printf("hex : %s\t", outword); hextodec(outword, tmp_len); } Explanation: ...

December 19, 2019 · 4 min · Sobamemil

시스템 프로그래밍 프로젝트 #6

Problem: 입력 데이터 : [Command.txt 0.00MB](https://blog.kakaocdn.net/dna/bnbU30/btqBgeimBnY/AAAAAAAAAAAAAAAAAAAAAAPakDbTA4jf0WyG_DmDE76emfyLiazho4x1advtOToN/Command.txt?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1788188399&allow_ip=&allow_referer=&signature=2iAm290NW4CFkRgpHKAQHRqBvxw%3D&attach=1&knm=tfile.txt) Execution Result: Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include<stdio.h> #include<string.h> #include<stdlib.h> void PrintAssm(char* name_buf, int name_size); struct OPTAB{ char name[8]; int len; } Wordtab[] = { {"LDA", 3}, {"STA", 4}, {"ADD", 5}, {"TIX", 2}, {"CMP", 6} }; int main() { char name_buf[8]; int wordtab_size = sizeof(Wordtab)/12; // Wordtab에 정의된 단어 갯수, 12 = size of char[8] + int FILE* fp; if((fp = fopen("Command.txt", "r"))==NULL) { printf("file not found...\n"); exit(1); } while(fgets(name_buf, sizeof(name_buf), fp) != NULL) { // fgets() 함수는 scanf나 gets()와는 달리 뒤에 개행문자가 붙는다 if(name_buf[0] == '\n') // name_buf 배열 맨 처음이 개행문자이면 메시지 출력 없이 무시 continue; if(name_buf[strlen(name_buf) - 1] == '\n') // name_buf 배열 맨 끝이 개행문자이면 name_buf[strlen(name_buf) - 1] = '\0'; // naem_buf 배열 맨 끝에 붙은 개행문자 제거 PrintAssm(name_buf, wordtab_size); } fclose(fp); } void PrintAssm(char* name_buf, int wordtab_size){ static int k=1; // 줄 번호를 나타내는 변수 static int loc=0; // 단어의 시작 위치를 나타내는 변수 int i, res=-1; for(i=0; i<wordtab_size; i++){ res = strcmp(name_buf, Wordtab[i].name); // strcmp : 두 문자열이 같으면 0 리턴 if(res==0){ break; } } if(i==wordtab_size){ printf(" Undefined word\n"); // Wordtab 배열 안에 정의되어 있지 않는 명령어면 출력하고 단어 무시 } else{ if(k < 10) printf(" "); printf("%d, %.2X, %s, %.2d\n", k, loc, Wordtab[i].name, Wordtab[i].len); loc += Wordtab[i].len; // 단어의 해당길이를 더해서 다음 시작 위치를 알려줌 k++; } } Explanation: ...

November 21, 2019 · 2 min · Sobamemil