Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何避免解析器中出现大量if-else语句_Assembly - Fatal编程技术网

Assembly 如何避免解析器中出现大量if-else语句

Assembly 如何避免解析器中出现大量if-else语句,assembly,Assembly,我是汇编程序设计领域的新手。我正在为一台机器设计自己的汇编程序。目前,我的汇编程序接受第一个标记(假设它是一条指令),然后尝试生成相应的目标代码。现在我需要将令牌与助记符池相匹配,然后生成相应的obj代码。问题是我目前使用if-else构造,即 if(strcmp(mnemonic_read, "mov")==0) // generate code for mov instr else if(strcmp(mnemonic_read,"cmp")==0) // generate code for

我是汇编程序设计领域的新手。我正在为一台机器设计自己的汇编程序。目前,我的汇编程序接受第一个标记(假设它是一条指令),然后尝试生成相应的目标代码。现在我需要将令牌与助记符池相匹配,然后生成相应的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语句的情况下完成所有这些吗?我可以通过
助记符读取
字符串变量调用函数吗?

您应该使用一种哈希表,而不是几十个if-else语句,甚至一个switch构造


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

这是一个常见的问题,有一个通用的解决方案(harold建议)

您可能需要研究lex/yacc或flex/bison,它们在*nix环境中工作得很好。Antlr做了类似的事情,但使用Java

例如,您可以使用lex(From):

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

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


这里有一个有用的指南和示例:

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

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

//将字符串映射到函数指针
//它以字符串(可能是操作数)作为参数
地图命令;
在构造函数或类似的初始化例程中,您需要设置哈希映射(基本上用作跳转表):

init(){
命令[“mov”]=cmd_mov;
命令[“cmp”]=cmd\u cmp;
...  
}
void cmd_mov(字符串操作数){
//生成移动指令
}
void cmd_cmp(字符串操作数){
//生成cmp指令
}
您只需通过

string助记符=助记符_read_cmd();
字符串操作数=助记符_read_op();
*(命令[助记符])(操作数);

如果每个函数需要不同数量的参数,则使用or
boost::function
而不是简单的函数指针可能是正确的选择。

为什么不使用真正的解析器呢?那么这个问题一开始就不存在了。有一些叫做元汇编程序的工具可以将助记符转换成目标代码。