有没有官方文档证明JL和JNGE的作用是一样的?

Is there any official document for proving that JL and JNGE work in the same way?

我必须证明 JLJNGE 是相同的,特别是都意味着

" if (left op < right op) then jump "

我可以从 University lecture resources 和 Whosebug 中看到一些关于这个问题的想法。 (http://ee.usc.edu/~redekopp/cs356/slides/CS356Unit5_x86_Control.pdfWhy does x86 have the redundant JNGE instruction?)

但是我在oracle x86 assembly reference doc等官方文档上看到的,只是说JLJNGE共享相同的操作,SF <> OF。

我更想提供一些给出“<”的官方文档。

我现在要做的是显示 SF <> OF 的意思是“<”。

如果两个助记符 assemble 指向相同的操作码,根据定义,机器将 运行 它们采用相同的方式。 CPU只能看到机器码,看不到asm源码。 (您不会在 asm 文档中看到 <,因为这仅适用于 FLAGS 由 cmpsub 设置的情况。)

是的,https://www.felixcloutier.com/x86/jcc scraped from Intel's official PDFs (https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html) 确认 JL 是“如果少则跳短(SF≠OF)”。

可能在 Intel 的第 1 卷中的某个地方,他们解释了 cmp + JCC 如何使助记符与它们命名的“语义”相匹配。另见 Assembly - JG/JNLE/JL/JNGE after CMP


至于FLAGS设置,cmp x, y就像x - y只是设置FLAGS。如果 y 是一个更大的数字,除非你已经签署溢出,否则结果将是负数(SF 集)。有关如何通过减法设置 OF 的详细信息,请参阅 http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt

注意,两个等宽数字相减只能溢出一次,不能溢出并一直绕回负数(或与正确结果同号)。

  • 如果 SF=1 并且没有溢出,x-y < 0 所以 x < y .
  • 如果 SF=0 并且没有溢出,x-y >= 0 所以 x < y
  • 是不正确的
  • 如果溢出,SF与正确结果的符号位相反。(这正是有符号溢出,请参阅链接指南)。 SF != OF 是这两个位的异或:翻转 SF 以找到正确结果的符号并查阅适当的无溢出情况之一。

所以我们可以证明 SF != OFcmp eax, edx / jl 的正确条件,当且仅当 eax < edx (有符号)。 结合官方文档描述他们的操作是jump if SF != OF,是的,我们已经证明JL(和JNGE)符合他们的助记符.如果您想通过定义 OF 的确切含义将其充实为更严格的证明,您可以。


如果你 运行 jl 在不同的指令之后,比如 add eax, edx,它仍然会检查这些标志,但它们的设置方式不会'这与一个 比另一个 没有任何关系。这就是为什么 < 不是 jl 本身的固有部分,只是如果你在 cmp 之后使用它会发生什么。 (或者在 test eax,eax 之后,设置 FLAGS ,即与零进行隐式比较,就像任何始终清除 OF 并根据结果设置 SF 和 ZF 的操作一样。)