汇编-在实际汇编编程中使用进位和溢出标志

时间:2018-10-23 04:40:07

标签: assembly x86 overflow flags carryflag

在阅读http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt之后,我了解到进位标志用于指示某些“数据丢失” /“超出范围”,溢出标志用于指示“最高有效位为开/关,而它们之前已关闭/开启”。我还看到了另一个答案,可以在检查带符号/无符号数字的标志时提供提示:

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

我了解标志的关联,但据我所知,标志检查示例的用例仅指示设置标志的时间,我并不真正理解进位标志和溢出标志的用法除了错误检查。

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

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

Difference between JA and JG in assembly

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

下面是我的解释,不考虑ZF作为先决条件

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

jg (signed):如果SF(我相信它称为负标志)和OF(我们称为oVerflow标志)都为0,则意味着两个操作数均为正,结果也为正,表示lhs> = rhs; 无法将它们都设为1或SF!= OF的情况缠住我的头,因为我看不出这表示lhs> = rhs和lhs

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

感谢您抽出宝贵的时间阅读本文档以及有关本示例中如何使用标志的任何指针,将非常感谢您在常见的汇编代码中使用标志。让我知道我是否需要任何信息。

1 个答案:

答案 0 :(得分:1)

如果标志由cmp eax, edx设置,则“条件”助记符(如A表示上述)起作用。

例如在cmp edx,eax之后,如果edx > eax(无符号比较),则满足上述条件,
如果edx > eax(有符号比较),则条件为True。

请查看http://felixcloutier.com/x86/Jcc.htmlhttp://felixcloutier.com/x86/SETcc.html中每个条件的定义,并根据自己的意愿进行研究。

检查“数据丢失”或溢出是标志(及其名称的来源)的一种用例,但是比较后检查它们的情况更为普遍。