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

def*_*def 6 x86 assembly flags cpu-registers

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

or      ecx, 0FFFFFFFFh
xor     eax, eax
mov     edi, ebp
repne scasb
Run Code Online (Sandbox Code Playgroud)

CLD或者STD在函数开始后没有找到指令,也没有其他可能影响DF标志的指令.
那么,编译器在程序启动后,假定程序运行时,假定程序运行时保持预定义状态,并且在程序运行时保持不变?

Dan*_*zar 6

这是由您使用的平台的 ABI 指定的。该系统V英特尔386 ABI(章寄存器和堆栈帧)说:

在进入函数之前和退出函数时,方向标志必须设置为“正向”(即零)方向。

相同的要求保留在AMD64 ABI(Dropbox 链接,因为 x86-64.org 已关闭)(第3.2.1寄存器和堆栈帧):

该方向标志DF%rFLAGS寄存器中必须明确的函数进入和返回(设置为“向前”的方向)。

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


Bo *_*son 1

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

MSDN 关于方向标志