0

http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt上阅读后之后,我了解到进位标志用于指示一些“数据丢失”/“越界”,溢出标志用于表示“最高有效位是开/关的,而它们之前是关/开的”。我还看到了另一个在检查有符号/无符号数字标志时给出提示的答案:

“在处理带符号的数字和携带无符号的标志时检查负和溢出标志。” (很抱歉,我无法再次找到该答案以供参考)

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

例如jaand的标志jg,我读了一个答案,上面写着:

如果 CF = 0 且 ZF = 0 则 ja 跳转 jg 如果 ZF = 0 且 SF = OF 则跳转

( JA和JG在汇编中的区别

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

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

ja (unsigned):如果 CF = 0,则没有从第一个操作数中“借出”减法。因此,如果 ZF = 0,则比较为真。

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

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

感谢您抽出宝贵时间阅读本文以及有关在此示例中如何使用标志以及如何在通用汇编代码中使用标志的任何指针,我们将不胜感激。如果我缺少任何需要的信息,请告诉我。

4

1 回答 1

1

如果标志由cmp eax, edx.

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

查看http://felixcloutier.com/x86/Jcc.htmlhttp://felixcloutier.com/x86/SETcc.html中每个条件的定义,如果您好奇,请自行解决。

检查“数据丢失”或溢出是标志的一个用例(以及它们的名称来自哪里),但在比较之后检查它们更为常见。

于 2018-10-23T04:51:08.237 回答