如何为8086手动更改标志(在汇编代码中)?

时间:2016-10-02 11:25:10

标签: assembly x86 x86-16 flags

有没有办法手动更改每个标志?或者你必须使用一个你知道会改变它们的结果的命令吗?

基本上我正在使用命令RCL,我不想在开始时获得1,所以我想将 CF 更改为0,我知道我可以使用如下命令:

mov al, 0
shl al, 1

但我想知道是否有其他方法可以做到这一点,而不使用其他命令结果。

我还想知道您是否可以向我展示,也可以用来更改所有标志,不仅包括CF,还包括OF,ZF等。

1 个答案:

答案 0 :(得分:3)

没有任何指令将eflags视为读写GP寄存器 引用英特尔 1

  

EFLAGS寄存器中的某些标志可以使用专用指令直接修改(如   以下部分)。 没有说明允许直接检查或修改整个注册   以下指令可用于将标志组移入和移出过程堆栈或EAX寄存器:
  LAHF,SAHF,PUSHF,PUSHFD,POPF和POPFD。将EFLAGS寄存器的内容转移到之后   在过程堆栈或EAX寄存器中,可以使用处理器的位操作来检查和修改标志   说明(BT,BTS,BTR和BTC)。

eflags寄存器分为三组:状态标志控制标志系统标志

eflags content

状态标志中,只能使用clcstccmc直接操作 CF
没有阅读 CF 的说明,但您可以使用cmovccadcsetcc等指令间接阅读。 所有其他标志需要使用专门定制的算术指令或将eflags状态组内容复制到ah(带lahf)或堆栈(使用pushfd)而不是eflagssahfpopfd)。

控制标记组中,只有 DF 可以使用cldstd进行操作。
要阅读DF的当前值,您需要使用pushfd

系统标志通常通过执行某些特权操作来间接操作,例如切换任务,进入v86模式等。 可以使用clisti直接操作 IF 所有其他标志只能使用pushfd / popfd进行操作。

供参考:

  • 在64位模式下,标志寄存器为rflags,但到目前为止保留了较高的32位,因此rflags被处理为eflags
  • pushfdeflags推送到堆栈上。还有一个16位版本pushf仅推送eflags的低16位。 popfd / popf也是如此。
  • lahf / sahf仅复制状态标志。

1 英特尔手册,第1卷,第3.4.3节。