ARM入门学习

     一、基础

GNU,一个开源计划,目标是发展一个完全免费自由的类UNIX操作系统。典型的Linux发行版包括Linux内核、一些GNU程序库和工具、命令行Shell、图形界面X Window 系统和相应的桌面环境,并包括很多办公、编辑器、文本编辑器到科学工具的应用软件。

  ARM内核只提供快速中断(FIQ)和标准中断(IRQ)2个中断向量,半导体厂家加入自己定义的中断控制器来支持串口、外部中断等硬件中断。

MMU提供了使各个任务运行时独立的存储空间。MMU提供资源允许使用虚拟存储器 — — 将系统的物理存储器重新编址,可将其看成独立于物理地址的存储空间。MMU作为转换器,将程序和数据虚拟地址(编译时的链接地址)转换成实际的物理地址,即物理主存中的地址。转换过程中允许运行的多个任务使用相同的虚拟地址而各自存储在存储器的不同物理地址。这样存储器有两种地址:虚拟地址和物理地址。虚拟地址由编译器和链接器定位程序时分配,物理地址用来访问实际的物理存储单元。

        高速缓冲寄存器(cache)是一个容量小但是存取速度非常快的存储器,它保存最近用到的存储器数据的副本,Cache自主决定缓存哪些数据。Cache经常与写缓存器一起使用,写缓存器是一个很小的FIFO,位与处理器和主存储器之间,写缓存器将处理器核和Cache从较慢的主存中解脱出来,CPU向主存存数据时,先将数据写入到写缓存器,等CPU空闲时,写缓存器将数据写到主存储器。副作用:由于数据存在系统中的不同物理位置,可能造成数据的不一致性,由于写缓冲器的优化作用,可能有些操作的执行不是按照用户的期望来的,造成操作错误。

     1.1、流水线

         处理器按照一系列步骤执行每一个指令,典型步骤如下:

               从存储器读取指令(fetch)

译码以鉴别是那一类指令(decode)

从指令中提取指令操作数(这些操作数大多存在寄存器 reg)

将操作数进行组合以得到结果或存储器地址(ALU)

如果需要存储则访问存储器存储数据。

将结果写回到寄存器组中

         并不是所有的指令都需要上边的步骤,这些步骤使用不同的硬件,如ALU只在第四步用到。

          3级流水线ARM组织:取指令、译码、执行;5级流水线ARM组织:取指令、译码、执行、缓冲数据、回写。程序执行过程中,PC值是基于3级流水线操作的,在取指级增加的PC值被直接送到译码级的寄存器。

         互锁:下一条指令要用到上一条指令的结果;跳转,会影响流水线。

     1.2、寄存器组织

          通用寄存器、状态寄存器、1个PC寄存器。



      二、ARM的指令集

           ARM的指令集:跳转指令、数据处理指令、程序状态寄存器传输指令、load/store指令、协处理器指令、异常中断指令。指令的寻址方式:数据指令寻址、内存访问寻址。

      2.1、数据处理指令

           对放在寄存器中的数据进行操作的指令。主要包括数据传送指令、算术指令、逻辑指令、比较与测试指令、乘法指令。

      2.2、Load/Store指令

          内存访问指令标志在ARM寄存器和存储器之间传送数据,ARM指令中有3中基本的数据传送指令。

 单寄存器Load/Store指令:这些指令表示在ARM寄存器和存储器之间提供更灵活的但数据项传送,数据项可以是字节、半字和字。

         多寄存器Load/Store指令:用于进程的进入和退出、保存和恢复工作寄存器以及复制存储器中的一块数据。

单寄存器交换指令:允许寄存器和存储器中的数据进行交换。

    三、GNU汇编伪指令集

  GNU下的ARM伪指令集合是为编译器服务的,不同的编译器有不同的伪指令集,比如ARM C编译器有一套伪指令集、GNU也有一套伪指令集。

         伪指令就是没有对应的机器码的指令,用来告诉汇编程序如果进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能被汇编程序识别并指导汇编如何进行。所有汇编伪指令的名称都是以‘.’开始,余下的是字母通常是小写字母。

         伪指令按照功能分为:符号定义伪指令、数据定义伪指令、汇编控制伪指令、杂项伪指令。

         在ARM(Thumb)汇编语言程序中可以使用.section来进行分段,其中每一个段用段名或者文件结尾为结束,这些段使用默认的标志,如a为允许段、w为可写段、x为可执行段。在一个段中可以定义下列的子段:

                                         .txt    .data    .bss    .sdata   .sbss

         由此,段可以分为代码段、数据段、其他存储用的段,.txt(正文段)包含程序的指令代码,.data(数据段)包含固定的数据,如常量、字符串;.bss(未初始化的数据段)包含未初始化的变量、数组等,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映像文件。


          在ARM汇编程序中,使用BL指令调用子程序,指令“BL 子程序名”即可完成子程序调用。该指令完成如下操作:将子程序的返回地址存储到链接寄存器LR中,同时将程序计数器PC指向子程序的入口点,当子程序调用完毕需要返回调用时,只需要将LR中的地址重新复制给PC即可。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值