Arm 64位内存空间中的32位固定指令长度

Arm 64位内存空间中的32位固定指令长度,arm,instruction-set,Arm,Instruction Set,我目前正在阅读ARM的AARC64体系结构。他们使用一个类似RISC的指令集,固定指令长度为32位,同时操作64位地址。我对ISA这个话题还是新手,所以我的问题是:当指令中只有32位长度时,如何处理64位长的地址?如果有一个4位CPU,它可以处理4096位的值,但速度不会太快。任何带有a的编程语言都将以这种方式工作,尽管通常不会达到相同的极限 32位CPU对64位值的操作方式是因为硬件或软件允许,而不是其他原因 在我们有64位CPU之前,我们不能操作64位整数值。即使旧版本也可以支持64位操作,

我目前正在阅读ARM的AARC64体系结构。他们使用一个类似RISC的指令集,固定指令长度为32位,同时操作64位地址。我对ISA这个话题还是新手,所以我的问题是:当指令中只有32位长度时,如何处理64位长的地址?

如果有一个4位CPU,它可以处理4096位的值,但速度不会太快。任何带有a的编程语言都将以这种方式工作,尽管通常不会达到相同的极限

32位CPU对64位值的操作方式是因为硬件或软件允许,而不是其他原因


在我们有64位CPU之前,我们不能操作64位整数值。即使旧版本也可以支持64位操作,它于1985年发布。

32位是以字节为单位的指令长度,而不是操作数大小或地址大小

ARM 32位(与所有其他使用32位固定宽度指令字的32位RISC一样)也不能将32位地址作为立即数放入单个指令中:操作码也没有空间来说明它是什么指令

指令的宽度限制了可以拥有的寄存器数量。由于每条指令有3个寄存器(dst、src1、src2),AARC64从16个寄存器增加到32个寄存器意味着每条指令需要
3*log2(32)=3*5
=15位来编码寄存器。对于只有2个或1个寄存器的指令,数量不超过2个。(如mov立即或add立即)。剩下的空间用于可能的操作码数量和直接指令的大小


为了将地址放入寄存器,ARM编译器通常会从附近的常量池(使用PC相对寻址模式)加载地址

另一个选项是大多数RISC CPU所做的:使用2指令序列将16位立即数放入寄存器的上半部分,然后将16位立即数放入寄存器的下半部分。(或者使用静态地址的下半部分作为加载/存储指令的位移,加载/存储指令使用寄存器+16位偏移量等寻址模式。)


MIPS是一个非常简单的RISC的好例子,请参阅。它的
lui reg,imm16
put
imm16您是说64位整数的x87
fild
?除了使用x87或MMX/SSE2之外,32位x86只能使用扩展精度(如add/adc)进行64位整数运算。(不过,add/sub操作的数量是16位代码的一半)。在我看来,从32x32乘法生成64位完整结果并不算是64位操作,但它确实使64x64=>64位乘法的效率比16位CPU高得多。这可能很难看,可能效率很低,但这是可以做到的。64位CPU的处理能力要好得多,但一些更现代的32位CPU有64位数学指令,因为现在比20世纪80年代更流行
long
类型值。即使是现代的64位CPU也常常处理超过64位的值:SIMD处理256位的值,浮点值很容易达到80位。指令的大小,指令集,或者默认寄存器的大小都与此无关。好的,那么在第二部分中,你们讨论移位的原理?()