加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编指令中的立即数方式

(2012-04-30 12:08:55)
标签:

杂谈

帮个忙,如何理解下面的话?

指令操作数立即数时候,每个立即数由一个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

0

阅读 收藏 喜欢 打印举报/Report
后一篇:常用ARM指令
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有