关于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) |