我有一个程序从文件中读取并将汇编代码转换为VM机器代码。根据操作码,说明具有不同的数据类型,因此我的读者看起来像这样:
while(!feof(inF)) {
fscanf(inF, "%s",&temp); //analyse first string and branch into if statement
printf("%s\n", temp);
if (strcmp(temp, "NOP") == 0 || strcmp(temp, "nop") == 0) {
fprintf(outF, "%i\n", 0);
}
else if (strcmp(temp, "LDI") == 0 || strcmp(temp, "ldi") == 0) {
opcode = LDI; //opcode 1
fscanf(inF," %c %d", &r1, &immediate); //get r1 and immediate
printf("R1: %i\n", r1);
printf("I: %i\n", immediate);
r1 = getReg(r1);
r2 = 0;
subop = 0;
output = (opcode << 27)|(r1 << 24)|(r2 << 21)|(subop << 16)|(immediate);
fprintf(outF, "%x\n", output);
}
}
读一行LDI A 1024
,我得到一个输出:
LDI
R1: 0
I: 1024
而不是预期的
LDI
R1: 65
I: 1024
fscanf
似乎没有阅读char
。我已经看过似乎适用于其他人的解决方案,但由于某种原因,它们似乎不适用于此。
答案 0 :(得分:1)
您已将变量immediate
声明为unsigned short
而行
fscanf(inF," %c %d", &r1, &immediate);
假设它是一个整数。在这种情况下,行为是不确定的。