9

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

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

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

4

4 回答 4

7
  • 在导致下溢或溢出的操作之后设置进位标志。例如,从 6 中减去 10 将导致下溢并设置进位标志。同样,寄存器最大值加 1 会导致溢出并设置进位标志。
  • 进位标志也在移位操作期间被修改,它被设置为从目标寄存器中移出的最后一位的值。
  • 位测试会将测试位的值放入进位标志。执行此操作的操作码:BT、BTC、BTR 和 BTS。
  • 直接影响进位标志的指令:CLC、CMC 和 STC。
  • 在比较期间,进位标志被设置,就好像两个操作数被减去一样。
  • 在取反(NEG)期间,除非操作数为零,否则会设置进位标志,在这种情况下它会被清除。
于 2011-11-07T16:55:26.020 回答
2

进位标志通常在使用无符号算术时设置。例如,添加两个无符号(其结果不适合寄存器)数字不会引发溢出标志,而只会引发进位标志。但是,当使用有符号算术时,会在这种情况下设置溢出标志。

于 2011-11-08T21:23:14.897 回答
1

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

那里的输出格式是这样的:
127( 127) - 255( -1) - 1 = 127( 127) CY=1 OV=0
每个数字都表示为旁边的无符号和带括号的有符号(2 的补码)。前面的数字=是 ADC/SBB 之前的进位标志。CY=OV=在 ADC/SBB 之后显示进位和溢出标志。

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

于 2011-11-08T22:42:02.617 回答
0

https://www.hellboundhackers.org/articles/read-article.php?article_id=729

作为一个快速总结,我写这篇文章有两个目的。首先,这很有趣,并且更多地了解您的计算机如何工作总是有帮助的。其次,总有一些程序会直接操纵标志,了解它们对跳跃的影响是有帮助的。例如,像 CMP eax,ebx JC 这样简单的东西可能会让大多数刚开始的逆向者感到困惑,但希望不会在本文之后。享受 :)

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

CMP指令:

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

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

标志和零标志:

CMP 指令可以设置的四个标志 - Z、O、C 和 S,分别称为零、溢出、进位和符号标志。只要减法的结果等于零,就会设置零标志。当然,这仅在操作数相等时发生。当减法的结果为负时,设置符号标志。尽管我们倾向于认为这意味着符号标志与零标志组合足以测试所有 > >= < 和 <=,但事实并非如此,因为即使第一个数字大于第二。这是因为溢出。

溢出标志:

有符号整数以二进制表示,其位数与无符号整数相同。当然,这意味着符号必须设置在整数的一位中。有符号整数将符号存储在 MSB(最高有效位)中。这意味着,虽然 00000001 转换为十进制的 1,但 10000001 转换为 -127。我将在本文后面讨论为什么它是 -127 而不是 -1 或 -2。当处理器执行减法时,如果减法低于 00000000 或高于 11111111,它会回绕。因此,如果您从正数中减去负数,或者从负数中减去正数,则答案可能会溢出边界。例如,100 - (-100) 等于 200,但 8 位有符号整数的最大值是 127,所以 200 将通过上边界并最终成为负数,即使它应该是正数。-100 - 100 也会出现同样的问题;它通过低端并在它应该为负时最终为正,从而导致下溢。请注意,下溢也会设置溢出标志,并且溢出将在本文中进一步指代上溢和下溢。CPU 对此进行检查,如果发生则设置溢出标志。

携带标志:

如果两个操作数都被解释为无符号整数,则设置进位标志,第一个更大。这很容易确定,因为只要减法通过 00000000 进入更高的范围 (11111111),就会发生这种情况。例如,00000001 - 00000010 = 11111111,因此设置了进位。但是,00000010 - 00000001 = 00000001,因此未设置进位。

于 2018-04-09T16:52:35.943 回答