3

我是汇编程序设计领域的新手。我正在为机器设计自己的组装器。目前,我的汇编器获取第一个标记(假设它是一条指令),然后尝试生成相应的目标代码。现在我需要将令牌与助记词池进行匹配,然后生成相应的 obj 代码。问题是我目前使用 if-else 构造,即

if(strcmp(mnemonic_read, "mov")==0)
// generate code for mov instr
else if(strcmp(mnemonic_read,"cmp")==0)
// generate code for cmp

我可以在不使用大量 if-else 语句的情况下完成所有这些操作吗?我可以通过mnemonic_read字符串变量调用函数吗?

4

3 回答 3

2

您应该使用一种哈希表,而不是几十个 if-else-statements 甚至是 switch-construct。

还要确保将您的“汇编器逻辑”与简单的解析器逻辑分开。

于 2012-09-07T13:13:59.683 回答
2

这是一个常见的问题,有一个共同的解决方案(哈罗德建议)。

您可能想要研究 lex / yacc 或 flex / bison,它们在 *nix 环境中运行良好。Antlr 做了类似的事情,但使用的是 Java。

例如,您可以使用 lex(来自http://dinosaur.compilertools.net/):

Lex 源是正则表达式和相应程序片段的表。该表被转换为一个程序,该程序读取输入流,将其复制到输出流并将输入划分为与给定表达式匹配的字符串。当每个这样的字符串被识别时,相应的程序片段就会被执行。

因此,在 lex 中,您可以指定标记(由正则表达式匹配)以及要生成的相应代码。您还可以将标记输入 yacc(另一个编译器编译器),您可以使用它为您的新语言生成编译器。

这是一个有用的示例指南: http: //ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

于 2012-09-07T14:58:42.213 回答
1

您可能需要某种哈希映射的关联数组来存储您的关键字。这基本上是一个由任何类型索引的数组(对您的问题有用的是一个字符串),它包含的值可能是一个函数指针。然后,您将为每个解析的命令调用不同的函数。

假设您正在使用代码片段中的 C++,您可以编写

// map strings to function pointers 
// which take a string (maybe the operands) as parameter
map<string, void (*)(string)> commands;

在构造函数或类似的初始化例程中,您需要设置哈希映射(基本上充当跳转表):

init() {        
    commands["mov"] = cmd_mov;  
    commands["cmp"] = cmd_cmp;
    ...  
}

void cmd_mov(string operands) {
    // generate move instruction
}
void cmd_cmp(string operands) {
    // generate cmp instruction
}

您只需通过以下方式调用该函数

string mnemonic = mnemonic_read_cmd();
string operands = mnemonic_read_op();
*(commands[mnemonic])(operands);

如果每个函数需要不同数量的参数,那么functionoidboost::function可能是正确的选择,而不是简单的函数指针。

于 2012-10-05T11:49:35.210 回答