2016-10-05 9 views
1

シンプルなCPUを模倣した学校向けのコードを書いています。私はセグメンテーションの欠陥が何であるか知っていますが、私のコードに何が間違っているのか分かりません。ヘッダやメインと間違って何もありませんセグメンテーションフォールト(コアダンプ)

、私はここで

referrenceのためにそれを含めていますが、私のヘッダーです:

#define NUM_BYTES (16 * 1024) 
#define BYTES_PER_WORD 2 
#define WORDS_PER_INSTRUCTION 2 
#define NUM_WORDS (NUM_BYTES/BYTES_PER_WORD) 
#define NUM_INSTRUCTIONS (NUM_WORDS/WORDS_PER_INSTRUCTION) 
#define R0 0 
#define R1 1 
#define R2 2 
#define R3 3 
#define R4 4 
#define R5 5 

typedef unsigned short Machine_word; 

typedef enum { PLUS, MINUS, TIMES, DIV, NEG, AND, OR, NOT, LI, LW, SW, 
       MOVE, CMP, READ, WRITE, HALT } Opcode; 

typedef enum { LT, LE, GT, GE, EQ, NE } Comparison; 

typedef struct { 
    Opcode opcode; 
    Comparison comparison; 
    unsigned short reg1; 
    unsigned short reg2; 
    unsigned short reg3; 
    unsigned short addr_or_imm; 
} Instruction; 

void print_instruction(Instruction instr); 
int disassemble(const Machine_word memory[], int starting_addr, int num_instrs, 
       Instruction instrs[], int *const valid_instrs); 
int valid_instruction(Machine_word instr_word1, Machine_word instr_word2); 
int assemble(unsigned short opcode, unsigned short comparison, 
      unsigned short reg1, unsigned short reg2, unsigned short reg3, 
      unsigned short addr_or_imm, Machine_word *const word1, 
      Machine_word *const word2); 

私の主:

#include<stdio.h> 
#include "header.h" 

#define PROGRAM_SIZE 10 


