【问题标题】:Are the bytes stored in 6502 memory signed or unsigned?存储在 6502 内存中的字节是有符号的还是无符号的?
【发布时间】:2017-07-30 07:33:09
【问题描述】:

在为我的 6502/NES 仿真器创建指令函数时,我一直在理解 6502 中的有符号字节和二进制补码的概念。显然,诸如 BMI 之类的分支指令使用内存中的有符号字节进行前向/后向分支, 并且一些指令允许对负数进行算术运算。负标志也检测累加器的第 7 位。 (二进制补码)

这是否意味着内存中的所有字节都已签名,我可以将内存初始化为 int8_t CPUMEMORY[0x10000]; 而不是 uint8_t CPUMEMORY[0x10000]

但令我困扰的是,当运算结果超过无符号 8 位限制(即 255)时会设置进位标志。但是如果所有字节都已签名,这不应该是 127 吗? (溢出标志是这样做的,但是有一个进位标志有什么意义呢?)

【问题讨论】:

  • 负标志根据累加器的最高位设置,第 8 位是第 7 位。 (第一位是#0 位)。

标签: assembly flags twos-complement 6502


【解决方案1】:

内存中的字节只是字节:它们既没有符号也没有无符号。然而,一个字节的值可以解释为有符号数 (int8_t) 或无符号数 (uint8_t)。两个连续字节(int16_t 或 uint16_t)的值和四个连续字节(int32_t 或 uint32_t)的值相同。

要处理这些字节,您有几个 6502 指令,允许您对有符号和无符号解释执行多个操作。您只需要使用正确的指令并使用正确的标志(进位、溢出、否定...)来完成您需要做的事情。

【讨论】:

  • ADC 和 SBC 是那些将字节解释为无符号和有符号的指令的示例吗?或者还有其他的吗?
  • 实际上,您可以将操作数/加法或减法的结果解释为有符号或无符号。
  • 只是为了完整性:一些指令甚至可以在 6502 上将字节解释为 BCD。
【解决方案2】:

进位用于多字节算术(除其他外)。

这些话题已经写了几百次了,所以我只引用一个good source

1.2 审查两个补码(签名)号码

一个字节有 256 个可能的值;在十六进制中,它们是:$00 到 $FF。 8 位无符号数的范围是 0 ($00) 到 255 ($FF)。 16 位无符号数的范围是 0 ($0000) 到 65535 ($FFFF), 等等。它们被称为无符号数,因为它们为零或 更大,即没有(减号)符号。一个签名的数字,在另一个 手,可以是负数或正数(或零)。术语“签名号码” 下面用来表示二进制补码(尽管有 其他表示有符号数的方式)。 8位的范围 有符号数是 -128 到 127。值 -128 到 -1 以十六进制表示, 分别为 80 美元至 FF 美元。值 0 到 127 以十六进制表示, 分别为 $00 到 $7F。所以有符号数的最小值 是 $80 并且有符号数的最大值是 $7F。的范围 16 位有符号数是 -32768 ($8000) 到 32767 ($7FFF) ($8000 到 $FFFF 是负数),依此类推。这可能看起来像一个 处理负数的奇怪方法,但这种方法有几个 有用的属性。

首先,0 到 127(8 位有符号和 无符号数)在十六进制中为 $00 到 $7F,无论是否 number 有符号或无符号。

其次,最高有效位(8 位数字的第 7 位)为零 当数字为非负数时(0 到 127),当数字为非负数时为 1 消极的。事实上,这就是 6502 的 N(负)标志如何得到它的 姓名。 (请注意,当 N 标志受指令影响时, 反映了该指令结果的第 7 位。)另一个注意事项:在 数学上,零不是正数或负数,而是在 计算机世界,东西不那么正式;术语“正数” 通常包括零,因为 (a) 所有其他可能的值 最高有效位为零的有符号数是正数 数字,以及 (b) 无符号的所有其他可能值 number 是正数。

第三,考虑以下添加:

CLC
LDA #$FF
ADC #$01

结果(在累加器中)是 $00,并且设置了进位。这 另外,在无符号数中,是:255 + 1 = 256(记住,进位 已设置)。加法,在有符号数中,是 -1 + 1 = 0。在其他 话,加(和减)有符号数与 加(减)无符号数。

6502.org也有关于sign and the overflow flag的详细讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2022-01-03
    相关资源
    最近更新 更多