sic/xe 어셈블러 구현 중 pass1 symtab optab 생성 중 문제

익명 사용자의 이미지

#include <stdio.h>
#include <stdlib.h>	
#include <string.h>
#include "my_assembler.h"
 
int init_my_assembler(void){
 
    if (init_inst_file("inst.data") != 0) {
        return -1;
    }
 
    if (init_input_file("input.txt") != 0) {
        return -1;
    }
 
    return 0; 
}
 
int init_inst_file(uchar *inst_file){
    FILE *file = fopen(inst_file, "r");
    inst_index = 0;
    if (file == NULL) {
        perror("Error opening inst.data file");
        return -1;
    }
    int i;
    for ( i = 0; i < MAX_INST; i++) {
        inst_table[i] = (inst *)malloc(sizeof(inst));
    }
 
    printf("Instructions from inst.data:\n");
 
    while (fscanf(file, "%s %d %d %X", inst_table[inst_index]->str, 
                                      &inst_table[inst_index]->ops, 
                                      &inst_table[inst_index]->format, 
                                      &inst_table[inst_index]->op) != EOF) {
        printf("%s %d %d %X\n", inst_table[inst_index]->str, 
                                 inst_table[inst_index]->ops, 
                                 inst_table[inst_index]->format, 
                                 inst_table[inst_index]->op);
        inst_index++;
 
        if (inst_index >= MAX_INST) {
            printf("Error: Maximum number of instructions reached.\n");
            break;
        }
    }
 
    fclose(file);
    return 0;
}
 
int init_input_file(uchar *input_file){
    FILE *file = fopen(input_file, "r");
    int line_num = 0;
 
    if (file == NULL) {
        perror("Error opening input.txt file");
        return -1;
    }
	int i;
    for ( i = 0; i < MAX_LINES; i++) {
        input_data[i] = (uchar *)malloc(MAX_LINES); 
    }
 
    while (fgets(input_data[line_num], MAX_LINES, file) != NULL) {
        printf("Line %d: %s", line_num + 1, input_data[line_num]);
        line_num++;
 
        if (line_num >= MAX_LINES) {
            printf("Error: Maximum number of lines reached.\n");
            break;
        }
    }
 
    printf("\n");
    fclose(file);
    return 0;
}
 
int token_parsing(uchar *str) {
    token_line = 0;  
    token_table[token_line] = (token *)malloc(sizeof(token));
 
    char *token_str = strtok(str, " \t\n");  
 
    while (token_str != NULL) {
        printf("Token: %s\n", token_str);
 
        if (token_str != NULL && token_str[0] != '.') {
            token_table[token_line]->label = strdup(token_str);
            printf("Label: %s\n", token_table[token_line]->label);
        } else {
            token_table[token_line]->label = NULL;
        }
 
        token_str = strtok(NULL, " \t\n");
 
        if (token_str != NULL) {
            token_table[token_line]->operator = strdup(token_str);
            printf("Operator: %s\n", token_table[token_line]->operator);
        } else {
            token_table[token_line]->operator = NULL;
        }
		int i;
        for (i = 0; i < MAX_OPERAND; i++) {
            token_str = strtok(NULL, " \t\n");
 
            if (token_str != NULL) {
                strcpy(token_table[token_line]->operand[i], token_str);
                printf("Operand %d: %s\n", i + 1, token_table[token_line]->operand[i]);
            } else {
                strcpy(token_table[token_line]->operand[i], "");
            }
        }
 
        token_str = strtok(NULL, "\n");
 
        if (token_str != NULL) {
            strcpy(token_table[token_line]->comment, token_str);
            printf("Comment: %s\n", token_table[token_line]->comment);
        } else {
            strcpy(token_table[token_line]->comment, "");
        }
 
        token_line++;
        token_table[token_line] = (token *)malloc(sizeof(token));  
 
        if (token_table[token_line] == NULL) {
            perror("Error allocating memory for token");
            exit(EXIT_FAILURE);
        }
 
        token_str = strtok(NULL, " \t\n");
    }
 
    printf("Reached the end of token_parsing\n");
    return 0;
}
 
