我遇到了以下x86(内置某些版本的Visual Studio AFAIK)开关语句:

indirect_table中的指针。索引6将取消引用空指针,索引7将取消引用table1,索引0x010606000x8B最终将取消引用垃圾。因此,一切都将导致访问冲突。此switch语句(0-6)。虽然二进制文件没有对此数据的引用,但是如果已知0xFFEBX或更高版本,它将引用此数据。编译器可能已确定0x29将不是EBX-0,因此将间接表位置向后移动以正确排列内容。 0x29在其中的作用是什么?

如果进行了优化,将不胜感激任何辅助阅读材料。

#1 楼

要么在某处进行检查,否则编译器知道edx不小于41(0x29)。 0x3B可能由单个开关标签处理,因此编译器添加了此检查以避免双重内存查找(或者在源代码中的if之前有一个实际的switch)。检索跳转表条目索引-Visual C ++编译器始终将间接表放在跳转之后。 0x1009E7AB可能是前一交换机的间接表的一部分。而8B FFmov edi, edi,这里用于对齐。我想我只在Windows DLL中看到过它,后者经常使用PGO和其他技巧来实现最后百分之几的性能。

评论


'mov edi,edi'对齐很好地被发现!感谢您的好答案。

– QAZ
13年8月27日在14:33