Assembly 为什么CMP(比较)有时会在8086汇编中设置进位标志?

Assembly 为什么CMP(比较)有时会在8086汇编中设置进位标志?,assembly,x86-16,subtraction,Assembly,X86 16,Subtraction,我一直在阅读8086指令集,它说CMP(比较)可以设置进位标志。我知道比较减去两个操作数,但我想知道在这种情况下是否有人能提供一个例子 我就是不能理解加一个数字的想法,而负数将设置进位标志。我已经阅读了借用标志,但我只需要一个例子来阐明我对比较指令的理解 另外,我知道如果3-5=-2将设置负标志。。。何时设置进位? 进位标志在导致下溢或溢出的操作后设置。例如,从6中减去10将导致下溢并设置进位标志。类似地,向寄存器的最大值添加1将导致溢出并设置进位标志 在换档操作期间,进位标志也会被修改,它会被

我一直在阅读8086指令集,它说CMP(比较)可以设置进位标志。我知道比较减去两个操作数,但我想知道在这种情况下是否有人能提供一个例子

我就是不能理解加一个数字的想法,而负数将设置进位标志。我已经阅读了借用标志,但我只需要一个例子来阐明我对比较指令的理解

另外,我知道如果3-5=-2将设置负标志。。。何时设置进位?

  • 进位标志在导致下溢或溢出的操作后设置。例如,从6中减去10将导致下溢并设置进位标志。类似地,向寄存器的最大值添加1将导致溢出并设置进位标志
  • 在换档操作期间,进位标志也会被修改,它会被设置 从目标寄存器移出的最后一位的值
  • 位测试将被测试位的值放入进位 旗帜执行此操作的操作码:BT、BTC、BTR和BTS
  • 直接影响进位标志的说明:CLC、CMC和STC
  • 在比较过程中,进位标志的设置就像两个 操作数已被减去
  • 在求反(NEG)过程中,除非操作数为空,否则将设置进位标志 零,在这种情况下,它被清除

使用无符号算术时,通常设置进位标志。例如,添加两个无符号(其结果不符合寄存器)数字不会提升溢出标志,而只提升进位标志。但是,当使用有符号算术时,会在此类事件中设置溢出标志

在相关问题的整数加减之后,您可以找到将进位和溢出标志设置为0和1的示例。
您还可以找到模拟8位数字的带进位加法和带借位减法指令的示例C代码,您可以使用这些代码,也许可以获得更多示例

那里的输出格式如下:
127(127)-255(-1)-1=127(127)CY=1 OV=0

其中,每个数字都表示为其旁边的无符号和括号带符号(2的补码)。
=
之前的数字是ADC/SBB之前的进位标志
CY=
OV=
显示ADC/SBB后的进位和溢出标志

Compare的作用与不带借位的减法几乎相同,只是它只影响进位、溢出、符号和零标志(以及奇偶校验和辅助进位,但它们在这里并不重要),而不修改寄存器/内存中的任何数字。

作为一个简短的总结,我写这篇文章有两个目的。首先,它很有趣,更多关于计算机工作原理的知识总是有帮助的。其次,总会有一些程序直接操纵标志,了解标志对跳跃的影响是很有帮助的。例如,像 CMP-eax,ebx 某处JC 可能会混淆大多数开头反转器,但希望在本文之后不会混淆。享受:)

[重要提示:当我写出二进制数时,我将在我的示例中使用8位整数。请记住,虽然8位整数在编程中不常用,但我讨论的相同规则适用于具有更多位的整数]

CMP说明:

CMP指令通过对两个操作数执行隐含减法来操作。这意味着结果不会存储在内存中。减去它们之后,它会进行一些快速测试,更新Z、O、C、S和P标志。P或奇偶校验标志很少使用,因此为了简洁起见,我们将在本文中忽略它

二进制减法是通过将第一个操作数的第二个操作数的求反版本相加来执行的。这就像你在中学学到的,关于4+3=4-(-3),反之亦然。 在文章的最后,我将解释如何做到这一点,但我现在将讨论更重要的问题,因为破解或编码并不真正需要这些知识

符号和零标志:


CMP指令可以设置的四个标志-Z、O、C和S分别称为零、溢出、进位和符号标志。只要减法结果等于零,就会设置零标志。当然,只有当操作数相等时才会发生这种情况。减法结果为负数时设置符号标志。尽管我们倾向于认为这意味着符号标志与零标志的组合足以测试所有>>=<,而“我需要做个例子”这句话听起来像是家庭作业。如果您只是调试一些现有代码,并查看CY标志,我相信您会在一些ADD指令后看到它的设置。我正在创建自己的指令集体系结构,我正在阅读8086指令,并想知道比较(减去2个操作数并设置各自的标志)如何设置进位标志。我知道加法何时设置进位,但我对减法/进位(不要与借位混淆)有点怀疑。在8086(和许多其他产品)上,进位标志具有双重作用,代表减法或比较操作中的借位。如果进行比较时,所比较的值大于寄存器中的值,则存在借用,例如设置了CY标志。如果值与寄存器相同或小于寄存器,则不存在借位,CY被清除。我感到困惑的是,您谈论的是CMP和减法,但随后您会问“如何添加一个数字和一个负数来设置进位标志?”(简单:添加+1和-1。Boom,carry set。)《英特尔手册》解释了状态标志的工作原理。(第3.2节:二进制算术指令。)@faul:CPU将这两个数字视为无符号,以在ADD/ADC和SUB/SBB之后设置进位标志。ADD/ADC后,进位指示无符号和是否为o