Эта программа принимает входной файл, состоящий из 30000+ шестнадцатеричных строк (в форме 0xXXXXXXXX) и выделяет кэш для часто видимых строк.
Бинарная переменная - это вывод каждой шестнадцатеричной строки в программу. Я назвал это двоичным, потому что я пытался перевести эти шестнадцатеричные значения файла в двоичный файл для смещения / маскирования / манипуляции.
Проблема в том, что на выходе получается набор целых чисел, и я не могу понять, как преобразовать их в пригодный для использования набор двоичных значений.
В while(1)
l oop у меня есть две переменные, выводящие одно и то же значение (для этого мне нужна только одна переменная, но обе используются в дальнейшем код, поэтому я сохранил их для тестирования.) Значение, которое они печатают, является n-ым индексом шестнадцатеричного набора целых чисел. Это выводит значение ASCII, и я не знаю, как это изменить.
Что я пробовал:
Изменение обработки файла с обработки символов на целочисленную обработку , Вот почему большинство переменных типов данных int8_t
. Я также не могу изменить этот тип данных. Я получаю множество ошибок приведения типов данных или ошибку сегмента. При использовании обработки символов большинство из этих типов были соответственно "char". Проблема не изменилась.
Преобразование выходного «двоичного» в двоичное вручную. Это либо приводит к множеству ошибок приведения типа, либо к ошибке сегмента. Если он работал, он выводил двоичную строку, которая была непригодна для использования, потому что я не мог манипулировать ею путем сдвига, и т. Д. c. Это также работает только для обработки символов.
Изменение параметров ввода файла. Кажется, ни один из параметров, которые я использовал, не работал. Я привык ко многим, их сложно перечислить здесь. Возможно, я мог использовать их неправильно, на данный момент я не знаю.
#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);
}