assembly - assembly 中的进位标志、辅助标志和溢流标志

标签 assembly x86 overflow eflags

我似乎无法区分 assembly 中的进位标志、辅助标志和溢出标志。我目前正在学校学习,老师没有详细说明。请帮助我理解,我将在考试中需要它。我将不胜感激!!从我现在似乎知道的是,当您尝试时使用进位标志,例如,当您只有 8 位数据时使用 255+9,辅助标志是相同的,但仅用于最后 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 位有进位即从低四位进位到高四位时,设置辅助标志。 ( Wiki link )

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

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

关于assembly - assembly 中的进位标志、辅助标志和溢流标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301498/

相关文章:

delphi - 调用汇编语言函数导致 "floating point stack check"异常

assembly - 如何使用 gcc 生成 Intel 语法的汇编代码?

c# - 在一个程序中组合 32 位和 64 位 DLL

html - 溢出, float ,高度困惑

overflow - 交换期间的堆栈溢出

html - 文本溢出 : ellipsis on middle span

C 函数编译成汇编代码

assembly - sin 和 cos 是如何在硬件上实现的?

c++ - 尝试创建 Windows 8 系统调用调用门函数

linux - SYSENTER/SYSEXIT 与 INT 0x80