【问题标题】:Default state of Direction Flag (DF) during x86 program executionx86 程序执行期间方向标志 (DF) 的默认状态
【发布时间】:2016-12-11 19:37:18
【问题描述】:

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

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

CLDSTD 指令自函数开始后未找到,也未找到其他可能影响 DF 标志的指令。
那么编译器是否假定自程序启动以来此标志的预定义状态,由加载程序提供,并在程序运行时保持不变?

【问题讨论】:

  • 复位时,方向标志被清除。在更改之前保存DF 并在之后恢复它被认为是礼貌的。
  • 调用约定/ABI 指定DF 的状态,编译器依赖于此。

标签: assembly x86 flags cpu-registers


【解决方案1】:

这是由您正在使用的平台的 ABI 指定的。 System V Intel386 ABI寄存器和堆栈框架一章)说:

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

AMD64 ABI (Dropbox link, since x86-64.org is down) 中保留了相同的要求(3.2.1 节 寄存器和堆栈帧):

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

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

【讨论】:

    【解决方案2】:

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

    MSDN on Direction Flag

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多