1

我正在为 6502 编写一个模拟器,基本上,有一些指令在其中一个寄存器(主要是 X 和 Y)中保存了一个偏移量,我想知道,因为分支指令使用有符号 8 位整数,所以寄存器将其值保持为 8 位有符号?这意味着:

switch(opcode) { 
    //Bunch of opcodes
    case 0xD5: 
    //Read the memory area with final address being address + x offset
    int rempResult = a - readMemory(address + x); 
    //Comparing some things, setting/disabling flags
    //Incrementing program counter and cycles/ticks
    break; 
    //More opcodes
}

假设在这种情况下 x = 0xEE。在常规二进制中,这意味着 x = 238。然而,在 6502 中,分支指令使用带符号的偏移量来跳转到内存地址,所以我想知道,在这种情况下,238 是解释为 -18,还是只是常规无符号 8 位值?

4

2 回答 2

4

它因人而异。

对于算术、逻辑、移位或加载和存储操作,它们没有显式签名或无符号。

条件分支(以及后来的 6502 个后代的无条件分支)都将参数视为已签名;否则循环会非常尴尬。

zero, x寻址是通过对零页地址执行 8 位加法、忽略进位并从零页读取来实现的。所以例如

LDX #-126    ; which is +130 if unsigned
LDA 23, x

将从地址 23+130 = 153 读取。但如果它是 223+130,那么最终读取将来自 (223 + 130) MOD 256 = 97。

absolute, x/y未签名并且进行正常工作(但需要额外的周期)

(zero, x)与直接版本非常相似,偏移量已签名,但结果始终在零页内。然后从那里读取真实地址。

(zero), y未签署进行工作和成本核算。

于 2013-06-02T17:20:03.607 回答
0

“符号”只是 8 位字节中最高有效位(也称为位 7)的值。

6502 通过以下方式支持有符号值:

  • N位在.P- 但它实际上只是告诉您最后一条指令是打开还是关闭内存位置或寄存器的第 7 位。通常使用BPL/BMI来执行基于内存位置中的第 7 位的操作,以用于标志或“布尔”之类的使用。
  • 其中的V.P翻转“当两个正数相加的结果溢出并最终为负时,以及当两个负数相加的结果溢出并最终为正时”
  • 当然,仅对相关分支指令遵循符号位,例如BEQ,设置位 7 的值将移动到较低的内存位置,而不是较高的内存位置。

除此之外,该位是否意味着什么完全取决于您和您的程序。真正使数字有符号或无符号的是您如何显示数字。

上面的链接文章介绍了一个补码和二进制补码是什么以及它如何使数学工作而 6502 不必过多关心符号。

于 2016-12-13T19:32:25.097 回答