博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

Tekkaman Ninja

Linux我的梦想,我的未来! 专注linux内核和驱动!本博客的原创文章的内容会不定期更新或修正错误! 转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkman.cublog.cn ,谢谢合作!!!!!
  tekkman.cublog.cn

关于作者
姓名:Tekkaman  Ninja
职业:ARM9+Linux
年龄:25
位置:福建龙岩
个性介绍:钻研嵌入式Linux技术
E-Mail:tekkamanninja@163.com
|| << >> ||
我的分类


关于对ARM处理器中“8位位图”的理解

关于ARM处理器中“8位位图”的理解分析

   在ARM处理器的汇编语言中,对指令语法格式中的<shifter_operand>的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。对于这句话,我一开始学ARM时不理解,到了后来为了做设计,去看BootLoader源码时,才认真地在网上查找相关资料,理解了这句话。
  
   首先从ARM指令系统的语法格式说起。
   一条典型的ARM指令语法格式分为如下几个部分:
   <opcode>{<cond>}{S} <Rd>,<Rn>{,<shifter_operand>}
   其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
   opcode      指令助记符,如LDR,STR 等
   cond        执行条件,如EQ,NE 等
   S           是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响
   Rd          目标寄存器
   Rn          第一个操作数的寄存器
   shifter_operand    第二个操作数
 
  其指令编码格式如下:
 31-28  27-25  24-21  20    19-16  15-12  11-0 (12位)
 cond  001  opcode  S  Rn  Rd  shifter_operand
 

当第2 个操作数的形式为:#immed_8r常数表达式时该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的

其意思是这样:#immed_8r在芯片处理时表示一个32位数,但是它是由一个8位数(比如:01011010,即0x5A)通过循环移位偶数位得到(1000 0000 0000 0000 0000 0000 0001 0110,就是0x5A通过循环右移2位偶数位)的到的)。

      而1010 0000 0000 0000 0000 0000 0001 0110,就不符合这样的规定,编译时一定出错。因为你可能通过将1011 0101循环右移位得到它,但是不可能通过循环移位偶数位得到。

      1011 0000 0000 0000 0000 0000 0001 0110,也不符合这样的规定,很明显:1 0110 1011 有9位。

为什么要有这样的规定?

本人的理解是:

    要从指令编码格式来解释(这就是我为什么一开始讲的是指令编码格式),仔细看表格中的shifter_operand所占的位数:12位。要用一个12位的编码来表示任意的32位数是绝对不可能的(12位数有2^12种可能,而32位数有2^32种)。

    但是又要用12位的编码来表示32位数,怎么办?

    只有在表示数的数量上做限制。通过编码来实现用12位的编码来表示32位数。

    在12位shifter_operand中:8位存数据,4位存移位的次数。

    8位存数据:解释了“该常数必须对应8位位图”。

     4位存移位的次数:解释了为什么只能移偶数位。4位只有16种可能值,而32位数可以循环移位32次(32种可能),那就只好限制:只能移偶数位(两位两位地移,好像一个16位数在移位,16种移位可能)。这样就解决了能表示的情况是实际情况一半的矛盾。

    所以对#immed_8r常数表达式的限制是解决指令编码的第二个操作数位数不足以表示32位操作数的无奈之举,但在我看来:这个可以说是聪明的做法。因为如果直接用12位数来表示32位操作数,只能表示0 到(2^12-1)。大于(2^12-1)的数就没办法表示了。而且细细想来“8位存数据,4位存移位的次数”,应该是最好的组合了(我并未想过所有的组合,只是顺便试了几个)。

以上是本人对ARM处理器中“8位位图”的个人理解,如有异议,欢迎批评指正!!!!!!邮箱:tekkamanninja@163.com

发表于: 2007-08-07,修改于: 2007-11-15 17:41,已浏览1342次,有评论7条 推荐 投诉


网友评论
网友: kjding 时间:2007-09-07 21:56:14 IP地址:58.49.103.★
我是新手,今天刚看到这里,对这句话也不理解.
看到你高人的分析,我实感佩服!也很是感激!谢谢!

网友: 本站网友 时间:2007-10-06 18:18:13 IP地址:122.207.29.★
有收获,不错。
谢谢!!

网友: wangrenjun12 时间:2007-11-12 14:56:46 IP地址:218.0.4.★
这篇文章对我用户可大了

网友: 本站网友 时间:2007-11-15 11:18:30 IP地址:124.130.130.★
写的好,化解了我困扰许久的问题

网友: 本站网友 时间:2008-04-07 09:12:06 IP地址:221.12.171.★
你太有才了 

网友: jff8703 时间:2008-05-17 22:32:41 IP地址:202.102.253.★
你真是太有才了

网友: 本站网友 时间:2008-07-14 15:09:00 IP地址:222.79.245.★
呵呵,太谢谢你的详细解释了~

 发表评论