首页 理论教育 立即寻址与ARM指令编码

立即寻址与ARM指令编码

时间:2023-11-23 理论教育 版权反馈
【摘要】:立即寻址也称为立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。在ARM 指令编码中,32 位有效立即数是通过循环右移偶数位而间接得到,故有效的立即数是由一个8 位的立即数循环右移偶数位得到。指令中立即数0x12800 是由e3a04b4a 中的后12 位0xb4a 间接表示,即是由8 位的0x4a 循环右移24位得到。

立即寻址与ARM指令编码

立即寻址也称为立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。 立即数前面加立即数符号“#”表示。

立即寻址举例如下:

需要注意的是,如果一个32 位立即数直接用在32 位指令编码中,就有可能完全占据32位编码空间,而使指令的操作码等无法在编码中体现。 在ARM 指令编码中,32 位有效立即数是通过循环右移偶数位而间接得到,故有效的立即数是由一个8 位的立即数循环右移偶数位得到。 因此,有效立即数immediate 可以表示成:

<immediate> =immed_8 循环右移(2 ×rotate_imm)

采取间接表示,一个32 位立即数在指令编码只需要用12 位编码(4 位rotate_imm,8 位immed_8)表示,这样编码的缺点是并不是每一个32 位的常数都是合法的立即数,只有通过上面的构造方法得到的才是合法的立即数,因此,使用立即数时要特别注意。

合法立即数举例如下:

0x0000F300,0x0012000,0x00012400,0x104,0xF000000F

非法立即数举例如下:(www.xing528.com)

0x101,0xFF1,0x001c90,0xF000001F,0x59900

合法立即数应用在例子(GNU 环境下)中如下所示:

其中,带有三个有立即数的MOV 指令的二进制编码为:

由此可以看出:

指令(1)中立即数0xf200 是由e3a00cf2 中的后12 位0xcf2 间接表示,即是由8 位的0xf2循环右移24(2 ×12)位得到。

指令(2)中立即数0x1100000 是由e3a01811 中的后12 位0x811 间接表示,即是由8 位的0x11 循环右移16(2 ×8)位得到。

指令(3)中立即数0x12800 是由e3a04b4a 中的后12 位0xb4a 间接表示,即是由8 位的0x4a 循环右移24(2 ×12)位得到。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