ARM指令中第二操作数为常数表达式时8位位图的理解

发布者:幸福的老农最新更新时间:2016-05-11 来源: eefocus关键字:ARM指令  操作数  常数表达式  8位位图 手机看文章 扫描二维码
随时随地手机看文章
一条典型的ARM指令语法格式分为如下几个部分: 

   {} {S}     ,{,}
   其中,<>内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
   opcode      指令助记符,如LDR,STR 等
   cond        执行条件,如EQ,NE 等
             是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响
   Rd          目标寄存器
   Rn          第一个操作数的寄存器
  operand2    第二个操作数

 

  其指令编码格式如下:

 

 31-28

 27-25

 24-21

 20  

 19-16

 15-12

 11-0 (12位)

 cond

 001

 opcode

 S

 Rn

 Rd

operand2

 

 

对其中的operand2的常数表达式有这样的规定:“该常数必须对应8位位图,即常熟是由一个8位的常熟循环右移偶数位得到的。”这句话的意思是说,当用12位第二操作数来表示一个32位立即数时,采用的是将8位数通过移位的方式来实现的,其中12位第二操作数的低八位存放被移位的“基本”数(取值范围为0到255),而高四位存放的是循环右移的位数,因为位四位二进制数,所以取值范围位为0到15,而对应的移位位数则为0到30位,也就是说若“移位”数为0,则表示“基本”数不变,若“移位”数位1,则表示将“基本”数在32位数字空间中循环右移2位,若“移位”数位5,则表示将“基本”数在32位数字空间中循环右移10位,若“移位”数位10,则表示将“基本”数在32位数字空间中循环右移20位,依次类推。举例表示:
     AND R1,R2,#0xff
     当处理器处理这条指令的第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0.
     AND R1,R2,#0x104
     当处理器处理这条指令的第二操作数0x104时,因为此时0x104已经超过了8位二进制数,所以处理器就要将其“改造”一下,我们先把0x104转换成二进制0000 0000 0000 0000 0000 0001 0000 0100,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 0100 0001通过循环右移30位得到的,因此改造后的结果是8位“基本”数中存放0100 0001,而“移位”数为15。
     AND R1,R2,#0xff000000
     当处理器处理这条指令的第二操作数0xff000000时,处理器同样要对其“改造”,我们先把0xff000000转换成二进制1111 1111 0000 0000 0000 0000 0000 0000,我们可以看到,这个数是0000 0000 0000 0000 0000 0000 1111 1111通过循环右移8位得到的,因此改造后的结果是8位“基本”数中存放1111 1111,而“移位”数为4。
      我想,通过以上的三个例子,就应该明白了8位位图的原理了。但是,有些数并不符合8位位图的原理,这样的数在进行程序编译时,系统将会提示出错,下面再举几个违反8位位图的例子:比如0x101,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0001,像这个数,无论向右循环几位,都无法将两个1同时放到低8位中,因此不符合8位位图;再比如0x102,转换成二进制后位0000 0000 0000 0000 0000 0001 0000 0010,如果将两个1同时放到低8位中,即转换成二进制后为0000 0000 0000 0000 0000 0000 1000 0001,需要将此二进制数向右移31位,这也不符合循环右移偶数位的条件,因此0x012也不符合8位位图;再举一个0xff1,转换成二进制后将会有9个1,不可能将其同时放入8位中,因此当然也不符合啦。
      通过正反例的比较,可以总结如下:第一,判断一个数是否符合8位位图的原则,首先看这个数转换成二进制后1的个数是否不超过8个,如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如果可以放进去,再看这八个二进制位是否可以循环右移偶数位得到起初被判断的那个数值,如果可以,则此数值即为符合8位位图原理,否则,不符合。第二,用12位的编码来表示一个任意的32位数是不可能的,只能通过循环右移八位二进制数偶数位来得到一部分32位数,其余的无法表示的32位数,只有通过其它途径获得了,比如0xffffff00,可以通过0x000000ff按位取反得到,因此在以后的编程中,一定要注意用到的第二操作数是否符合8位位图。

关键字:ARM指令  操作数  常数表达式  8位位图 引用地址:ARM指令中第二操作数为常数表达式时8位位图的理解

上一篇:ARM指令中4条容易混淆的指令区别
下一篇:ARM指令中特殊符号意义

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

以10为底的浮点对数函数
标号: FLOG 功能:以10为底的浮点对数函数 入口条件:操作数在 中。 出口信息:OV=0时,结果仍在 中,OV=1时,负数或零求对数出错。 影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:9字节 FLOG: LCALL FLN ;先以e为底求对数 JNB OV,LOG RET ;如溢出则停止计算 LOG: MOV R5,#0FFH;系数0.43430(1/Ln10) MOV R6,#0DEH MOV R7,#5CH LCALL MUL1 ;通过相乘来换底 LJMP MOV0 ;传回结果
[单片机]
ARM指令集协处理器指令
ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。 ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条: CDP 协处理器数操作指令 LDC 协处理器数据加载指令 STC 协处理器数据存储指令 MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令 MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令
[单片机]
ARM指令B和BL解析
ARM指令B和BL解析 B或BL指令引起处理器转移到 子程序名 处开始执行,也就是跳转指令。 两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器)。由于BL指令保存了下条指令的地址,因此使用指令 MOV PC ,LR 即可实现子程序的返回。而B指令则无法实现子程序的返回,只能实现单纯的跳转。用户在编程的时候,可根据具体应用选用合适的子程序调用语句。
[单片机]
ARM指令和Thumb指令区别
Thumb指令集 Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度1】的问题而提出的,它具有16为的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。 在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。 1】.代码密度:单位存储空间中包含的指令的个数。例如 ARM指令是32位的,而Thumb指令
[单片机]
PIC单片机学习之SPI操作数码管
/**************************** 现象:通过查询的方式利用SPI接口实现对74HC595的操作,并在数码上显示。 *****************************/ #include pic.h #include ../head/config.h //包含自己的配置头文件 __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);//对熔丝位进行设置 uchar data_temp; //单片机LED共阳极段码表(带小数点) 0~9 c
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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