有效地比较相对大量的不同长度的字符串
Efficiently comparing a relatively large number of strings with varying lengths
为了一个学校项目,我编写了一个 x86 反汇编程序,只是为了让我有一些更有用的东西,我想制作一个补充汇编程序。问题是我不太确定如何有效地将操作码与 char* 列表进行比较。
strcmp用多了肯定会卡顿。对于有经验的人来说,最好的做法是什么?我应该切换前 4 个字符的双字并从那里继续吗?得到每个校验和?我想这可能被视为自以为是和有争议的,但肯定有一种公认且有效的方法来做这样的事情。我只是不太确定如何。我主要关心效率,因为我希望能够有一个文件,您可以发送它并写入它。
所以给定一个token,你需要弄清楚它是不是一个指令助记符。 (如果不是,它可能是一个符号声明,或者是宏的一部分)。
注意每个助记符都有多个操作码,需要根据操作数来选择。 (例如 mov r32, imm32
对比 mov r32, r/m32
对比 mov r/m32, imm32
)。有时有一个选择,一种编码比另一种更短。 (例如,shift/rotate 的特殊操作码,立即数为 1,或者当您可以在 add r32, imm8
(符号扩展立即数)与 add r32, imm32
之间进行选择时。)或者因为这只是一个toy assembler, 保持代码简单,YASM 为实际使用生成更优化的代码。
使用字符串作为关键字查找内容的标准选择是 Hash Table. C++ has std::unordered_map。你是对的,对 table 字符串进行线性搜索是个坏主意。您对前 4 个字符执行 switch
的想法不错,但在实践中效果不佳,因为您要识别的序列集非常稀疏。 (在 2^32 种可能性中只有几百个 insn 助记符,所以查找 table 是不可行的)。这就是散列存在的原因。
我听说过的一个技巧是将关键字保留在符号 table 中,并带有一个标志,表明它们是关键字。所以你只有一个 hash-table 查找令牌,而不是将其作为助记符查找,然后作为指令,然后作为符号查找。
有许多数据结构可用于存储可以匹配字符串的字典。 Trie 或 Radix Trie 可能是一个不错的选择。由于您需要获取关联数据,因此 DAWG 可能不是一个好的选择。
有许多不同的数据结构和算法,您通常可以期望找到具有正确搜索词的内容。不过,"match string against a set of strings" 实际上并没有在第一页上提出任何关于散列 table 的明显 google 命中。如果您还不知道它们的存在,我不确定哪些搜索词会找到散列 tables。
为了一个学校项目,我编写了一个 x86 反汇编程序,只是为了让我有一些更有用的东西,我想制作一个补充汇编程序。问题是我不太确定如何有效地将操作码与 char* 列表进行比较。
strcmp用多了肯定会卡顿。对于有经验的人来说,最好的做法是什么?我应该切换前 4 个字符的双字并从那里继续吗?得到每个校验和?我想这可能被视为自以为是和有争议的,但肯定有一种公认且有效的方法来做这样的事情。我只是不太确定如何。我主要关心效率,因为我希望能够有一个文件,您可以发送它并写入它。
所以给定一个token,你需要弄清楚它是不是一个指令助记符。 (如果不是,它可能是一个符号声明,或者是宏的一部分)。
注意每个助记符都有多个操作码,需要根据操作数来选择。 (例如 mov r32, imm32
对比 mov r32, r/m32
对比 mov r/m32, imm32
)。有时有一个选择,一种编码比另一种更短。 (例如,shift/rotate 的特殊操作码,立即数为 1,或者当您可以在 add r32, imm8
(符号扩展立即数)与 add r32, imm32
之间进行选择时。)或者因为这只是一个toy assembler, 保持代码简单,YASM 为实际使用生成更优化的代码。
使用字符串作为关键字查找内容的标准选择是 Hash Table. C++ has std::unordered_map。你是对的,对 table 字符串进行线性搜索是个坏主意。您对前 4 个字符执行 switch
的想法不错,但在实践中效果不佳,因为您要识别的序列集非常稀疏。 (在 2^32 种可能性中只有几百个 insn 助记符,所以查找 table 是不可行的)。这就是散列存在的原因。
我听说过的一个技巧是将关键字保留在符号 table 中,并带有一个标志,表明它们是关键字。所以你只有一个 hash-table 查找令牌,而不是将其作为助记符查找,然后作为指令,然后作为符号查找。
有许多数据结构可用于存储可以匹配字符串的字典。 Trie 或 Radix Trie 可能是一个不错的选择。由于您需要获取关联数据,因此 DAWG 可能不是一个好的选择。
有许多不同的数据结构和算法,您通常可以期望找到具有正确搜索词的内容。不过,"match string against a set of strings" 实际上并没有在第一页上提出任何关于散列 table 的明显 google 命中。如果您还不知道它们的存在,我不确定哪些搜索词会找到散列 tables。