indirect_table
中的指针。索引6将取消引用空指针,索引7将取消引用table1
,索引0x01060600
和0x8B
最终将取消引用垃圾。因此,一切都将导致访问冲突。此switch语句(0-6)。虽然二进制文件没有对此数据的引用,但是如果已知0xFF
是EBX
或更高版本,它将引用此数据。编译器可能已确定0x29
将不是EBX
-0
,因此将间接表位置向后移动以正确排列内容。 0x29
在其中的作用是什么? 如果进行了优化,将不胜感激任何辅助阅读材料。
#1 楼
要么在某处进行检查,否则编译器知道edx
不小于41(0x29)。 0x3B可能由单个开关标签处理,因此编译器添加了此检查以避免双重内存查找(或者在源代码中的if
之前有一个实际的switch
)。检索跳转表条目索引-Visual C ++编译器始终将间接表放在跳转之后。 0x1009E7AB可能是前一交换机的间接表的一部分。而8B FF
是mov edi, edi
,这里用于对齐。我想我只在Windows DLL中看到过它,后者经常使用PGO和其他技巧来实现最后百分之几的性能。
评论
'mov edi,edi'对齐很好地被发现!感谢您的好答案。
– QAZ
13年8月27日在14:33