由网友(南岸青栀)分享简介:我对指令大小和可寻址空间感到有点困惑(我假设指令大小应该与地址位的大小相同。我没有在我的书中找到足够的解释)如果我是正确的,那么在理论上,如果我们在32位体系结构(RISC风格)中有2^32个可寻址单元(字节)的内存,那么4字节大小的加载指令如何保存操作码和地址?推荐答案您假设一条指令可以对来自任意绝对地址的加载进行...我对指令大小和可寻址空间感到有点困惑(我假设指令大小应该与地址位的大小相同。我没有在我的书中找到足够的解释)如果我是正确的,那么在理论上,如果我们在32位体系结构(RISC风格)中有2^32个可寻址单元(字节)的内存,那么4字节大小的加载指令如何保存操作码和地址?
![以数据为中心的计算如何以RISC V解决问题](https://p.xsw88.cn/allimgs/daicuo/20230903/2301.png)
推荐答案
您假设一条指令可以对来自任意绝对地址的加载进行编码。在x86上也是如此,即使在64位模式下也是如此(但有一个特殊的操作码,用于从没有位移或索引寄存器的64位绝对地址加载,且DEST必须是RAX)。
在大多数RISC体系结构上,从绝对地址加载通常使用两条立即移位指令来设置寄存器的上半部分和下半部分,然后将该寄存器用作加载地址。
![以数据为中心的计算如何以RISC V解决问题](https://p.xsw88.cn/allimgs/daicuo/20230903/2301.png)
例如
int a;
int foo(void) { return a; }
compiles to (ARM gcc 4.8.2 on godbolt):
foo():
movw r3, #:lower16:.LANCHOR0 @ tmp113,
movt r3, #:upper16:.LANCHOR0 @ tmp113,
ldr r0, [r3] @, a
bx lr @
a:
.space 4
相关推荐
最新文章