3

我从这里查看MOS 6502 指令集的寻址模式。

的描述indirect, Y-indexed与其他来源有点不一致。

它说

OPC ($LL),Y 操作数是由 Y 递增的有效地址,带进位;有效地址是零页地址处的字

但是其他消息来源没有提到带有进位的加法。喜欢这里

计算有效地址的正确方法是什么?

4

1 回答 1

11

如有疑问,最好查看官方文档。此处
还有一份来自 MOS 的引人入胜的原始数据表[ 1 ],内容如下

INDIRECT INDEXED ADDRESSING - 在间接索引寻址(称为( Indirect) , Y)中,指令的第二个字节指向页面零中的内存位置。
该内存位置的内容被添加到变址寄存器的内容中,结果是有效地址Y的低八位。这个加法的进位被添加到下一页零存储器位置的内容,结果是有效地址的高八位。

所以第二次加法是通过携带进行的。您可以将其视为(在little-endian中)指向的 16 位字与扩展为 16 位的寄存器零 的内容
之间的 16 位加法。ImmediateY

例如,如果内存和Y

All values in hex

Address    00  01  02  03  04 ...
Value      80  02  f3  00  03 ...

Y = 90

然后(0), Y

  low 8 bits:  80 + 90     = 10   (with carry = 1)
  high 8 bits: 02 + 00 + 1 = 03 

给出有效地址0310。同样(3), Y

  low 8 bits:  00 + 90     = 90   (with carry = 0)
  high 8 bits: 03 + 00 + 0 = 03 

这导致 value 的有效地址0390

您可以看到,当考虑 16 位量时,0 处的字 is0280Yis 0090,它们的相加0310符合预期。

长描述只是对这些事实进行了编码:a) 所指向的 16 位字Indirect存储在小端 b)Y是零扩展 c) 加法是 16 位的。

在 C 中,它应该看起来像这样

uint16_t effective_addr(uint8_t indirect)
{
   //Take the INDIRECT immediate and make a pointer to a 16-bit LE word out of it
   //In C int-to-ptr is implementation define, we assume an identity map here
   uint16_t* page_zero_ptr = (uint16_t*)indirect;

   //The Y register is 8-bit, we consider it a 16-bit one instead
   //Assume y is of unsigned type 
   uint16_t  y_zero_ext = y;

   //Do a 16-bit addition, this is equivalent to two 8-bit additions with carry
   return *page_zero_ptr + y;
}
于 2017-09-17T10:41:15.820 回答