assembly INTEL 8008/8080/8085减法

kg7wmglp  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(133)

我找不到与INTEL 8008、8080和8085所做减法运算相关的这种特定情况的任何参考资料。这里的主题是减法在末尾执行的反向进位(即借位
那么处理器是如何处理减0的呢?因为0的二进制补码是0,所以不会有进位输出,所以遵循减法逻辑,进位将始终被设置(即意味着发生了借位),但在这种情况下,它是错误的。
在这种情况下,处理器是否应用加法运算的逻辑,其中进位不被反转?
多谢了,
Fausto

4xrmg8kj

4xrmg8kj1#

那么处理器是如何处理减0的呢?因为0的二进制补码是0,所以不会有进位输出,所以遵循减法逻辑,进位将始终被设置(即意味着发生了借位),但在这种情况下,它是错误的。
不是。减法的逻辑是对第二个操作数求补码,然后将第一个操作数、求补码的第二个操作数和进位输入相加。为了得到第二个操作数的二进制补码,进位输入总是1(借位输入=0)。对于8位零,这将给出x -0000000 ==> x + 11111111 + 1 ==> x + 100000000(进位输出=1,借位输出=0)。对零没有特殊处理。

abithluo

abithluo2#

8080使用“借用”类型的进位标志与减法。传入进位标志表示是否从结果中减去一个额外的1,传出进位标志表示减法是否从高位借用。
也就是说,对于sbc a, b(Zilog语法;我不知道8080语法):

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意味着:

uint16_t result = (uint16_t)a + (0x12 ^ 0xFF) + carry;
a = (uint8_t)result;
carry = (result >> 8) & 1;
// other flags


这与8080上的减法进位正好相反,它来自于-x == ~x + 1的恒等式。

相关问题