【发布时间】:2013-11-24 06:02:48
【问题描述】:
我正在尝试为 RiSC CPU 编写一个汇编程序,可笑的是简单的计算机 - 可以在此处找到更多信息 - Link to CPU information。
我用 C 语言编程已经有一段时间了,但我遇到了一个问题。我的汇编程序的第一步是找到所有标签并记下它们的位置,现在我正在尝试创建一个仅包含标签名称的数组,以及一个包含它们将指向的 asm 行的单独数组到。
我有以下函数可以解析一行汇编代码并找到标签:
int lcount=0;
int lineCount = 0;
char * BuildLabels(char * line, FILE *in, char *Labels[], char *LabelVals[])
{
char lineString = fgets(line,MAX_LENGTH,in);
if(lineString!=NULL)
{
char * FirstToken = strtok(line," \t\n");
if(FirstToken[0]!='#' || FirstToken != NULL)
{
if(FirstToken[strlen(FirstToken)-1]==':')
{
Labels[lcount] = FirstToken;
LabelVals[lcount] = lineCount;
printf("%s : %d\n",Labels[lcount],lcount);
lcount++;
}
lineCount++;
}
return Labels[lcount];
}else
{
return NULL;
}
}
main中的这段代码正在调用该函数
char *Labels[NUM_LABELS];
char *LabelVals[NUM_LABELS];
while(BuildLabels(lineString,input,Labels,LabelVals)!=NULL)
{
}
printf("%s:%s\n",Labels[0],Labels[1]);
printf("Exiting Now...\n");
当我运行这个程序时,我得到以下输出
Opening input...
Opening output...
start::0
done::1
count::2
neg1::3
startAddr::4
startAddr::startAddr:
Exiting Now...
Process returned 0 (0x0) execution time : 0.009 s
Press any key to continue.
所以..数组在函数中发生了变化,但它们在主函数中不受影响? 我希望最后一行是 start::done: 而不是 startAddr::startAddr。
我觉得这很奇怪,所以我编写了以下函数,当我尝试打印 Labels[0] 和 Labels1 时,它按预期改变了被调用函数和 main 中的字符串
void Testing(char *Labels[])
{
lcount = 0;
Labels[lcount] = "Testing";
lcount++;
Labels[lcount] = "Double Testing";
}
当我从 main 调用此函数然后尝试打印 Labels[0] 和 Labels1 时,它会打印出“Testing:Double Testing”
我不明白为什么之前的函数不能正常工作 - 这也不是功课,我想了解更多关于编译器/汇编器的信息,因为我习惯于使用 Verilog/VHDL 工作。
感谢任何帮助!
编辑:这最终成为我的解决方案,有人可以向我解释为什么这样做吗?
Labels[lcount] = malloc(strlen(FirstToken)+1);
strcpy(Labels[lcount],FirstToken);
【问题讨论】:
-
lcount和linecount是全局定义的吗?
标签: c arrays string function pointers