gpt4 book ai didi

parsing - 使用 yyparse() 制作两遍汇编程序?

转载 作者:行者123 更新时间:2023-12-04 23:34:15 25 4
gpt4 key购买 nike

我正在为我正在处理的自定义微 Controller 编写汇编程序。我已经让汇编器达到了将指令汇编为二进制的程度。

但是,我现在在让标签正常工作时遇到问题。目前,当我的汇编程序遇到一个新标签时,它会存储标签的名称及其所指的内存位置。当指令引用一个标签时,汇编器会查找该标签并用适当的值替换该标签。

这很好,但如果在引用它的指令之后定义标签怎么办?因此,我需要让我的解析器对代码运行两次。

这是我目前的主要功能:

303 int main(int argc, char* argv[])
304 {
305
306 if(argc < 1 || strcmp(argv[1],"-h")==0 || 0==strcmp(argv[1],"--help"))
307 {
308 //printf("%s\n", usage);
309 return 1;
310 }
311 // redirect stdin to the file pointer
312 int stdin = dup(0);
313 close(0);
314
315 // pass 1 on the file
316 int fp = open(argv[1], O_RDONLY, "r");
317 dup2(fp, 0);
318
319 yyparse();
320
321 lseek(fp, SEEK_SET, 0);
322
323 // pass 2 on the file
324 if(secondPassNeeded)
325 {
326 fp = open(argv[1], O_RDONLY, "r");
327 dup2(fp, 0);
328 yyparse();
329 }
330 close(fp);
331
332 // restore stdin
333 dup2(0, stdin);
334
335 for(int i = 0; i < labels.size(); i++)
336 {
337 printf("Label: %s, Loc: %d\n", labels[i].name.c_str(), labels[i].memoryLoc);
338 }
339 return 0;
340 }

我在 flex/bison 配置中使用它。

最佳答案

如果这就是您所需要的,您就不需要完整的两遍汇编程序。如果在引用时未定义标签,则只需输出一个替代地址(例如 0x0000),并具有一个数据结构,其中列出了所有具有前向引用的位置以及它们所引用的符号。在文件的末尾(或块,如果您有本地符号),您只需遍历该列表并修补地址。

关于parsing - 使用 yyparse() 制作两遍汇编程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com