Как мне заставить эту программу выводить правильные значения? - PullRequest
0 голосов
/ 22 апреля 2020

Эта программа принимает входной файл, состоящий из 30000+ шестнадцатеричных строк (в форме 0xXXXXXXXX) и выделяет кэш для часто видимых строк.

Бинарная переменная - это вывод каждой шестнадцатеричной строки в программу. Я назвал это двоичным, потому что я пытался перевести эти шестнадцатеричные значения файла в двоичный файл для смещения / маскирования / манипуляции.

Проблема в том, что на выходе получается набор целых чисел, и я не могу понять, как преобразовать их в пригодный для использования набор двоичных значений.

В while(1) l oop у меня есть две переменные, выводящие одно и то же значение (для этого мне нужна только одна переменная, но обе используются в дальнейшем код, поэтому я сохранил их для тестирования.) Значение, которое они печатают, является n-ым индексом шестнадцатеричного набора целых чисел. Это выводит значение ASCII, и я не знаю, как это изменить.

Что я пробовал:

  1. Изменение обработки файла с обработки символов на целочисленную обработку , Вот почему большинство переменных типов данных int8_t. Я также не могу изменить этот тип данных. Я получаю множество ошибок приведения типов данных или ошибку сегмента. При использовании обработки символов большинство из этих типов были соответственно "char". Проблема не изменилась.

  2. Преобразование выходного «двоичного» в двоичное вручную. Это либо приводит к множеству ошибок приведения типа, либо к ошибке сегмента. Если он работал, он выводил двоичную строку, которая была непригодна для использования, потому что я не мог манипулировать ею путем сдвига, и т. Д. c. Это также работает только для обработки символов.

  3. Изменение параметров ввода файла. Кажется, ни один из параметров, которые я использовал, не работал. Я привык ко многим, их сложно перечислить здесь. Возможно, я мог использовать их неправильно, на данный момент я не знаю.

#include <stdio.h>
#include <assert.h>
#include <string>
#include <inttypes.h>
#include <cstring>
#include <fstream>
#include <stdint.h>
#include <bitset>

using namespace std;

#define MEMSIZE 20

int8_t *binary;


int8_t ctable_tags[512];
int8_t ctable[11];                
int8_t mm_fetch;
int8_t mm_fetchidx;
int8_t mm_fetchtag;            
int8_t cache_entryidx;      
int8_t cache_entrytag;      
int8_t cache_entry;  




void CacheTagTable() 
{
for(int i = 0; i < 0x200; i++)
{ 
    ctable_tags[i] = i;
}
}


void CacheRunCycle(char **argv) 
{    

//char memory[11];
char *file = argv[1];
ifstream trace;
trace.open(argv[1]); 
unsigned short A = atoi(argv[1]);
int8_t c_tag;
int8_t c_idx;
int miss = 0;
int hit = 0;
float miss_rate = 0;

    binary = new int8_t [1 << MEMSIZE];
    assert(binary);                               

while(1)
{

if(trace >> binary)
{
    //binary = convert_to_binary(memory); 

    int8_t bvalue = printf("memory fetch %s\n", binary); 

        for(int n = 0; n < 10; n++)
        { 
                mm_fetchidx = (binary[n]);    
                mm_fetchtag = (binary[n]); 
                mm_fetch = mm_fetchtag | mm_fetchidx;
                printf("fetch memory tag %c\n", mm_fetchtag); 
                printf("fetch memory index %c\n", mm_fetchidx); 

             c_idx = ctable[n];

             if(mm_fetchidx == ctable[n])
             {

                c_tag = ((ctable[11] >> 5) & 0xFF800000); 
                printf("Cache hit\n");
                hit = hit + 1;

                for(int k = 0; k < sizeof ctable_tags; k++)
                {
                    if(ctable_tags[k] == mm_fetchtag)
                    {
                        ctable[c_tag] = ctable_tags[k];
                    }
                }

                cache_entry = ctable[c_tag] | mm_fetchidx;
                ctable[n] = cache_entry;
             }

              else                     
             {

                 for(int k = 0; k < ctable_tags[k]; k++)
                {
                    if(ctable_tags[k] == mm_fetchtag)
                    {
                        ctable[c_tag] = ctable_tags[k];
                    }
                }

                c_tag = ((ctable[11] >> 5) & 0xFF800000); 
                printf("Cache miss\n");
                miss = miss + 1;   
                cache_entry = ctable[c_tag] | mm_fetchidx; 
                ctable[n] = cache_entry;

             } 

        }    
} 

else 
{
break;
}
}     
} 


int main(int argc, char *argv[]) 
{
CacheTagTable();
CacheRunCycle(argv);
}
...