x86程序执行期间方向标志(DF)的默认状态

时间:2016-12-11 19:37:18

标签: assembly x86 flags cpu-registers

在反汇编中,我经常看到正在使用字符串操作指令而不考虑方向标志(DF)的状态,如下所示:

or      ecx, 0FFFFFFFFh
xor     eax, eax
mov     edi, ebp
repne scasb
功能开始后未找到

CLDSTD指令,也没有其他可能影响DF标志的指令。
那么,编译器在程序启动后,假定程序运行时保持预定义的状态,并且在程序运行时保持不变?

2 个答案:

答案 0 :(得分:3)

这是由您正在使用的平台的ABI指定的。 http://scottcheng.github.io/cropit/(章节寄存器和堆栈帧)表示:

  

方向标志必须设置为“向前”(即零)   进入之前和退出职能的方向。

同样的要求保留在System V Intel386 ABI中( 3.2.1部分 寄存器和堆栈帧):

  

DF寄存器中的方向标志%rFLAGS必须清除(设置为   关于功能进入和返回的“前进”方向。

所以,是的,用户态代码可以安全地假设DF设置为零。

答案 1 :(得分:1)

编译器运行时(包括为操作系统编译的代码)将期望该标志处于某种状态。其他代码也可以使用这个假设,而不必经常清除标志。

MSDN on Direction Flag