我找不到与INTEL 8008、8080和8085所做减法运算相关的这种特定情况的任何参考资料。这里的主题是减法在末尾执行的反向进位(即借位那么处理器是如何处理减0的呢?因为0的二进制补码是0,所以不会有进位输出,所以遵循减法逻辑,进位将始终被设置(即意味着发生了借位),但在这种情况下,它是错误的。在这种情况下,处理器是否应用加法运算的逻辑,其中进位不被反转?多谢了,Fausto
4xrmg8kj1#
那么处理器是如何处理减0的呢?因为0的二进制补码是0,所以不会有进位输出,所以遵循减法逻辑,进位将始终被设置(即意味着发生了借位),但在这种情况下,它是错误的。不是。减法的逻辑是对第二个操作数求补码,然后将第一个操作数、求补码的第二个操作数和进位输入相加。为了得到第二个操作数的二进制补码,进位输入总是1(借位输入=0)。对于8位零,这将给出x -0000000 ==> x + 11111111 + 1 ==> x + 100000000(进位输出=1,借位输出=0)。对零没有特殊处理。
abithluo2#
8080使用“借用”类型的进位标志与减法。传入进位标志表示是否从结果中减去一个额外的1,传出进位标志表示减法是否从高位借用。也就是说,对于sbc a, b(Zilog语法;我不知道8080语法):
1
sbc a, b
uint16_t result = (uint16_t)a - b - carry; a = (uint8_t)result; carry = (result >> 8) & 1; // other flags
字符串这种类型的进位减法与6502(以及许多其他后来的CPU,如ARM)相反。在6502上,减法是通过NOTing参数并执行加法来实现的。sbc #$12意味着:
sbc #$12
uint16_t result = (uint16_t)a + (0x12 ^ 0xFF) + carry; a = (uint8_t)result; carry = (result >> 8) & 1; // other flags
型这与8080上的减法进位正好相反,它来自于-x == ~x + 1的恒等式。
-x == ~x + 1
2条答案
按热度按时间4xrmg8kj1#
那么处理器是如何处理减0的呢?因为0的二进制补码是0,所以不会有进位输出,所以遵循减法逻辑,进位将始终被设置(即意味着发生了借位),但在这种情况下,它是错误的。
不是。减法的逻辑是对第二个操作数求补码,然后将第一个操作数、求补码的第二个操作数和进位输入相加。为了得到第二个操作数的二进制补码,进位输入总是1(借位输入=0)。对于8位零,这将给出x -0000000 ==> x + 11111111 + 1 ==> x + 100000000(进位输出=1,借位输出=0)。对零没有特殊处理。
abithluo2#
8080使用“借用”类型的进位标志与减法。传入进位标志表示是否从结果中减去一个额外的
1
,传出进位标志表示减法是否从高位借用。也就是说,对于
sbc a, b
(Zilog语法;我不知道8080语法):字符串
这种类型的进位减法与6502(以及许多其他后来的CPU,如ARM)相反。在6502上,减法是通过NOTing参数并执行加法来实现的。
sbc #$12
意味着:型
这与8080上的减法进位正好相反,它来自于
-x == ~x + 1
的恒等式。