Итак, мое задание - создать ассемблер на C. Так что большая часть работы у меня работает, но первая часть заключается в сканировании файла сборки, поиске меток и назначении правильного местоположения «счетчика программы» для каждой метки. Все прекрасно работает, если внизу нет метки с пустой строкой и директивой .end после нее. Я попытался напечатать каждую строку, чтобы увидеть, что она читает, и кажется, что она читает последнюю метку дважды, и, таким образом, она увеличивает счетчик моей программы в два раза для одной и той же метки, и это неверно только для этой метки, и я не могу выяснить, в чем проблема. Любая помощь приветствуется. На данный момент я не добавил никакой логики к каждой команде, кроме как для увеличения lc, потому что это все, что мне нужно сделать для завершения этой части atm.
int firstPass(FILE *infile, int labels[], int lc)
{
char line[LINE_SIZE] = {};
int lineCount = 0;
int done = 0;
int endFound = -1;
char c;
rewind(infile);
while (fscanf(infile, "%[^\n]", line) != EOF && lineCount < LIMIT && !done)
{
lineCount++;
fscanf(infile, "%c", &c);
removeSpaces(line);
toUpperCase(line);
if (line[0] != 0 && line[0] != ';')
{
if (!strncmp(line, ".END", 4))
{
done = 1;
endFound = 0;
}
else if(!strncmp(line, "LDR", 3))
{
lc++;
}
else if(!strncmp(line, "LD", 2))
{
lc++;
}
else if(!strncmp(line, "ADD", 3))
{
lc++;
}
else if(!strncmp(line, "AND", 3))
{
lc++;
}
else if(!strncmp(line, "NOT", 3))
{
lc++;
}
else if(!strncmp(line, "STR", 3))
{
lc++;
}
else if(!strncmp(line, "ST", 2))
{
lc++;
}
else if(!strncmp(line, "BR", 2))
{
lc++;
}
else if(!strncmp(line, "TRAP", 4))
{
lc++;
}
else if (line[0] == 'L' && line[1] >= '0' && line[1] <= '9')
{
if (line[2] == '.')
{
labels[line[1] - '0'] = lc;
lc++;
}
else
{
labels[line[1] - '0'] = lc;
}
}
}
}
if (endFound == -1)
{
printf("ERROR 4: Missing end directive.\n");
}
return endFound;
}
Вот тестовый файл, который я использую.
;Test file for assembly
;This is a comment
.orig x3000
ADD R1, R2, R3
add R0, R3, #10
and R1, R1, R2
AND R0, R3, #-10
L0
BR L1
BRN L0
BRZ L1
BRP L0
BRNZ L1
BRNP L0
BRZP L1
BRNZP L0
LD R1, L2
LDR R1, R2, #-5
L1
NOT R3, R4
ST R5, L2
STR R6, R1, #-5
TRAP x20
TRAP x21
TRAP x22
TRAP x23
TRAP x24
TRAP x25
L2 .FILL 0
L3 .FILL 0
L4 .FILL 0
.END
Всякий раз, когда я печатаю этикетки на консоли, которые она печатает
L0
L1
L2 .FILL 0
L3 .FILL 0
L4 .FILL 0
L4 .FILL 0
Кажется, я не могу понять, почему он читает L4 дважды.