汇编——实际汇编编程中进位和溢出标志的使用

Assembly - use of carry and overflow flags in actual assembly programming

看了http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt,我明白进位标志用来表示一些"data loss"/"out of bounds",溢出标志用来表示"most significant bit is on/off whereas they were off/on previously"。我还看到了另一个答案,它在检查 signed/unsigned 数字的标志时给出了提示:

"check for negative and overflow flags when dealing with signed numbers and carry flags with unsigned." (抱歉,我找不到那个答案供参考)

我了解标志的关联,但据我所知,标志检查示例的情况仅指示何时设置标志,我不太了解进位标志和溢出标志在错误检查之外的使用。

例如 jajg 的标志,我读到一个回答说:

ja jumps if CF = 0 and ZF = 0 jg jumps if ZF = 0 and SF = OF

(Difference between JA and JG in assembly)

我了解零标志的用途(检查它们是否不相等),但对 CF 和 SF/OF 了解不多。

以下是我的解释,无视 ZF 作为先决条件

ja (unsigned):如果CF = 0,则第一个操作数没有"borrow out"进行减法。因此,如果 ZF = 0,则比较为真。

jg (signed):如果SF(我相信我们称它为负标志)和OF(我们称它为oVerflow标志)都是0,这意味着两个操作数都是正数并且结果也是正数,表明lhs >= 右侧; 无法理解它们同时为 1 或 SF != OF 的情况,因为我不明白这如何表示 lhs >= rhs 和 lhs < rhs。

编辑:我一直在测试 SF = 1 和 OF = 1 的情况,但我只遇到过它们都等于 0 的情况。因此我不明白为什么 SF = OF 可以作为比较。例如,1000 - 1000、1000 - 0100。 我是否误解了这种比较的意图,即它永远不会达到 SF = 1 和 OF = 1,只有当它们不等于互相,结果会是假的?

感谢您花时间阅读本文以及任何关于如何在本示例中使用标志的指示,将不胜感激如何在通用汇编代码中使用标志。如果我遗漏了任何需要的信息,请告诉我。

如果标志由 cmp eax, edx 设置,"condition" 助记符(如上面的 A)有效。

例如在 cmp edx,eax 之后,如果 edx > eax(无符号比较),则上述条件为真,
如果 edx > eax(有符号比较),则更大的条件为真。

查看 http://felixcloutier.com/x86/Jcc.html or http://felixcloutier.com/x86/SETcc.html 中每个条件的定义,如果您好奇,可以自己研究一下。

检查 "data loss" 或溢出是标志的一个用例(以及它们的名称的来源),但在比较之后检查它们更为常见。