我正在尝试从一些反编译的汇编代码中汇总C代码并提出问题。我看到以下内容:
SUB_L10195A01:
...
call SUB_L1019CB90
db CCh; 'Œ'
SUB_L10026990:
push FFFFFFFFh
push L101EA0C5
什么是
db CCh; 'Œ'
有关?通常有一个
retn
之前
SUB_L10026990:
答案 0 :(得分:4)
db
来指定在“常规”程序集中间添加的任意字节,并且当反汇编程序开始查看完全没有意义的序列时,它们将其作为“最后的工具”插入;这里我不知道为什么你的反汇编程序在cc
中插入db
字节,因为cc
是通常的int 3
操作码(通常用于打入调试器) )。
编译器经常围绕“常规”函数发出它们以进行填充/对齐/调试; int 3
具有在查看反汇编和十六进制内存视图时易于发现的优点,并且如果意外执行则闯入调试器。您在call
之后找到它的事实意味着call
意味着永远不会从(exit(1)
或abort()
或类似的东西)返回;或者(但不太可能),它可能是程序员故意添加的(例如,以Visual C ++中的__debugbreak
内在形式)。
答案 1 :(得分:3)
这是'没有'。编译器假定被调用的函数永远不会返回。
此外,您的反汇编程序也知道这一点。代码0CCh
解码为int 3
,通常会暂停程序并显示错误。由于它之前的代码永远不会返回(或者假设如此),操作码不是列表的一部分,因此它被写为db 0CCh
而不是“指令int 3
”。
代码本身与上面的例程无关。编译器插入此字节以确保(1)如果程序超出范围,它将遇到此命令然后停止,以及(2)对齐下一个函数的第一个字节到(最有可能)是4的倍数,所以执行速度有一个小但实际的增益。
答案 2 :(得分:0)
Harold刚回答--CC是int3(调试中断)。