Создание целевого буфера филиала из списка адресов памяти (домашняя работа) - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать массив длиной 1024, в котором будут храниться номер записи, текущий адрес и следующий адрес длинного списка адресов памяти, представляющих значение счетчика программы при его запуске через какую-то программу.

Моя проблема в том, что мой код работает до тех пор, пока я не начну сканировать более 1364 записей. Я могу заставить свой код успешно заполнять массив BTB, пока не увеличу количество записей счетчиков программ после 1364 года. Мне нужно, чтобы он работал примерно для 11 300 записей. Мой код создает файл .txt с содержимым массива в каждой записи. Проблема в том, что как только мое количество записей превысит 1364, мой выходной файл будет полностью пустым.

У меня есть одна функция для декодирования номера записи. У меня есть другая функция для сканирования документа .txt со всеми записями P C и назначения правильных текущих / будущих значений адресов для номера записи и сохранения всего этого в массиве, а также другая функция для печати окончательного массива BTB в другой файл .txt. У меня пока нет функциональности для обработки веток и переходов, но прогрессирующие записи обычно работают нормально.

Код ниже:

#ifndef header_h 
#define header_h    
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h> 
#include <math.h>

struct address
{
    int entry_number;
    char current_address[7];
    char next_address[7];
};

typedef struct address address;
address PC_array[1024];

int hex_to_dec(char x);
int entry_number_decoder(char address[7]);
void scan(FILE *input_file, FILE *output_file, address PC_array[]);
void test_print(address PC_array[], FILE *output_file);

#endif

int main(void)
{
    //handle files
    FILE *input_file;
    input_file = fopen("Test.txt", "r");  //open trace_sample.txt 
    FILE *output_file;
    output_file = fopen("output.txt", "w+");  //open output text file for writing

    scan(input_file, output_file, PC_array);    
    test_print(PC_array, output_file);

    fclose(input_file);
    fclose(output_file);


    return 0;
}

int hex_to_dec(char x)
{
    int decimal_number = 0;
        switch (x)
        {
            case 'a':
                decimal_number = 10; break;
            case 'b':
                decimal_number = 11; break;
            case 'c':
                decimal_number = 12; break;
            case 'd':
                decimal_number = 13; break;
            case 'e':
                decimal_number = 14; break;
            case 'f':
                decimal_number = 15; break;
        }
    return decimal_number;
}

int entry_number_decoder(char address[7])
{
    int to_decode = 0;
    int entry_number = 0;

    for (int i = 0; i < 8; i++)
    {
        to_decode = (int) address[i] - 48;  //for 0 - 9 dealing with ASCII locations

        if (to_decode > 9)
        {
            to_decode = hex_to_dec(address[i]);  //converts hex numbers A - F to decimal
        }

        if (i >= 3)
        {
            switch (i)
            {
                case 3:
                to_decode *= 256; // set = set * 16^2
                entry_number += to_decode;
                break;
                case 4:
                to_decode *= 16; // set = set * 16^1
                entry_number += to_decode;
                break;
                case 5:
                to_decode *= 1;
                entry_number += to_decode;
                entry_number /= 4;
                break;
            }
        }
    }
    return entry_number;
}

void scan(FILE *input_file, FILE *output_file, address PC_array[])
{
    int place = 0;
    int i = 0;
    int char_counter = 0;
    char current_char = 0;
    while (fscanf(input_file, "%c", &current_char) != EOF)
    {
        if (current_char != '\n')
        {
            PC_array[i].current_address[char_counter] = current_char;
        }

        char_counter++;
        if (char_counter >= 7)
        {
            place = entry_number_decoder(PC_array[i].current_address);
            PC_array[place].entry_number = place;
            strcpy(PC_array[place].current_address, PC_array[i].current_address);
            i++;
            char_counter = 0;
        }
    }
}

void test_print(address PC_array[], FILE *output_file)
{
    for (int i = 1; i < 1025; i++)  //addressing here may cause issues  
    {
        if (PC_array[i + 1].entry_number == PC_array[i].entry_number + 1)
        {
            fprintf(output_file, "%d   %s   %s", PC_array[i].entry_number, PC_array[i].current_address, PC_array[i + 1].current_address);
            fprintf(output_file, "\n");
        }

        //branch or jump
        else
        {
            fprintf(output_file, "%d\n", 0);
        }
    }
}

Просто для справки, вот пример первые 20 значений адресов, с которыми я работаю: 400190 400194 400198 40019c 4001a0 4001a4 4001a8 4001ac 4001b0 4001b4 4001b8 4001bc 4001c0 4001c4 4202b0 4202b4 4202b8 4202bc 4202c0 4202c4 ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...