拆卸时,常常看到不考虑方向标志(DF)的状态正在使用该字符串操作指令,是这样的:86在程序执行期间方向标志(DF)的默认状态
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
CLD
或STD
指令没有找到,因为函数开始,既没有可能影响DF标志的其他指令。
因为程序启动后,编译器会假定这个标志的预定义状态,是否为加载程序,并在程序运行时保持不变?
拆卸时,常常看到不考虑方向标志(DF)的状态正在使用该字符串操作指令,是这样的:86在程序执行期间方向标志(DF)的默认状态
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
CLD
或STD
指令没有找到,因为函数开始,既没有可能影响DF标志的其他指令。
因为程序启动后,编译器会假定这个标志的预定义状态,是否为加载程序,并在程序运行时保持不变?
编译器运行时(包括为操作系统编译的代码)会期望标志处于某种状态。其他代码也可以使用这个假设,并且不必一直清除标志。
这是由该平台的ABI您使用规定。该System V Intel386 ABI(章寄存器和堆栈帧)说:
方向标志必须设置为“前进”(即零)进入前 方向,从一个函数退出。
方向在
%rFLAGS
寄存器标志DF
必须清楚(设置为 :同样要求在AMD64 ABI (Dropbox link, since x86-64.org is down)(部分3.2.1 寄存器和堆栈帧)保存“前进”方向)功能输入和返回。
所以,是的,用户级代码可以安全地假定DF
设置为零。
复位时,方向标志被清除。在更改之前保存“DF”被认为是礼貌的,然后再恢复它。 –
调用约定/ ABI指定“DF”的状态,编译器依赖于此。 – Jester