【问题标题】:assembler how does the jump if above works如果上面的工作,汇编程序如何跳转
【发布时间】:2014-01-06 15:33:46
【问题描述】:

我们正在比较两个值 1pi

然后我使用“如果高于则跳转”或如果更大则跳转:

我们有:

1 - pi < 0 

所以我们不会跳。

它只发生在条件:

x - value &gt; 0 是真的,对吧? jg中的溢出标志是如何工作的?

fcomp ; st0:1 , st1:pi

 fstsw ax   
 sahf 

ja nie_odejmuj ;

我们跳吗?

使用 FPU

【问题讨论】:

  • 请指定架构、平台和准确的比较方法。例如。对于 x86:设置 C0-C3 和手动复制标志的老式 FCOM?较新的 FCOMI 系列在标志中直接设置位?上证比较?别的东西?
  • @Netch: fcomi 和现代 comiss/sd 都设置 FLAGS 与旧版 x87 fstsw ax/sahf 相同。这不是巧合,显然它们就是这样设计的。 (可能是为了便于移植/采用,因为 CF 比 OF!=SF 更有用)。 Why do x86 FP compares set CF like unsigned integers, instead of using signed conditions?

标签: assembly x86 x87


【解决方案1】:

ja 需要 CF==0 和 ZF==0。它不检查OF。在 x87 标志中,这意味着 C0==0 和 C3==0。使用FCOMFCOMP等进行比较的条件正是ST(0) > ST(1)。

您不应该与形式条件差异混淆(因为ja 用于比较无符号数),因为 x87 条件标志不同并且使用特殊传输在此处传递。甚至可以看到完全不匹配的条件,但英特尔试图在条件和检查指令之间提供至少很大的相似性。

OTOH,jg,是的,使用fstsw+sahf 未传递的位检查其他条件。因此,即使与所需条件命名相同,也不适用于此处。

这是遗留问题,以及大量其他 x86 奇怪的解决方案。 (30 多年没有从头开始重新设计的开发并不能给出一致的结果。OTOH,所有这些都有很好的记录,所以你应该遵循已知的食谱。)

更新:顺便说一句,您也可以跳过sahf 并直接检查标志:

fstsw ax
test ax, 4100h
jz nie_odejmuj

代码较长,但表达的方法更清晰。

【讨论】:

  • 也更高效,因为test/je 可以在现代 x86 上宏融合成单个比较和分支微指令,同时仍与 pre-PPro 兼容(不使用 fcomi)。尽管此时 PPro fcomi / cmov 即使对于 32 位代码来说也几乎是基线,而 SSE/SSE2 更多的是 32 位代码。所以这更像是一个有趣的事实,而不是有用的优化+兼容性建议。
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多