Assembly 组件中的进位标志、辅助标志和溢出标志

Assembly 组件中的进位标志、辅助标志和溢出标志,assembly,x86,overflow,eflags,Assembly,X86,Overflow,Eflags,我似乎无法区分汇编中的进位标志、辅助标志和溢出标志之间的区别。我目前正在学校学习,老师没有透露任何细节。请帮助我理解,我考试时需要它。我会非常感激的!!从现在我似乎知道的是,当你尝试时使用进位标志,比如说,255+9,当你只有8位的数据时,辅助标志是相同的,但只有最后4位??当二进制数为7位,符号为8位(最左边)时使用溢出?进位标志是在以下情况下设置的标志: a) 添加了两个无符号数字,结果大于保存该数字的寄存器的“容量”。我们想添加两个8位数字,并将结果保存在8位寄存器中。在您的示例中:255

我似乎无法区分汇编中的进位标志、辅助标志和溢出标志之间的区别。我目前正在学校学习,老师没有透露任何细节。请帮助我理解,我考试时需要它。我会非常感激的!!从现在我似乎知道的是,当你尝试时使用进位标志,比如说,255+9,当你只有8位的数据时,辅助标志是相同的,但只有最后4位??当二进制数为7位,符号为8位(最左边)时使用溢出?

进位标志是在以下情况下设置的标志:

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位的进位,即从低半字节到高半字节的进位时,设置辅助标志。()

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

你可以在维基百科上阅读更多关于旗帜的信息

Carry Flag 在二进制/整数数学中打开进位标志的规则有两条:

  • 如果两个数字相加导致进位,则设置进位标志 已添加的最高有效位(最左边)中。 1111+0001=0000(进位标志打开)

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

    • 0111+0001=1000(进位标志关闭[零])
    • 1000-0001=0111(进位标志关闭[零])
  • 在无符号算术中,观察进位标志以检测错误。

    在有符号算术中,进位标志告诉您没有什么有趣的信息。

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

  • 如果两个数字之和的符号位为off,则产生一个结果数 符号位打开时,“溢出”标志打开。 0100+0100=1000(溢出标志打开)

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

  • 否则,“溢出”标志将关闭

    • 0100+0001=0101(溢出标志关闭)
    • 0110+1001=1111(溢出标志关闭)
    • 1000+0001=1001(溢出标志关闭)
    • 1100+1100=1000(溢出标志关闭)
    请注意,您只需要查看三个符号位中的符号位(最左侧) 决定溢出标志是打开还是关闭的数字

    如果您正在执行二的补码(带符号)运算,则启用溢出标志 意味着答案是错误的-你加了两个正数,得到了一个 负数,或者您将两个负数相加得到一个正数。

    如果您正在执行无符号算术,则溢出标志不表示任何内容 并且应该被忽略。


    有关更多说明,请参阅:

    您在谈论什么微处理器?如果是x86,那么下面是指向所有标志的链接,并附有详细说明:。但在x86中,它实际上是“调整标志”而不是“辅助标志”。是的,这是正确的。通常,
    进位
    表示无符号,
    溢出
    表示有符号,辅助进位是一个模糊的东西,没有真正使用:)但它确实是从低4位到高4位的进位。我想知道每种处理器的区别,以便更好地理解它。那么16位处理器或x64呢?对于这个星球上的每个处理器都应该是一样的;)