不同符号数的算术溢出,6502 汇编

Arithmetic overflow for different-signed numbers, 6502 assembly

6502 程序集的编号可以带符号或不带符号,具体取决于是否设置了第七位。如果是有符号数,取值范围是-128到127,如果不是,取值范围是0到255。我的问题是:如果我把一个有符号数和一个无符号数加在一起会怎样?我将如何解释溢出?对于已签名的变体,我会默认结果溢出吗?我正在尝试为模拟器实施 adc 指令,这是我考虑的一个细微差别。

一个数是否有符号完全是程序员的问题; 6502 不会根据程序员的意图区分行为。

既然如此,溢出总是在假设两个数字都有符号的情况下计算的。

具体测试ADC是:如果输入的两个数符号相同,结果符号不同,则设置溢出。否则清除它。

这等同于问:结果的符号不对吗?由于所涉及的范围,将不同符号的数字相加永远不会溢出,并且将相同符号的数字相加永远不会产生不同符号的数字。

因此,典型的 C 风格实现可能如下所示:

overflow = ~(a^operand) & (a^result) & 0x80;

顺便说一句,即使在十进制模式下,这也是计算溢出的方式,尽管使用了结果的中间版本。这不是提供有用信息的尝试,它只是一个副作用——溢出在十进制算术中并不真正意味着任何东西。