x86指令设置奇偶、溢出和符号标志

4

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


1
这个答案可能会有所帮助:http://stackoverflow.com/a/15330350/3857942 - Michael Petch
3
"我已经尝试过这些STP,STS等指令。" 而不是猜测是否存在某个指令,请在英特尔的指令集手册中查找。 - Michael
1
这不是重复的问题。另一个答案问是否可以同时设置所有三个。完全不同的问题,完全不同的答案。我希望关闭者在关门前仔细阅读问题。 - Ira Baxter
@IraBaxter: 这正是我没有投票关闭并提供了一个相关但不是重复的SO答案链接的原因。答案中的一些信息可以用来解决这个问题,但在我看来它绝对不是重复的。 - Michael Petch
1个回答

8
不,这些命令并不存在。你需要仔细阅读指令参考手册来获取信息。
实际上,它们也不是必须存在的。你可以很容易地有效地实现它们。以下是其中一种方法,如果你不介意其他位被设置的话:
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时代遗留下来的,当时它对于进行各种多精度算术运算很有用,并且不破坏寄存器是非常好的事情。)


1
你可以通过执行 test al, 0 来清除奇偶校验和符号标志,而不会破坏寄存器。0 AND x 的结果始终为零,因此 al 的旧内容并不重要。此外,您可以使用 OR AL, 0FFh 设置 PF,而不考虑先前的内容。除了溢出标志之外,SAHF/modify AH/LAHF 比 pushfd/popfd 更有效率。 - Peter Cordes
2
@PeterCordes: OP询问如何设置这些位; 我同意您的计划来清除它们。 OR AL 0FFH如何清除设置奇偶校验位?有8个一位,即偶数奇偶校验。我提供了PUSHFD序列,适用于那些不能损坏寄存器的情况。 - Ira Baxter
哦,我这个脑抽了,你说的PF是对的。我当时想的是“FF是奇数”之类的东西。而且关于不让pushf破坏寄存器的观点也很好。位移指令与标志位有有趣的交互作用,但总是以数据相关的方式进行,对于想要提出单指令序列并没有帮助。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接