汇编指令中的立即数方式

标签:
杂谈 |
帮个忙,如何理解下面的话?
指令操作数立即数时候,每个立即数由一个8位的常数循环右移偶数位得到。
<immediate>= immed_8 循环右移( 2*rotate_imm)
根据我的资料,存放立即数的只有低12个bit,最大存0xFFF的常数。
指令操作数立即数时候,每个立即数由一个8位的常数循环右移偶数位得到。
<immediate>= immed_8 循环右移( 2*rotate_imm)
根据我的资料,存放立即数的只有低12个bit,最大存0xFFF的常数。
最新回复
- zxx24 at 2008-6-05 20:31:18
-
众所周知,ARM指令的编码格式如下图所示:
http://www.icdev.com.cn/bbs/attachments/month_0806/20080605_bc9336fd1a25ce9d4b15ZDhF8pAovZsl.jpg
立即数.JPG
指令操作数立即数时候,每个立即数由一个8位的常数循环右移偶数位得到。
<immediate>= immed_8 循环右移( 2*rotate_imm)
打个比如:
1.立即数0xF200是由0xCF2间接表示的,即是由8位的0xF2循环右移24(2*12)得到的
immed_8 == 0xF2; rotate_imm == 0xC
2.立即数0x3F0是由0xE3F间接表示的,即是由8位的0x3F循环右移28(2*14)得到的
immed_8 == 0x3F; rotate_imm == 0xE
或者
立即数0x3F0是由0xFFC间接表示的,即是由8位的0xFC循环右移30(2*15)得到的
immed_8 == 0xFC; rotate_imm == 0xF
表示方法有好几种
PS:其实你没必要一个一个的算,只要利用LDR伪指令就可以了,例如:
ldr r1, =12345678
编译器自然会给你做工作,现实的编程中应该也是这个居多吧 - haibian826 at 2008-6-10 17:24:20
-
循环右移的时候,把8位的常数看成几位的? 刚才算了一下,是把8位常数扩成32位再循环右移
但是,如果想把立即数0xF200放入寄存器R1中,还要先把这个立即数转化为8位常数后,再写成指令:MOV R1,0XCF2 吗?
[ 本帖最后由 haibian826 于 2008-6-10 17:28 编辑 ] - zxx24 at 2008-6-10 18:04:47
-
对的
“先把这个立即数转化为8位常数”是你自己打草稿的,真正要写的语句就是“MOV R1,0XCF2”
所以推荐利用LDR的伪指令方便多了http://www.icdev.com.cn/bbs//lol.gif