`
javababy1
  • 浏览: 1170323 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ARM学习笔记(九)--指令基本格式

 
阅读更多

指令基本格式:

    <opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}

    1、<>内的项是必须的,{}内的项是可选的,cond若不附指令后使用默认条件AL(无条件执行)。

    2、opcode:指令助记符,如LDR,STR等;

    3、cond:执行条件,如EQ,NE等;

    4、S:是否影响CPSR寄存器的值;

    5、Rd:目标寄存器;

    6、Rn:第一个操作数的寄存器;

    7、operand2:第二个操作数;ARM指令中,灵活使用第二个操作数可提高代码效率,第二个操作数的形式有:

    #immed_8r ——常数表达式;

    Rm ——寄存器方式;

    Rmshift ——寄存器移位方式;

    其指令编码格式如下:

    31-28

    27-25

    24-21

    20

    19-16

    15-12

    11-0 12位)

    cond

    001

    opcode

    S

    Rn

    Rd

    shifter_operand

    #immed_8r:

    该常数必须对应8位位图(即首尾两个"1"bit间的间距为6bits且该常数通过循环左移偶数位所有bit=1的位必集中在低8bits)。如 0x1FE、511、0xFFFF、0x1010、0xF0000010为非法常量,0x3FC、0、0xF0000000、200、 0xF0000001为合法常量。

    利用这种转换巧妙的实现了:在32bits的ARM指令代码中集成32bits的立即数(常数)。如立即寻址的 数据处理指令的指令代码为:xxxx001a aaaSnnnn ddddrrrr bbbbbbbb,则其第二个操作数op2=#b,ROR #2r,由op2到指令码的转换经编译器完成。

    对其中的operand2的常数表达式有这样的规定:该常数必须对应8位位图,即常熟是由一个8位的常熟循环右移偶数位得到的。这句话的意思是说,当用12位第二操作数来表示一个32位立即数时,采用的是将8位数通过移位的方式来实现的,其中12位第二操作数的低八位存放被移位的基本数(取值范围为0255),而高四位存放的是循环右移的位数,因为位四位二进制数,所以取值范围位为015,而对应的移位位数则为030位,也就是说若移位数为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位位图。

    Rm:

    在寄存器方式下,第二个操作数即寄存器的数值;

    Rm,shift:

    在寄存器移位操作方式下,将寄存器的移位结果作为操作数,但Rm的值保持不变,移位方法有下:

    其中n取值一般在1--31之间。

    8、The ARM instruction set:

    9、指令条件码:

    源文档 <http://hi.baidu.com/luckdst/blog/item/9744e20fea5c32226059f3d3.html>

分享到:
评论

相关推荐

    linux学习笔记v1.0 - 1860平台指令.docx

    arm-linux-gcc -o wanfangzhu bd_daemon_new.c -lpthread -static arm-linux-gcc -o wanfangcong bd_daemon_new.c -lpthread -static ps | grep 773 kill su adb root adb remount adb push D:\project\万方\...

    ARMv8架构与指令集.学习笔记

    全面深入介绍ARMv8架构与指令集相关内容,包括 ARM /thumb指令,ARMv8的架构层级与32/64位异常模型跟路由选择等。

    ARM&Thumb指令集个人笔记

    这是本人学习完ARM&Thumb指令集的一个个人总结,里面包含了几乎所有的 ARM7的ARM&Thumb指令,指令格式,指令用法,希望对您在ARM方面的学习有所帮助,欢迎下载。

    ARM学习超级全资料

    很全的ARM学习资料,个人整理的,与其闲置不容免费让大家学习! 《ARM嵌入式常用模块与综合系统设计实例精讲》练习题与答案.rar 《ARM嵌入式应用开发技术白金手册》源代码.rar ARM9平台下的CMOS图像传感器数据采集...

    ARM常用指令和伪指令祥解.doc

    ARM常用指令和伪指令祥解.doc,学习ads ARM 汇编的一些笔记.

    ARM汇编详尽学习笔记

    很详尽的介绍了arm汇编的指令 不愧为好的学习资料

    ARM的堆栈学习笔记

    以下是我在学习ARM指令中记录的关于堆栈方面的知识

    ARM体系结构与编程——读书笔记.doc

    本人自学《ARM体系结构与编程》记录下来的ARM汇编指令集。与大家分享!

    学习笔记(OpenCV在PC Ubuntu上的安装).docx

    下面进行镜像制作,注意仅在终端中输入下方的指令即可,无需输入注释内容。 cd /home/esion/zed // 生成镜像的目录 dd if=/dev/zero of=opencv_lib.img bs=1M count=80 // 镜像的名字opencv_lib.img和大小80M,可以...

    arm体系架构文档集合.rar

    1.Architecture Reference Manual ARMv8, for ARMv8-A architecture profile.pdf:::...7.armv8学习笔记.pdf::::::::::::::::::::::::::::::::::: 8.Linux内核设计与实现3th.pdf

    ARM汇编指令.docx

    自己学习arm汇编的过程中总结的一些笔记,希望可以帮到别人。

    (自学笔记)最全嵌入式Linux学习手册.docx

    从底层系统支持到上层gui应用的方方面面,内容涵盖linux操作系统的安装及相关工具的使用、配置,嵌入式编程所需要的基础知识(交叉编译工具的选项设置、makefile语法、arm汇编指令等),硬件部件的使用及编程(囊括...

    Linux与嵌入式(个人总结笔记,可自行删改)

    第五章:ARM编程指令详解(条件码,跳转指令,7个寻址方式介绍) 第六章:ARM汇编编程实例(包含顺序结构,switch结构,if-else结构,for循环结构等) 主要适合嵌入式基础学习。 个人总结,难免有疏漏和错误,请...

    汇编语言笔记 参考《汇编语言 第三版》王爽.zip

    - **教学与理解计算机原理**:学习汇编语言有助于深入理解计算机体系结构、指令集、内存管理和硬件接口等基础概念。 ### 编程特点与挑战 - **手动管理内存**:程序员需要手动分配和释放内存,跟踪数据在内存中的...

    STM32中断嵌套及外部中断全程攻略

    断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断...

Global site tag (gtag.js) - Google Analytics