int search_opcode(uchar *str) {
      uchar *opcode = token_table[token_line]->operator;  
 
    // inst_table에서 명령어 검색
    int i;
    for (i = 0; i < inst_index; i++) {
        if (strcmp(inst_table[i]->str, opcode) == 0) {
            printf("Opcode found: %s\n", opcode);
            return inst_table[i]->op;
        }
    }
 
    printf("Error: Opcode not found for %s\n", opcode);
    return -1;
}
 
static int assem_pass1(void) {
    make_opcode_output("optab.txt");
    make_symtab_output("symtab.txt");
}
 
void make_opcode_output(uchar *file_name) {
    FILE *optab_file = fopen(file_name, "w");
    if (optab_file == NULL) {
        perror("Error creating optab.txt file");
        return;
    }
 
    // input_data를 순회하면서 명령어를 찾아 optab 정보 생성
    int i;
    for (i = 0; i < line_num; i++) {
        uchar *line = input_data[i];
 
        // 명령어 토큰 추출
        printf("Before token_parsing: %s\n", line);
        token_parsing(line);
        uchar *mnemonic = token_table[token_line]->operator;
 
        printf("Token: %s\n", mnemonic);
 
        // 검색된 opcode 정보를 optab 파일에 쓰기
        int opcode = search_opcode(mnemonic);
        if (opcode != -1) {
            fprintf(optab_file, "%s %02X\n", mnemonic, opcode);
        }
    }
 
    fclose(optab_file);
    printf("%s file created successfully.\n", file_name);
}
 
void make_symtab_output(uchar *file_name) {
    FILE *symtab_file = fopen(file_name, "w");
    if (symtab_file == NULL) {
        perror("Error creating symtab.txt file");
        return;
    }
 
    // locctr 초기화
    locctr = 0;
 
    // input_data를 순회하면서 symtab 정보 생성
    int i;
    for (i = 0; i < line_num; i++) {
        uchar *line = input_data[i];
 
        // 명령어 토큰 추출
        printf("Before token_parsing: %s\n", line);
        token_parsing(line);
        uchar *mnemonic = token_table[token_line]->operator;
 
        printf("Token: %s\n", mnemonic);
 
        // label이 있는 경우 symtab에 추가하고 locctr 값 계산
        if (token_table[token_line]->label != NULL) {
            uchar *label = token_table[token_line]->label;
            fprintf(symtab_file, "%s %04X\n", label, locctr);
        }
 
        // 명령어의 형식에 따라 locctr 값 계산
        int opcode = search_opcode(mnemonic);
        if (opcode != -1) {
            inst *instruction = inst_table[opcode];
            locctr += instruction->format;
        }
    }
 
    fclose(symtab_file);
    printf("%s file created successfully.\n", file_name);
}
 
static int assem_pass2(void);
void make_objectcode_output(uchar *file_name);
int main(){
   init_my_assembler();
   assem_pass1();
}

C언어로 어셈블러 구현 중에 있습니다.
pass1단계까지 구현을 해봤는데 output인 symtab과 optab이 생성은 되는데 내용이 출력되지 않습니다.
디버깅을 위해 token_parsing 함수에 메세지를 추가해보았는데 메세지 또한 추가되지 않는 것이
아무래도 token_parsing 과정중 문제가 발생한 것 같은데 보이는 에러나 경고는 없어 골치가 아프네요.

사용중인 헤더파일과 입력파일 그리고 명령어파일은 첨부해두었습니다.
파일 업로드를 위해 헤더파일과 명령어파일은 임으로 확장자를 txt로 변경해 두었습니다.

File attachments: 
첨부파일 크기
Plain text icon input.txt1.53 KB
Plain text icon inst.txt1 KB
Plain text icon my_assembler.txt1.76 KB
-_-의 이미지

요즘에도 이거하는 학교가 있다니 놀랍네요. ㅋ

코드는 안봤는데... string이나 메모리 관련 함수들.. 특히 strtok 같은 함수가 내 생각이랑 좀 다르게 동작한다는 것을 겪어보지 않았다면 관련 함수들 체크하시는게 좋을 것 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.