我正在为自己开发自己的学术处理器,这时出现了一个问题。我不知道如何实现从内存到寄存器的读写数据。我可以在循环中精确地执行指令的顺序,但是我如何取一个任意的地址,并从中写入和读取数据呢?我需要这个,因为数据不适合寄存器。
我需要一个例子,说明至少在微控制器的汇编级上是如何完成的,即在操作中使用1个操作数,而不是像RISC-V中那样使用3个操作数,因为这将在我的处理器中完成。
顺便说一下,处理器是8位的,寻址的最大内存是256个字。字长很可能是14位(op码为6位)。微控制器如何从RAM存储和检索数据?
通常你会有一些"地址总线"(或者可能是"地址链接")来连接CPU(直接或间接通过)。(一个内存控制器)到RAM
该地址总线将传输消息。消息将模糊地像&;READ (address, size)&;后面跟着"READ_REPLY(size, data)"或"WRITE (address, size, data)";(可能使用"ACK()"回复吗?)它可能是高速串行,所有东西都被分解成比特。它可能是一条平行总线。它可能是一个组合(例如,8条平行线,然后在series"中每次一个字节)。可能有不同用途的控制线。
这个相同的地址总线也可能处理的东西不是RAM -例如ROM, "IO端口空间",空/什么都没有(如果有人只想安装128字节的RAM而不是256字节),IRQs请求从设备,等等;也可以用于指令获取(指令也需要从某处加载,而不仅仅是数据)。
注意:对于通用cpu来说,一个完整的哈佛架构是相对糟糕的;但是对于一个小型微控制器来说,它可能是非常好的-例如,所有代码来自使用一个接口的ROM,所有数据使用具有不同接口的RAM, 256字节的ROM用于代码加上256字节的RAM用于数据。
无论你决定硬件接口是什么,你的CPU都必须通过将指令(例如可能"LDX [y]")翻译成地址总线上的消息(例如可能"READ (address_that_came_from_register_Y)")来支持它,然后(可能,对于一个简单的CPU)等待回复回来。对于读取(更难),当回复回来时,您需要将数据放在某个地方(例如将数据从RAM移动到"寄存器x")。
你还必须决定说明是什么。对于绝对最小值,您可能(例如)有一个"ldxy"。带有2个隐含操作数的指令("将Y寄存器地址上的数据读入X寄存器"),但您可能会遇到疯狂/复杂的东西(例如"加载X, [Y + z <<256]";通过使用2个不同的寄存器作为地址来支持64kib的内存),并且可能有一些特殊用途的东西(如POP, PUSH, CALL和RET,它们都使用堆栈指针作为地址的隐含操作数)。