在反汇编中,我经常看到正在使用字符串操作指令而不考虑方向标志(DF)的状态,如下所示:
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
功能开始后未找到 CLD
或STD
指令,也没有其他可能影响DF标志的指令。
那么,编译器在程序启动后,假定程序运行时保持预定义的状态,并且在程序运行时保持不变?
答案 0 :(得分:3)
这是由您正在使用的平台的ABI指定的。 http://scottcheng.github.io/cropit/(章节寄存器和堆栈帧)表示:
方向标志必须设置为“向前”(即零) 进入之前和退出职能的方向。
同样的要求保留在System V Intel386 ABI中( 3.2.1部分 寄存器和堆栈帧):
DF
寄存器中的方向标志%rFLAGS
必须清除(设置为 关于功能进入和返回的“前进”方向。
所以,是的,用户态代码可以安全地假设DF
设置为零。
答案 1 :(得分:1)
编译器运行时(包括为操作系统编译的代码)将期望该标志处于某种状态。其他代码也可以使用这个假设,而不必经常清除标志。