-
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
목차
1장 프로젝트 개요
1.1 개발 배경 및 목적
2장 배경 지식
2.1 주제에 관한 배경지식
2.2 기술적 배경지식
3장 시스템 설계 내용
3.1 전체 시스템 설계 내용
3.2 모듈별 설계 내용
4장 시스템 구현 내용 ( 구현 화면 포함 )
4.1 전체 시스템 구현 내용
4.2 모듈별 구현 내용
5장 기대효과 및 결론
첨부 프로그램 소스파일 (1쪽에 2 column 으로 가로 인쇄 권장)
6장. 개발환경
1.1 개발 배경 및 목적
2장 배경 지식
2.1 주제에 관한 배경지식
2.2 기술적 배경지식
3장 시스템 설계 내용
3.1 전체 시스템 설계 내용
3.2 모듈별 설계 내용
4장 시스템 구현 내용 ( 구현 화면 포함 )
4.1 전체 시스템 구현 내용
4.2 모듈별 구현 내용
5장 기대효과 및 결론
첨부 프로그램 소스파일 (1쪽에 2 column 으로 가로 인쇄 권장)
6장. 개발환경
본문내용
재 여부 확인 하기 위한 함수
{
literal_list * cur = l_head;
if (strstr(str, \"=\"))
{
while ((cur != NULL) && strcmp(cur->literal_value, str) != 0)
{
cur = cur->next;
}
if (cur != NULL) //해당 리터널이 존재한다면
{
return 1;
}
else
{
literal_list_insert(str, sec_name);
}
return 1;
}
else
return -1;
}
my_assembler.h
/*
* my_assembler 함수를 위한 변수 선언 및 매크로를 담고 있는 헤더 파일이다.
*
*/
#define MAX_INST 256
#define MAX_LINES 5000
#define MAX_COLUMNS 4
#define MAX_OPERAND 3
/*
* 기계어 목록 파일로 부터 정보를 받아와 생성하는 기계어 변환 테이블이다.
* 해당 기계어의 정보를 토큰으로 나눠 기록하고 있다.
*/
char *inst[MAX_INST][MAX_COLUMNS];
int inst_index;
/*
* 어셈블리 할 소스코드를 토큰 단위로 관리하는 테이블이다.
* 관리 정보는 소스 라인 단위로 관리되어진다.
*/
char *input_data[MAX_LINES];
static int line_num;
int label_num;
struct token_unit {
int locctr; //효율적 연산을 위해 토큰테이블에 locctr 추가
char obj_code[9]; //토큰단위로 obj_code 저장
char *label;
char *operator;
char *operand[MAX_OPERAND];
char *comment;
};
typedef struct token_unit token;
token *token_table[MAX_LINES];
static int token_line;
/*
* 심볼을 관리하는 구조체이다.
* 심볼 테이블은 심볼 이름, 심볼의 위치로 구성된다.
*/
struct symbol_unit {
char sec_name[7]; //section단위로 같은 이름의 심볼이 있을 수 있으므로 sec_name 설정
char symbol[10];
int addr;
};
typedef struct symbol_unit symbol;
symbol sym_table[MAX_LINES];
static int locctr;
//--------------
static char *input_file;
static char *output_file;
enum registers { A, X, L, B, S, T, F, PC = 8, SW }; // 레지스터 번호 열거형으로 지정
typedef struct literal_list {
char sec_name[7];//섹션 이름
char literal_value[10]; //literal 값
int addr; //해당 literal 주소
int flag; //출력했는지 확인
struct literal_list *next; //바로 다음 literal
} literal_list;
literal_list *l_head;
literal_list *l_tail;
literal_list *l_cur;
static int literal_count;
typedef struct ext_list {
char name[7];
char def[10][7];
char ref[10][7];
int def_count;
int ref_count;
int sec_length;
} ext_list;
ext_list section_list[10];
static int section_count;
int init_my_assembler(void);
static int assem_pass1(void);
static int assem_pass2(void);
int init_inst_file(char *inst_file);
int init_input_file(char *input_file);
int search_opcode(char *str); //명령어 찾는 함수
void make_objectcode(char *file_name);
int handle_directive(char* input_data, char *directive, int index); //지시명령어 처리 함수 추가
void literal_list_insert(char *str, char *sec_name); //literal 삽입함수
char* literal_print(); //주소를 저장하지 않은 literal 반환
void write_symtab(int index, char* sec_name); //심볼테이블 작성 함수
int check_symbol(char* symbol, char* sec_name); //해당 심볼이 있는 심볼테이블에서 검색해서 주소 반환
void literal_set(); // pass1에서 리터널을 다룬거를 pass2에서 다루기위한 함수
char * objcode(int line, int op_index, char* sec_name, int flag);
int num_register(char *str); //레지스터 번호 리턴
int return_literal_addr(char *str, char *sec_name); //해당 리터널 어드레스 리턴
int literal_check(char *str, char *sec_name); //해당 literal check
int check_extref(char *str, char *sec_name); //extref로 선언한 레이블인지 확인
int return_sec_length(char *str); //section 크기 반환
int return_literal_addr(char *str, char *sec_name);
6. 개발환경
os : Windows 7
tool : Microsoft Visual Studio 2013
cpu : pentium E5200 @ 2.50GHZ
ram : 4.0GB
{
literal_list * cur = l_head;
if (strstr(str, \"=\"))
{
while ((cur != NULL) && strcmp(cur->literal_value, str) != 0)
{
cur = cur->next;
}
if (cur != NULL) //해당 리터널이 존재한다면
{
return 1;
}
else
{
literal_list_insert(str, sec_name);
}
return 1;
}
else
return -1;
}
my_assembler.h
/*
* my_assembler 함수를 위한 변수 선언 및 매크로를 담고 있는 헤더 파일이다.
*
*/
#define MAX_INST 256
#define MAX_LINES 5000
#define MAX_COLUMNS 4
#define MAX_OPERAND 3
/*
* 기계어 목록 파일로 부터 정보를 받아와 생성하는 기계어 변환 테이블이다.
* 해당 기계어의 정보를 토큰으로 나눠 기록하고 있다.
*/
char *inst[MAX_INST][MAX_COLUMNS];
int inst_index;
/*
* 어셈블리 할 소스코드를 토큰 단위로 관리하는 테이블이다.
* 관리 정보는 소스 라인 단위로 관리되어진다.
*/
char *input_data[MAX_LINES];
static int line_num;
int label_num;
struct token_unit {
int locctr; //효율적 연산을 위해 토큰테이블에 locctr 추가
char obj_code[9]; //토큰단위로 obj_code 저장
char *label;
char *operator;
char *operand[MAX_OPERAND];
char *comment;
};
typedef struct token_unit token;
token *token_table[MAX_LINES];
static int token_line;
/*
* 심볼을 관리하는 구조체이다.
* 심볼 테이블은 심볼 이름, 심볼의 위치로 구성된다.
*/
struct symbol_unit {
char sec_name[7]; //section단위로 같은 이름의 심볼이 있을 수 있으므로 sec_name 설정
char symbol[10];
int addr;
};
typedef struct symbol_unit symbol;
symbol sym_table[MAX_LINES];
static int locctr;
//--------------
static char *input_file;
static char *output_file;
enum registers { A, X, L, B, S, T, F, PC = 8, SW }; // 레지스터 번호 열거형으로 지정
typedef struct literal_list {
char sec_name[7];//섹션 이름
char literal_value[10]; //literal 값
int addr; //해당 literal 주소
int flag; //출력했는지 확인
struct literal_list *next; //바로 다음 literal
} literal_list;
literal_list *l_head;
literal_list *l_tail;
literal_list *l_cur;
static int literal_count;
typedef struct ext_list {
char name[7];
char def[10][7];
char ref[10][7];
int def_count;
int ref_count;
int sec_length;
} ext_list;
ext_list section_list[10];
static int section_count;
int init_my_assembler(void);
static int assem_pass1(void);
static int assem_pass2(void);
int init_inst_file(char *inst_file);
int init_input_file(char *input_file);
int search_opcode(char *str); //명령어 찾는 함수
void make_objectcode(char *file_name);
int handle_directive(char* input_data, char *directive, int index); //지시명령어 처리 함수 추가
void literal_list_insert(char *str, char *sec_name); //literal 삽입함수
char* literal_print(); //주소를 저장하지 않은 literal 반환
void write_symtab(int index, char* sec_name); //심볼테이블 작성 함수
int check_symbol(char* symbol, char* sec_name); //해당 심볼이 있는 심볼테이블에서 검색해서 주소 반환
void literal_set(); // pass1에서 리터널을 다룬거를 pass2에서 다루기위한 함수
char * objcode(int line, int op_index, char* sec_name, int flag);
int num_register(char *str); //레지스터 번호 리턴
int return_literal_addr(char *str, char *sec_name); //해당 리터널 어드레스 리턴
int literal_check(char *str, char *sec_name); //해당 literal check
int check_extref(char *str, char *sec_name); //extref로 선언한 레이블인지 확인
int return_sec_length(char *str); //section 크기 반환
int return_literal_addr(char *str, char *sec_name);
6. 개발환경
os : Windows 7
tool : Microsoft Visual Studio 2013
cpu : pentium E5200 @ 2.50GHZ
ram : 4.0GB
소개글