【问题标题】:x86 instructions to set parity, overflow, & sign flags用于设置奇偶校验、溢出和符号标志的 x86 指令
【发布时间】:2015-11-11 05:13:58
【问题描述】:

我们有STC 指令来设置进位标志。我们是否有类似的奇偶校验、溢出、符号标志等指令?我试过STPSTS 等,但似乎这些都不存在!

【问题讨论】:

  • 这个答案可能会有所帮助:stackoverflow.com/a/15330350/3857942
  • “我已经尝试过这些 STP、STS 等” 不要猜测指令是否存在,而是在 Intel's instruction set manual 中查找。
  • 这不是重复的。另一个答案询问是否可以同时设置所有三个。完全不同的问题,完全不同的答案。我希望关闭者在关上门之前仔细阅读问题。
  • @IraBaxter :这实际上是我没有投票关闭并提供指向另一个相关 SO 答案的链接(但不是重复的)的原因。答案中的一些信息可以用来解决这个问题,但它绝对不是重复的恕我直言。

标签: assembly x86 masm32


【解决方案1】:

不,这些命令不存在。找出方法是仔细阅读说明参考手册。

他们并不真正需要存在。 你可以很容易地有效地实现它们。 如果您不介意设置其他位,这是多种方法之一:

STP:  XOR  AL,AL  ; resets parity bit
      XOR  AL,1   ; ... then set parity bit

STO:  OR   AL, 0FFh
      SUB  AL, 080h ; sets overflow

STS:  OR   AL, 0FFh ; sets sign bit

如果你坚持只设置特定位:

      PUSHFD
      OR    dword ptr[ESP], <bitmask_for_flag_bit> ; see Intel manual
      POPFD

硅空间很宝贵,CPU 设计人员往往不会为容易完成的事情提供说明。 (STC 是 8080 天遗留下来的,它在做各种多精度算术时很有用,而且不损坏寄存器是一件非常好的事情)。

【讨论】:

  • 您可以通过 test al, 0 清除奇偶校验和签名标志,而不会破坏寄存器。 0 AND x 的结果始终为零,因此 al 的旧内容无关紧要。此外,您可以使用OR AL, 0FFh 设置PF,而不管之前的内容如何。另外,除了溢出标志之外,SAHF/modify AH/LAHF 比 pushfd/popfd 更有效。
  • @PeterCordes:OP 询问如何设置这些位;我同意你清除它们的计划。 OR AL 0FFH 如何清除 set 奇偶校验位?有8位,即偶数奇偶校验。对于不会损坏寄存器的情况,我提供了 PUSHFD 序列。
  • 哦,脑子放个屁,你对 PF 的看法是对的。我在想“FF是一个奇数”之类的。关于不pushf 不破坏注册表的好点。移位指令与标志有有趣的交互,但总是以数据相关的方式,这无助于提出单指令序列。
猜你喜欢
  • 2013-04-04
  • 2017-08-16
  • 2015-10-30
  • 2011-04-24
  • 1970-01-01
  • 2015-06-29
  • 2012-12-06
  • 2012-01-22
  • 2014-10-31
相关资源
最近更新 更多