![]() |
1
3
即使在CISC上,你所描述的也很不寻常。
这不是因为它是CISC,而是因为它使用比寄存器更宽的地址
. 这通常只存在于8位CPU中。(尽管x86分段也符合条件,间接跳远将指针指向
通常,当你想设计一个具有更大地址空间的cpu时,你也要使寄存器更宽,这样你就能有效地处理地址。当你想用8位寄存器/alu来节省晶体管的时候,它只在非常低端,但是不能把地址空间限制在256字节,在这里你可以找到这种设计。
即使地址大小与单词大小匹配,这里也存在一个真正的问题。
构造任意32位(或64位)常数是不同is a以不同方式解决的问题。
. ARM经常使用来自附近“文字池”的PC相对负载,而其他的则经常使用
一般来说,在risc上,如果需要跳远,可能需要使用多条指令在寄存器中构造地址。 然后使用跳转来注册指令。
mips分支指令很有趣:它有相对分支,可以向程序计数器添加一个相当大范围的有符号位移;绝对跳转指令可以用一个新地址替换pc的低28位。(由26位立即左移构成,因为mips需要对齐指令,所以不需要存储低2位。)
How to Calculate Jump Target Address and Branch Target Address?
. 但是当目标无法从当前位置到达时,你需要
x86-64还缺少64位相对跳转指令。如果你需要跳出超过+2gib的距离(不是
8位RISC
我知道的唯一一个比寄存器宽的程序计数器的risc is a是avr,一个8位寄存器的微控制器。
它可以把成对的寄存器当作16位地址
,它的PC机是16位的。它
EIJMP
(扩展间接跳转)从I/O空间中为PC的高位获取EIND寄存器,而低位仍然来自
AVR指令几乎都是2字节长,但有些版本有
a 4-byte
带有32位寄存器的主流risc机器也有32位程序计数器和虚拟地址空间 . (可能有超过4gib的物理内存,但不能在一个进程中同时映射所有内存)。
他们中的大多数在设计上都是以文字为导向的,所以他们所需要的就是
在像mips、sparc或powerpc这样的普通risc上,
64位地址仅在64位isa扩展中可用
,其中有64位整数寄存器。所以你会使用mips这样的指令
一些32位CPU添加了扩展以支持大型
身体的
不增加虚拟地址空间的地址。例如,x86的pae用36位物理地址定义了一种新的页表格式。但即使有分段,单个进程一次处理的虚拟内存也不能超过4gib。(x86段基+偏移发生
之前
virt->phys转换,创建32位线性地址。因此它对于线程本地存储仍然有用,例如
32位risc isas的扩展寻址保罗·克莱顿评论:
所以很明显一些risc isa在完全64位之前扩展了它们的地址。但我不知道细节,也不打算花时间研究这个问题。其他答案欢迎! |
![]() |
Ilya Loskutov · 无法将单词加载到寄存器中 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Arya · 汇编语言中的“标签”——操作码 2 年前 |
![]() |
S1mple · 通过gcc生成64位共享库时的“未定义的主引用” 2 年前 |
![]() |
R0M2 · 为什么“GCC”忽略汇编代码的-fno pic 3 年前 |
![]() |
Akagi Akira · 如何在gnu汇编程序中组装MIPS cpu 3 年前 |