我对指令大小和可寻址空间有点困惑(我假设指令大小应该与地址位的大小相同。我在书中没有找到足够的解释)如果我是正确的,那么理论上如果我们有一个 2^32 32位架构(RISC风格)中的内存可寻址单元(字节)4字节大小的加载指令如何保存操作码和地址?
您假设单个指令可以对来自任意绝对地址的负载进行编码。在 x86 上也是如此,即使在 64 位模式下也是如此(但有一个特殊的操作码用于从没有位移或索引寄存器的 64 位绝对地址加载,并且目标必须是 rax)。
在大多数 RISC 架构上,从绝对地址加载通常使用两条 mov-immediate 指令来设置寄存器的上半部分和下半部分,然后使用该寄存器作为加载的地址。
例如,
int a;
int foo(void) { return a; }
编译为(godbolt 上的 ARM gcc 4.8.2) http://goo.gl/yIZoaJ:
foo():
movw r3, #:lower16:.LANCHOR0 @ tmp113,
movt r3, #:upper16:.LANCHOR0 @ tmp113,
ldr r0, [r3] @, a
bx lr @
a:
.space 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)