有效地比较具有不同长度的相对大量的字符串

时间:2015-11-28 03:10:45

标签: c++ assembly x86 strcmp

对于一个学校项目,我写了一个x86反汇编程序,所以我有一些更有用的东西,我想制作一个互补的汇编程序。问题是,我不确定如何有效地将操作码与char * s列表进行比较。

过度使用Strcmp肯定会导致滞后。对于那些有经验的人来说,最好的办法是什么?我应该切换前4个字符的双字并从那里继续吗?得到每个校验和?我认为这可以被看作是自以为是和有争议的,但肯定是一种可以接受的有效方式来做这样的事情。我只是不确定如何。我主要关心的是效率,因为我希望能够有一个你可以发送它的文件然后写它。

1 个答案:

答案 0 :(得分:2)

所以给定一个令牌,你需要弄清楚它是否是一个指令助记符。 (如果不是,它可以是符号声明,也可以是宏的一部分)。

请注意,每个助记符都有多个操作码,您需要根据操作数进行选择。 (例如mov r32, imm32mov r32, r/m32对比mov r/m32, imm32)。有时会有一个选择,一个编码比另一个短。 (例如,用于移位/旋转的特殊操作码,立即计数为1,或者您可以在add r32, imm8(符号扩展立即)与add r32, imm32之间进行选择。)或者因为这只是玩具汇编程序,保持代码简单,YASM生成更多最佳代码供实际使用。

使用字符串作为键查找内容的标准选择是Hash Table。 C ++有std::unordered_map。你是对的,线性搜索字符串表是个坏主意。你在前4个字符上做switch的想法并不差,但它在实践中不会很好用,因为你要识别的序列集非常稀疏。 (在2 ^ 32种可能性中只有几百个insn助记符,因此查找表不可行)。这就是哈希存在的原因。

我听说过的一个技巧是将关键字保留在符号表中,并带有一个标记,表明它们是关键字。因此,您只需要对令牌进行一次哈希表查找,而不是将其作为助记符查找,然后将其作为指令,然后作为符号。

有许多数据结构用于存储您可以匹配字符串的字典。 Trie或Radix Trie可能是个不错的选择。由于您需要获取关联数据,因此DAWG可能不是一个好的选择。

有许多不同的数据结构和算法,您通常可以期望找到具有正确搜索词的内容。 "将字符串与一组字符串匹配"但是,实际上并没有在第一页上提出关于哈希表的明显谷歌点击。如果您还不知道他们的存在,我不确定哪些搜索字词会找到哈希表。