2016-12-11 25 views
4

拆卸时,常常看到不考虑方向标志(DF)的状态正在使用该字符串操作指令,是这样的:86在程序执行期间方向标志(DF)的默认状态

or  ecx, 0FFFFFFFFh 
xor  eax, eax 
mov  edi, ebp 
repne scasb 

CLDSTD指令没有找到,因为函数开始,既没有可能影响DF标志的其他指令。
因为程序启动后,编译器会假定这个标志的预定义状态,是否为加载程序,并在程序运行时保持不变?

+2

复位时,方向标志被清除。在更改之前保存“DF”被认为是礼貌的,然后再恢复它。 –

+3

调用约定/ ABI指定“DF”的状态,编译器依赖于此。 – Jester

回答

1

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

MSDN on Direction Flag

2

这是由该平台的ABI您使用规定。该System V Intel386 ABI(章寄存器和堆栈帧)说:

方向标志必须设置为“前进”(即零)进入前 方向,从一个函数退出。

方向在%rFLAGS寄存器标志DF必须清楚(设置为 :

同样要求在AMD64 ABI (Dropbox link, since x86-64.org is down)(部分3.2.1 寄存器和堆栈帧)保存“前进”方向)功能输入和返回。

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