Assembly 像NES这样的8位机器是如何访问超过256字节的ram的?

Assembly 像NES这样的8位机器是如何访问超过256字节的ram的?,assembly,virtual-machine,virtual,emulation,Assembly,Virtual Machine,Virtual,Emulation,最近我花了很多时间思考硬件仿真和虚拟机。我一直在尝试设计一个基于NES硬件的虚拟机。然而,我似乎找不到任何关于NES如何访问超过256字节RAM的信息。根据NES维基,这台机器有2k的CPU RAM。由于NES是8位机器,因此机器地址最多只能达到255个。那么这怎么可能呢?他们只是在多个寄存器中存储更大的地址还是什么 谢谢您的时间。是的,在机器的硬件或盒带上使用“多个寄存器”被称为组交换:是的,在机器的硬件或盒带上使用“多个寄存器”被称为组交换:NES有一个由理光制造的6502系列CPU(缺少B

最近我花了很多时间思考硬件仿真和虚拟机。我一直在尝试设计一个基于NES硬件的虚拟机。然而,我似乎找不到任何关于NES如何访问超过256字节RAM的信息。根据NES维基,这台机器有2k的CPU RAM。由于NES是8位机器,因此机器地址最多只能达到255个。那么这怎么可能呢?他们只是在多个寄存器中存储更大的地址还是什么


谢谢您的时间。

是的,在机器的硬件或盒带上使用“多个寄存器”被称为组交换:

是的,在机器的硬件或盒带上使用“多个寄存器”被称为组交换:

NES有一个由理光制造的6502系列CPU(缺少BCD模式)。6502 CPU有一个16位地址空间,可以使用各种模式寻址

您可以直接在指令中指定16位地址,即

LDA$8000
将使用地址$8000处的数据加载累加器

LDA$8000,X
将X寄存器添加到$8000,然后读取该地址的值(即,如果X为76,则地址为$8076)

更有趣的是零页,它可以看作128个16位指针寄存器。零页指令只需要一个字节来指定地址(但需要更多的周期来执行间接寻址)

因此,如果$0004处的内存包含值$1234,且Y寄存器为$21,则指令

LDA($04),Y
将从零页读取$1234,然后添加Y寄存器以获得地址$1255,然后将$1255的内容加载到累加器中。有更多的寻址模式,但这更像是6502汇编的教程

从广义上讲,处理器是根据其数据路径的宽度进行分类的,然而,出于成本原因,CPU设计者可能会在物理芯片上指定较少的数据或地址引脚


例如,8088和8086被归类为具有20位地址总线和8位或16位数据总线的16位设备。摩托罗拉68000有另一个具有8位总线(Sinclair QL中使用的68008)的引脚缩减版本,而更高版本有完整的32位地址/数据总线。

NES有一个由理光制造的6502系列CPU(缺少BCD模式)。6502 CPU有一个16位地址空间,可以使用各种模式寻址

您可以直接在指令中指定16位地址,即

LDA$8000
将使用地址$8000处的数据加载累加器

LDA$8000,X
将X寄存器添加到$8000,然后读取该地址的值(即,如果X为76,则地址为$8076)

更有趣的是零页,它可以看作128个16位指针寄存器。零页指令只需要一个字节来指定地址(但需要更多的周期来执行间接寻址)

因此,如果$0004处的内存包含值$1234,且Y寄存器为$21,则指令

LDA($04),Y
将从零页读取$1234,然后添加Y寄存器以获得地址$1255,然后将$1255的内容加载到累加器中。有更多的寻址模式,但这更像是6502汇编的教程

从广义上讲,处理器是根据其数据路径的宽度进行分类的,然而,出于成本原因,CPU设计者可能会在物理芯片上指定较少的数据或地址引脚


例如,8088和8086被归类为具有20位地址总线和8位或16位数据总线的16位设备。摩托罗拉68000具有另一个具有8位总线的引脚缩减版本(在Sinclair QL中使用68008)后来的部分有完整的32位地址/数据总线。

跨站点复制:我要说的是,它们显然不限于256字节,简单的wikipedia搜索应该会显示这一点。各种特定的解决方案可以而且已经出现,x86使用了段(16位不是8位,但同样的问题),cpu中的其他人添加了额外的地址位,这些地址位以某种方式被访问并输入到整个地址空间,也可以解决cpu之外的问题,在cpu之外,您可以使用逻辑来提供额外的地址位,并且您可以用软件更改这些地址位。尽管在本主题中,您可能会得到更好的回答,询问“概念性”像这样的问题,请务必阅读他们的常见问题解答和如何提问页面,然后再发布到那里!跨站点重复:我想说的是,很明显,它们不限于256字节,简单的维基百科搜索应该会显示这一点。各种特定的解决方案可以而且已经发生,x86使用的段(16位不是8位,而是同一个问题),cpu中的其他人添加了额外的地址位,这些地址位以某种方式被访问并输入到整个地址空间,也可以解决cpu之外的问题,在cpu之外,您可以使用逻辑来提供额外的地址位,并且您可以用软件更改这些地址位。尽管在本主题中,您可能会得到更好的回答,询问“概念性”像这样的问题,请务必阅读他们的常见问题和如何提问页面,然后再张贴在那里!