Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64108
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-29 10:06
文章分类

全部博文(23)

文章存档

2015年(21)

2014年(2)

我的朋友

分类: 嵌入式

2015-01-05 12:19:40

关于ARM立即数寻址的详细讲解:http://blog.chinaunix.net/uid-30083829-id-4737628.html
在这里我只做一些我自己的理解。如有不对,还请各位多多指教
在博文——ARM指令中如何判断一个立即数是有效立即数。一文中,指出了第二操作数是12位,无法表示其32位数据。如果不用4为来表示循环右移的偶数位数则无法表示32为数据。
在这里我想一个32位的数据可以表示的范围是(假设是无符号类型)0~2^32,总共可以有4GB的数据存储范围。一个12位的数据可以表示的范围是(无符号)0~2^12,总共可以有4KB。而采用所谓的12位表示32位的方法,即有4位表示循环右移的偶数位,这样做到底有没有扩宽数据范围?
我的理解是,一个8位数有256B,而每一种有16种循环右移方式,也就256B*16=4096B=4KB结果表明在数据范围上没有任何改变,只是在数据表示上“1”的范围从原来的0~12位变为了0~8位且可以表示12~32位上只要“1”的个数不超过8个且是循环右移偶数位后能够表示的数据。这样做有什么意义呢?
是表明4KB范围的数据有大于2^12的数据呢还是令有其它原因,对于寄存器寻址它可以是32位的数据进行操作,这让我突然想到了“寻址”一词的意义,寻址就是从一个地址中找出数据。在8086体系中有直接寻址方式,间接寻址方式,立即数寻址等。8086中立即数寻址是直接把数据送到ALU中不需寻找该立即数所在地址,由此ARM中的立即数寻址方式也是直接把立即数送往ALU中,但ARM是32位的指令其中有20位不用来存数据,所以只有有12位来存放数据。而ARM中寄存器寻址可以是32位的数据而无需进行循环右移等操作,是因为在32位指令中它只需用12位数据来存储寄存器的地址就可以找到该地址中的32位数据。
以上是我目前能力所能理解到的,如有不对请多指教。
阅读(1716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~