有没有官方文档证明JL和JNGE的作用是一样的?
Is there any official document for proving that JL and JNGE work in the same way?
我必须证明 JL
和 JNGE
是相同的,特别是都意味着
" if (left op < right op) then jump "
我可以从 University lecture resources 和 Whosebug 中看到一些关于这个问题的想法。
(http://ee.usc.edu/~redekopp/cs356/slides/CS356Unit5_x86_Control.pdf 和
Why does x86 have the redundant JNGE instruction?)
但是我在oracle x86 assembly reference doc等官方文档上看到的,只是说JL
和JNGE
共享相同的操作,SF <> OF。
我更想提供一些给出“<”的官方文档。
我现在要做的是显示 SF <> OF 的意思是“<”。
如果两个助记符 assemble 指向相同的操作码,根据定义,机器将 运行 它们采用相同的方式。 CPU只能看到机器码,看不到asm源码。 (您不会在 asm 文档中看到 <
,因为这仅适用于 FLAGS 由 cmp
或 sub
设置的情况。)
是的,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 != OF
是 cmp 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 的操作一样。)
我必须证明 JL
和 JNGE
是相同的,特别是都意味着
" if (left op < right op) then jump "
我可以从 University lecture resources 和 Whosebug 中看到一些关于这个问题的想法。 (http://ee.usc.edu/~redekopp/cs356/slides/CS356Unit5_x86_Control.pdf 和 Why does x86 have the redundant JNGE instruction?)
但是我在oracle x86 assembly reference doc等官方文档上看到的,只是说JL
和JNGE
共享相同的操作,SF <> OF。
我更想提供一些给出“<”的官方文档。
我现在要做的是显示 SF <> OF 的意思是“<”。
如果两个助记符 assemble 指向相同的操作码,根据定义,机器将 运行 它们采用相同的方式。 CPU只能看到机器码,看不到asm源码。 (您不会在 asm 文档中看到 <
,因为这仅适用于 FLAGS 由 cmp
或 sub
设置的情况。)
是的,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 != OF
是 cmp eax, edx
/ jl
的正确条件,当且仅当 eax < edx
(有符号)。 结合官方文档描述他们的操作是jump if SF != OF
,是的,我们已经证明JL
(和JNGE
)符合他们的助记符.如果您想通过定义 OF
的确切含义将其充实为更严格的证明,您可以。
如果你 运行 jl
在不同的指令之后,比如 add eax, edx
,它仍然会检查这些标志,但它们的设置方式不会'这与一个 比另一个 没有任何关系。这就是为什么 <
不是 jl
本身的固有部分,只是如果你在 cmp
之后使用它会发生什么。 (或者在 test eax,eax
之后,设置 FLAGS