【问题标题】:the carry flag issue!携带标志问题!
【发布时间】:2010-05-25 03:21:21
【问题描述】:

假设 AX =FFFE 和 BX=1234
现在如果我们写cmp ax,bx
(将从 ax 中减去 bx 并更新相应的标志) 现在 ax 和 bx 中数字的二进制表示为

    AX =    1111    1111    1111    1110
   BX=     0001    0010    0011    0100


因为 bx 将从 ax 中减去,所以我们必须否定 bx(因为 Result= ax+(-bx)) 所以取反的 bx(bx 的 2 补码)由下式给出。

BX=    1110    1101    1100    1100

现在我们将 ax 和 bx 都相加(因为减法是通过计算机中的加法实现的)

    AX=   1111    1111    1111    1110
   BX=   1110    1101    1100    1100
    ------------------------------------
      1  1110    1101    1100    1010 

现在你可以看到结果是 17 位,现在第 17 位应该进入进位标志,但是当我检查它时,进位标志是 0,即 CF=0 为什么?

【问题讨论】:

    标签: assembly assemblyinfo


    【解决方案1】:

    在这里找到一个链接: http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-2.html

    正如我所料。只有在需要“借位”时才设置进位标志。做减法时,你在做“减法”之前设置进位标志,新的进位标志告诉你是否必须借用。您的示例省略了为第 17 位中的预设进位标志添加 1,这将导致结果中没有进位。

    【讨论】:

      【解决方案2】:

      在执行减法时将进位标志视为借位。它被初始化为 1,所以操作是a−b−C,即a + not(b) + C,而不是你描述的a + not(b) + 1。换句话说,进位是反相减法,所以它可以用来做多精度减法。

      【讨论】:

        猜你喜欢
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        相关资源
        最近更新 更多