int main() { 
    Machine_word words[NUM_WORDS]= {0x10a5,  0, /* 2 words of 1st instr. */ 
            0x80c0, 0x03ff, /* 2 words of 2nd instr. */ 
            0xa040, 0x00d8, /* etc. */ 
            0x5008,  0, 
            0x7080,  0, 
            0xc528, 0x21f8, 
            0x9080, 0x2718, 
            0xb058,  0, 
            0xe100,  0, 
            0xf000,  0}; 
    /* double braces because it's an array of structures */ 
    Instruction instrs[NUM_INSTRUCTIONS]= {{0}}; 
    int i, num_valid_instrs= 0; 

    disassemble(words, 0, PROGRAM_SIZE, instrs, &num_valid_instrs); 

    for (i= 0; i < num_valid_instrs; i++) { 
    print_instruction(instrs[i]); 
    printf("\n"); 
    } 

私の機能:(最初の関数ha S無問題!)

#include<stdio.h> 
#include "machine.h" 


void print_instruction(Instruction instr) { 

    if (instr.opcode == HALT) { 
    printf("halt"); 
    } else if (instr.opcode == PLUS) { 
    printf("plus\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == MINUS) { 
    printf("minus\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == TIMES) { 
    printf("times\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == DIV) { 
    printf("div\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == NEG) { 
    printf("neg\tR%hu\tR%hu", instr.reg1, instr.reg2); 
    } else if (instr.opcode == AND) { 
    printf("and\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == OR) { 
    printf("or\tR%hu\tR%hu\tR%hu", instr.reg1, instr.reg2, instr.reg3); 
    } else if (instr.opcode == NOT) { 
    printf("not\tR%hu\tR%hu", instr.reg1, instr.reg2); 
    } else if(instr.opcode == LI) { 
    printf("li\tR%hu\t%05hu", instr.reg1, instr.addr_or_imm); 
    }else if (instr.opcode == LW) { 
    printf("lw\tR%hu\t%05hu", instr.reg1, instr.addr_or_imm); 
    } else if (instr.opcode == SW) { 
    printf("sw\tR%hu\t%05hu", instr.reg1, instr.addr_or_imm); 
    } else if (instr.opcode == MOVE) { 
    printf("move\tR%hu\tR%hu", instr.reg1, instr.reg2); 
    } else if (instr.opcode == CMP) { 
    printf("cmp %d\tR%hu\tR%hu\t%05hu", (int)instr.comparison, instr.reg1, instr.reg2, instr.addr_or_imm); 
    } else if (instr.opcode == READ) { 
    printf("read\tR%hu", instr.reg1); 
    } else if (instr.opcode == WRITE) { 
    printf("write\tR%hu", instr.reg1); 
    } 
} 


int disassemble(const Machine_word memory[], int starting_addr, int num_instrs, Instruction instrs[], int *const valid_instrs) { 
    int i, count= 0, index= 0; 

    if(starting_addr % 4 != 0) 
    return 0; 
    if(starting_addr < 0 || starting_addr > 16384) 
    return 0; 
    if(starting_addr + num_instrs*4 > 16384) 
    return 0; 
    if(memory == NULL || instrs == NULL) 
    return 0; 

    for(i = starting_addr/2; i < i + num_instrs*2; i += 2){ 
    /*read instructions*/ 
    Machine_word opcode = memory[i]; 
    Machine_word comparison = memory[i]; 
    Machine_word reg1 = memory[i]; 
    Machine_word reg2 = memory[i]; 
    Machine_word reg3 = memory[i]; 
    Machine_word mem_addr = memory[i + 1]; 

    opcode = (opcode & 0xf000) >> 12; 
    comparison = (comparison & 0x0e00) >> 9; 
    reg1 = (reg1 & 0x01c0) >> 6; 
    reg2 = (reg2 & 0x0038) >> 3; 
    reg3 = (reg3 & 0x0007); 

    if(opcode == 0) { 
     instrs[index].opcode = PLUS; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 1) { 
     instrs[index].opcode = MINUS; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 2) { 
     instrs[index].opcode = TIMES; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 3) { 
     instrs[index].opcode = DIV; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 4) { 
     instrs[index].opcode = NEG; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
    } else if(opcode == 5) { 
     instrs[index].opcode = AND; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 6) { 
     instrs[index].opcode = OR; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
     instrs[index].reg3 = reg3; 
    } else if(opcode == 7) { 
     instrs[index].opcode = NOT; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
    } else if(opcode == 8){ 
     instrs[index].opcode = LI; 
     instrs[index].reg1 = reg1; 
     instrs[index].addr_or_imm = mem_addr; 
    } else if(opcode == 9) { 
     instrs[index].opcode = LW; 
     instrs[index].reg1 = reg1; 
     instrs[index].addr_or_imm = mem_addr; 
    } else if(opcode == 10) { 
     instrs[index].opcode = SW; 
     instrs[index].reg1 = reg1; 
     instrs[index].addr_or_imm = mem_addr; 
    } else if(opcode == 11) { 
     instrs[index].opcode = MOVE; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
    } else if(opcode == 12) { 
     instrs[index].opcode = CMP; 
     instrs[index].comparison = (Comparison)comparison; 
     instrs[index].reg1 = reg1; 
     instrs[index].reg2 = reg2; 
    } else if(opcode == 13) { 
     instrs[index].opcode = READ; 
     instrs[index].reg1 = reg1; 
    } else if(opcode == 14) { 
     instrs[index].opcode = WRITE; 
     instrs[index].reg1 = reg1; 
    } else if(opcode == 15) { 
     instrs[index].opcode = HALT; 
    } 

    index++; 
    count++; 

    } 

    *valid_instrs = count; 
    return 1; 
} 

のみ第二の機能、ビット操作を行い、問題

それはそう長くあるために謝罪を持っていません。

+2

に変更してください。デバッガを使用すると、問題の原因を確かに見つけることができます。 –

+2

「i BLUEPIXY

+0

@BLUEPIXYはそれを釘付けにしたと思う。 'i

答えて

2

上記のコメントと同様に、エラーはi < i + num_instrs*2の状態です。 「i」の値はi + num_instrs*2にfrizzedされていないことに注意してください - それは各ステップで増分されます - i。 e。条件は0 < 0 +10*2,2 < 2 +10*2,4 < 4 +10*2のようになります。だから、条件に初期値starting_addr/2を使用する必要があります。

は、我々はあなたの問題を再現することができないとして、私たちは答えることができない

for(i = starting_addr/2; i < i + num_instrs*2; i += 2){ 

for(i = starting_addr/2; i < starting_addr/2 + num_instrs*2; i += 2){ 
関連する問題