2017-07-29 34 views
0

EFLAGS寄存器有一个进位标志和一个溢出标志,我想知道这些标志有什么用处。EFLAGS寄存器中的进位标志和溢出标志的用途是什么?

我能想到以下用途:

  • 如果我增加两个无符号整数,我想知道,如果 除了是成功的(也就是装在指定的寄存器的结果/内存),然后我会检查进位标志是否设置为 (如果没有设置,则添加成功)。

  • 如果我添加两个有符号数(2的补数),并且我想要 知道增加是否成功(也就是说,结果符合指定的寄存器/存储器而没有溢出符号位),那么我会检查是否设置了 溢出标志(如果未设置,则添加 成功)。

这些用法是否正确?还有其他用途吗?

+0

https://en.wikipedia.org/wiki/Carry_flag和https://en.wikipedia.org/wiki/Overflow_flag –

+0

进位标志的用法在重复的文章中有很好的讨论,但是,另一部分不是。我还没有看到使用OF的任何技巧,但会有兴趣。 –

回答

2

标志是控制状态指令的唯一方法,条件跳转是条件跳转(jCC)和条件移动(cmovCCfcmovCC)。因此,每当你想根据一些条件进行选择,如

  • 是两个数字相等吗?
  • 比另一个大吗?
  • 是一个数字零?
  • 是一个数字中的某个位?
  • 是偶数还是奇数?

您需要标志寄存器。为此,存在cmp指令。它减去其操作数,丢弃结果并设置标志。这样,您可以比较数字并根据结果进行操作。有关两个数字的顺序如何影响标志,请参见this table

最后,您还可以使用标志(特别是进位标志)进行大量的添加。使用adcsbb指令可以方便地进行这些操作,这些指令可以传送从低位到高位的进位或借位。

+0

我在问题中给出的用法如何,它们是正确的吗? –

+1

是的,但它们不是很常见。 – fuz

+0

@joseph_m通常你可以通过设计代码和清理输入值来解决任何数据类型溢出问题,所以在计算过程中你不会再检查进位/溢出,因为你确定结果可能合适,或者预计您的设计会溢出并适当处理。每次算术后动态检查它在特殊情况下可能是有效的(像评估用户表达一样动态的“计算器”,溢出时抛出“错误”),但大多数SW被设计为运行它的主要计算没有检查它快得多)。 – Ped7g