ARM 8位位图 常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的
关于ARM处理器中“8位位图”的理解分析
在ARM处理器的汇编语言中,对指令语法格式中的的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。”
首先从ARM指令系统的语法格式说起。
一条典型的ARM指令语法格式分为如下几个部分:
{}{S} ,{,}
其中,<>内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件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位)
cond001opcodeSRnRd 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位。
为什么要有这样的规定?
|
对ARM8位位图的学习总结
一条典型的ARM指令语法格式分为如下几个部分:
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。
opcode 指令助记符,如LDR,STR 等
cond 执行条件,如EQ,NE 等
S是否影响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位,依次类推。举例表示:
ANDR1,R2,#0xff
当处理器处理这条指令的第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0.
ANDR1,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。
ANDR1,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位位图”的理解分析.pdf )
是一个讲述ARM处理器中8位位图的word文档
详细介绍了在ARM处理器中对位图的操作细节
在ARM处理器的汇编语言中,对指令语法格式中的的常数表达式有这样的规定:“该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数位得到的。”对于这句话,我一开始学ARM时不理解,到了后来为了做设计,去看...
迅雷for linux系统,arm64位,支持国产系统银河麒麟,下载速度比浏览器快多了。安装方便简单
从51到ARM32位嵌入式系统入门-2,一共有二个压缩包文件,这是第二个,需下载完2个,才能解压文件成功!请注意了!
通过正反例的比较,可以总结如下:第一,判断一个数是否符合8 位位图的原则,首先看这个数转换成二进制后1 的个数是否不超过8个,如果不超 过8 个,再看这n个1(n<=8)是否能同时放到8 个二进制位中,如果可以放进去...
英国ARM公司是全球领先的半导体知识产权(IP)提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构 [1] 。 GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 ...
ARM9 ARM920T DataSheet说明书,详细讲述了ARM9内核结构
EL-ARM-860型教学实验系统属于一种综合的教学实验系统,该系统采用了目前在国内普遍认同的ARM920T核,32位微处理器,实现了多模块的应用实验。它是集学习、应用编程、开发研究于一体ARM实验教学系统。用户可根据自己...
ARM基础ARM基础ARM基础ARM基础ARM基础ARM基础ARM基础ARM基础ARM基础
ARM32位处理器
VScode,Arm32位安装包
arm-linux-ld命令说明arm-linux-ld命令说明arm-linux-ld命令说明arm-linux-ld命令说明
ARM-860-2410说明书,有助于大家能够够好的了解ARM-860-2410的使用和掌握
向日葵arm版
在网上摘录的——ARM处理器体系架构详细说明! 希望对大家有用!
ARM编译器 ADS1.2说明 KEIL等说明 对于初学ARM了解编译器很有用 可是看看
ARM架构参考手册ARM V9
android 5.0手机出现后 很多手机都已经使用64位芯片 造成仅有armeabi armeabi-v7a 相关的Zbar Zxing二维码扫描出现打开就闪退 报:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip...