【问题标题】:Carry Flag, Auxiliary Flag and Overflow Flag in Assembly汇编中的进位标志、辅助标志和溢出标志
【发布时间】:2013-10-18 13:14:08
【问题描述】:

我似乎无法区分汇编中的进位标志、辅助标志和溢出标志。我目前正在学校学习,老师没有详细说明。请帮助我理解,我将需要它进行考试。我会很感激的!!从我现在似乎知道的是,当您尝试使用进位标志时,假设您只有 8 位数据时使用 255+9,辅助标志是相同的,但仅用于最后 4 位?当二进制数有 7 位并且符号使用 8(最左边)时使用溢出???

【问题讨论】:

  • 你在说什么微处理器?如果是 x86,那么这里是所有标志的链接,并附有详细说明:en.wikipedia.org/wiki/FLAGS_register。但在 x86 中,它实际上是“调整标志”而不是“辅助标志”。
  • 是的,你说得对。一般carry是无符号的,overflow是有符号的,auxiliary carry是一个不起眼的东西,没有真正用过:)但确实是从低4位到高4位的进位。
  • 好吧,我想知道每种处理器的区别,以便更好地理解它。
  • 16 位处理器或 x64 怎么样?
  • 这个星球上的每个处理器应该都是一样的 ;)

标签: assembly x86 overflow eflags


【解决方案1】:

携带标志

二进制/整数数学中打开进位标志的规则有两个:

  1. 如果两个数字相加导致进位,则设置进位标志 添加的最重要(最左边)位中。 1111 + 0001 = 0000(进位标志开启)

  2. 如果两个数字相减,也会设置进位(借位)标志 需要借入减去的最高有效(最左边)位。 0000 - 0001 = 1111(进位标志打开) 否则,进位标志关闭(零)。

    • 0111 + 0001 = 1000(进位标志关闭[零])
    • 1000 - 0001 = 0111(进位标志关闭 [零])

在无符号算术中,观察进位标志以检测错误。

在有符号算术中,进位标志告诉你什么有趣的东西。

溢出标志

二进制/整数数学中打开溢出标志的规则有两条:

  1. 如果两个数字的总和没有符号位产生一个结果数字 符号位打开时,“溢出”标志打开。 0100 + 0100 = 1000(溢出标志开启)

  2. 如果符号位打开的两个数字之和产生一个结果数字 关闭符号位,打开“溢出”标志。 1000 + 1000 = 0000(溢出标志开启)

否则“溢出”标志被关闭

  • 0100 + 0001 = 0101(溢出标志关闭)
  • 0110 + 1001 = 1111(溢出标志关闭)
  • 1000 + 0001 = 1001(溢出标志关闭)
  • 1100 + 1100 = 1000(溢出标志关闭)

请注意,您只需要查看三个中的符号位(最左边) 数字来决定溢出标志是打开还是关闭。

如果您正在执行二进制补码(有符号)算术,请打开溢出标志 意味着答案是错误的 - 你添加了两个正数并得到一个 负数,或者您将两个负数相加得到一个正数。

如果你在做无符号算术,溢出标志没有任何意义 并且应该被忽略。

更多说明请参考:http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt

【讨论】:

    【解决方案2】:

    携带标志是在以下情况下设置的标志:

    a) 添加了两个无符号数,结果大于保存它的寄存器的“容量”。例如:我们想添加两个 8 位数字并将结果保存在 8 位寄存器中。在您的示例中: 255 + 9 = 264 超过 8 位寄存器可以存储的值。所以值“8”将被保存在那里(264 & 255 = 8)并设置 CF 标志。

    b) 减去两个无符号数,然后从较小的数字中减去较大的数字。例如:1-2 的结果是 255,并且会设置 CF 标志。

    辅助标志用作 CF,但在使用 BCD 时。因此,当我们在 BCD 计算中出现上溢或下溢时,将设置 AF。 例如:考虑到 8 位 ALU 单元,当有从第 3 位到第 4 位的进位,即从低半字节进位到高半字节时,设置辅助标志。 (Wiki link)

    溢出标志被用作CF,但是当我们处理有符号数时。例如,我们想添加两个 8 位有符号数:127 + 2。结果是 129,但对于 8 位有符号数来说太多了,所以将设置 OF。当结果太小时类似 -128 - 1 = -129 超出 8 位有符号数字的范围。

    您可以在维基百科上阅读更多关于标志的信息

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 2019-03-27
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多