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