x86-64 汇编语言中的符号和溢出标志如何确定 CMOVL 和 CMOVNG 中的 "less than"?
How are the sign and overflow flags used in x86-64 assembly language to determine "less than" in CMOVL and CMOVNG?
我正在阅读 [AMD64 架构程序员手册第 1 卷:应用程序编程][1]。在关于 CMOVcc 的第 47 页上,它有一个 table 声明:
CMOVL
CMOVNGE SF <> OF Conditional move if less
Conditional move if not greater or equal
首先,我不确定 <>
在这里的确切含义。但我猜它的意思是“符号标志与溢出标志相反”。所以我的问题的第一部分是,“我说得对吗?”
但我的主要问题是,如何确定“小于”的定义可以用这2个标志的条件表示?例如,学习标准后在学校学习数学时,我的大脑基本上按照描述的方式执行以下操作:
mov rax, 15
mov rbx, 50
cmp rbx, rax
我只是“看到”50 是一个比 15 更大的数字,并且立即知道 50 是更大的数字。我知道这可能是因为更大的数字有更多的数字,前面没有 .
也没有 -
。
但是,根据我到目前为止所学的知识,CPU 无法“看到”这一点,而是执行减法运算,然后使用生成的标志来“知道”哪个数大哪个数小
有人可以解释一下这些关于符号标志和溢出标志的规则如何明确地告诉我一个数量小于另一个数量吗?
[1]: https://www.amd.com/system/files/TechDocs/24592.pdf
考虑每种情况:
A B A - B < S V
127 1 126 F 0 0
1 127 -126 T 1 0
127 -1 -128 F 1 1
-127 1 -128 T 1 0
-127 2 127 T 0 1
我正在阅读 [AMD64 架构程序员手册第 1 卷:应用程序编程][1]。在关于 CMOVcc 的第 47 页上,它有一个 table 声明:
CMOVL
CMOVNGE SF <> OF Conditional move if less
Conditional move if not greater or equal
首先,我不确定 <>
在这里的确切含义。但我猜它的意思是“符号标志与溢出标志相反”。所以我的问题的第一部分是,“我说得对吗?”
但我的主要问题是,如何确定“小于”的定义可以用这2个标志的条件表示?例如,学习标准后在学校学习数学时,我的大脑基本上按照描述的方式执行以下操作:
mov rax, 15
mov rbx, 50
cmp rbx, rax
我只是“看到”50 是一个比 15 更大的数字,并且立即知道 50 是更大的数字。我知道这可能是因为更大的数字有更多的数字,前面没有 .
也没有 -
。
但是,根据我到目前为止所学的知识,CPU 无法“看到”这一点,而是执行减法运算,然后使用生成的标志来“知道”哪个数大哪个数小
有人可以解释一下这些关于符号标志和溢出标志的规则如何明确地告诉我一个数量小于另一个数量吗? [1]: https://www.amd.com/system/files/TechDocs/24592.pdf
考虑每种情况:
A B A - B < S V
127 1 126 F 0 0
1 127 -126 T 1 0
127 -1 -128 F 1 1
-127 1 -128 T 1 0
-127 2 127 T 0 1