ARM中如何将任意32位立即数传入寄存器中?


大家知道arm指令集是定长32位的,那32位的立即数寻址哪来的呢?
ARM 立即数有3种形式:
1、8 位,这种立即数就包含在指令中,装入寄存器的最低 8 位,并且可以选择 0 扩展或 符号位扩展到整个 32 位。
2、8 位移位+重复,到 32 位,这种立即数也包含在指令中,8 位立即数可以左移任意位,并且重复累加,指令形式比较复杂,可以装入类似这些数据:0x55000000(8位数据 0x55 左移 24 位),0xe000e000(8 位数据 0xe0 左移 8 位,并且重复到高 16 位)。
3、对于不符合以上两种格式的立即数,比如 0x12345678 这种,立即数不包含在指令中,而放在代码段(通常是函数的结束之后),装入的指令为 LDR Rd, [PC, #offset],即立即数是位于以 PC为基址加上一个偏移量的地址处。
通常理解的立即数,应该是把数据装入寄存器的那条CPU指令,使用了“立即寻址”的寻址方式,而严格来说,只有前两种形式的立即数是立即寻址,而第3种不算。
由于当前 PC 到函数末尾的长度,人工基本没法算,所以这个工作(在合适的位置放入立即数,以及计算 offset)一般都由汇编器或编译器自动安排。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM