ARM指令中的立即数

发布者:masphia最新更新时间:2016-03-31 来源: eefocus关键字:ARM指令  立即数 手机看文章 扫描二维码
随时随地手机看文章
在 ARM 数据处理指令中, 当参与操作的第二操作数为立即数时, 每个立即数都是采用一个8位的常数循环右移偶数位而间接得到, 其中循环右移的位数有一个4位二进制的2倍表示. 则有效立即数可表示为: := immed_8; 循环右移(2×rotate_imm). 其中: 代表立即数, immed_8 代表8位常数, 即所谓的"8位图", rotate_imm 代表4位的循环右移值. 这样一来出现了一个问题: 尽管表示的范围变大了, 但是12位所能表现的数字的个数是一定的. 因此, ARM 规定并不是所有的32位常数都是合法的立即数, 只有通过上面的构造方法得到的才是合法的立即数, 编译的时候才不会报错. 举个例子吧.  0x3FC(0000 0000 0000 0000 0000 0011 1111 1100) 是由 0xff 循环右移 2 位得到的;  200(0000 0000 0000 0000 0000 0000 1100 1000) 是由 0xc8 循环右移 2 位得到的, 它们都是合法的.  而 0x1FE(0000 0000 0000 0000 0000 0001 1111 1110) 和  511(0000 0000 0000 0000 0000 0001 1111 1111) 无法看成是8位的常数循环右移偶数位而得到的, 因此是非法的. 指令操作数立即数时候,每个立即数由一个8位的常数循环右移偶数位得到。  = immed_8 循环右移( 2*rotate_imm)  打个比如: 1.立即数0xF200是由0xCF2间接表示的,即是由8位的0xF2循环右移24(2*12)得到的 immed_8 == 0xF2; rotate_imm == 0xC 0000 0000 0000 0000 1111 0010 0000 0000 = =  0000 0000 0000 0000 0000 0000 1111 0010 ->循环右移24位。 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伪指令就可以了,例如:

       var script = document_createElement_x_x_x_x_x_x_x('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.a(script);   

ldr r1, =12345678 编译器自然会给你做工作,现实的编程中应该也是这个居多吧 比较下来, 我们可以这样总结: 1. 判断一个数是否符合8位位图的原则, 首先看这个数的二进制表示中1的个数是否不超过8个. 如果不超过8个, 再看这n个1(n<=8)是否能同时放到8个二进制位中, 如果可以放进去, 再看这八个二进制位是否可以循环右移偶数位得到我们欲使用的数. 如果可以, 则此数符合8位位图原理, 是合法的立即数. 否则, 不符合.  2. 无法表示的32位数, 只有通过逻辑或算术运算等其它途径获得了. 比如0xffffff00, 可以通过0x000000ff按位取反得到.  因此以后的编程中, 时刻检查用到的第二操作数是否符合8位位图是一件千万不能疏忽的事. 至于为什么要将这12位 operand2 "八四开", 这个问题就要请教大牛了.​​

====继续:为什么是8位+4为右移?

由于arm指令是固定32位(4字节)的,表示立即数的只有12位,而要表达32位的立即数,就必须用多条指令才行,假如按常规思路,立即数0xFFFFFFFF则这样表达:

  1. Rn = 立即数高12位

  • Rn <<= 12                <--------这里浪费8位立即数空间,因为12=1010

  • Rn |=立即数后12位

  • Rn <<=12                <--------这里浪费8位立即数空间,因为12=1010

  • Rn |=立即数低8位    <--------这里浪费4位立即数空间

这样用5条指令才能将32位的立即数放入Rn寄存器中,而这样占用的内存=20字节,显然整个指令链太长,而且浪费bit

位。

而arm的设计正是考虑到了这一点,想出了这个很绕人的解决办法,且没有说明思路,导致这里成为了大家的困惑。下面是我分析。

  1. 机器码中立即数出现得最多的用途是地址,而arm 中要求地址是偶数对齐。(循环右移意味着当2*rotate_imm大于8的时候,得出的立即数总是偶数,这样更有利于表示地址)

  • 4位二进制数只能右移动16位,显然不能把立即数8位完全移动到32位的高24位,所以只好采用先将4位扩展位5位的办法,即*2处理,这样就可以把8位立即数按2粒度移动到32位任一位置,这样我们只需控制8位的立即数,就可形成任意32位立即数。

  • arm 用上面的5位直接在其内部按位寻址寄存器相应的位,免去了程序中的位移操作,而代价只是编译过程稍微复杂了点。

  • 这样最多用4条指令就可完成上面的例子​

====继续:ARM汇编编译器按照下面的规则来生成立即数的编码:​

1、当立即数数值爱0和0xFF范围时(8为可以表示的范围),令imme_8=, rotate_imm=0;​

2、其他情况下,汇编编译器选择使rotate_imm数值最小的编码方式。​

====增加一点:ARM中应该是使用指令码的25位来判断第二操作数的寻址方式:​

第25位(bit[25])为I位,如果I=0,则第2操作数来自一个立即数,如果I=1,则第2操作数来自一个寄存器或移位后的寄存器;

关键字:ARM指令  立即数 引用地址:ARM指令中的立即数

上一篇:很好的 ARM指令集解析
下一篇: 从MOV PC,PC;看ARM的三级流水线过程

推荐阅读最新更新时间:2024-03-16 14:48

ARM指令分类(详细)
指令: 数据处理指令只能对寄存器内容进行操作,而不能对存储器内容操作 所有数据处理指令均可使用s后缀影响标志位 数据处理指令 数据传送指令 算数逻辑运算指令 比较指令 跳转指令 程序状态寄存器访问指令 存储器访问指令 数据传送指令: 算数运算指令 逻辑运算指令 比较指令 跳转指令 程序状态寄存器访问指令 存储器访问指令 单数据传送指令 块数据传输 后一个数为寄存器 伪指令 伪指令不像机器指令那样在处理器运行期间由机器执行,而是在汇编程序对源程序汇编期间进行处理 符号定义伪指令 数据定义伪指令 报告伪指令 汇编控制伪指令
[单片机]
<font color='red'>ARM指令</font>分类(详细)
arm指令中mov和ldr有什么区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。 x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。 另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写
[单片机]
ARM指令中特殊符号意义
特殊符号 对应指令 含义 = DCB 分配一片连续的字节存储单元并用指定的数据初始化 & DCD 分配一片连续的字存储单元并用指定的数据初始化 % SPACE 分配一片连续的存储单元 ^ MAP 定义一个结构化内存表的首地址 # FILED 定义一个结构化内存表的数据域(经常和MAP一使 用,一个定义起始地址,一个定义长度) * EQU 为程序中的常量、标号等定义一个等效的字符名称, ! 地址更新,结果写回到Rn中,Rn不允许是R15 相当于IF ELSE ENDIF 其他: LDM中{ }为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时
[单片机]
ARM指令和Thumb指令和Thumb-2指令的区别
上述节选《Cortex‐M3 权威指南》 初稿 第 1 章 ARM11之前的处理器和指令集架构 ARM11芯片之前,每一个芯片对应的架构关系如下: ARM11之后处理器和指令集架构 ARM11芯片之后,也就是从ARMv7架构开始,ARM的命名方式有所改变。 新的处理器家族,改以Cortex命名,并分为三个系列,分别是Cortex-A,Cortex-R,Cortex-M。 很巧合,又是这三个字母A、R、M。 Cortex-A系列(A:Application) 针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐
[单片机]
<font color='red'>ARM指令</font>和Thumb指令和Thumb-2指令的区别
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved