ARM汇编指令学习(0) ARM 汇编语言程序格式

发布者:advancement4最新更新时间:2016-06-24 来源: eefocus关键字:ARM  汇编指令学  程序格式 手机看文章 扫描二维码
随时随地手机看文章
ARM 汇编语言程序格式

  可执行映象文件的格式: *.axm *.bin *.elf *.hex

 

代码段示例:

汇编语言源程序的基本结构:

     AREA Init,CODE,READONLY

     ENTRY

Start

     LDR R0,=0x3FF50000

     LDR R1,0xFF

     STR R1,[R0]

     LDR R0,=0x3FF5008

     LDR R1,0x01

     STR R1,[R0]

    

     END

 

Arm 体系结构3种执行流程:

1 顺序执行

2 跳转执行

3 异常中断执行

 

Arm 子程序调用使用命令 BL 子程序名称

子程序调用示例:

              AREA Init , CODE , READONLY

              ENTRY

Start

              LDR R0 , =0x3FF5000

              LDR R1 , 0xFF

              STR R1 , [R0]

              LDR R0 , =0x3FF5008

              LDR R1 , 0x01

              STR R1 , [R0]

              BL PRINT_TEXT

              ┉┉

PRINT_TEXT

              ┉┉

              MOV PC,LR

              ┉┉

           END

 

C/C++及汇编语言的混合编程

ARM集成开发环境中包含的C/C++编译器。

编译器

名称

编译器

种类

源文件

类型

源文件

后缀

输出目标文件类型

armcc

C

C

*.C

32位ARM代码

tcc

C

C

*.C

16位Thumb代码

armcpp

C++

C/C++

*.C/*.C++

32位ARM代码

tcpp

C++

C/C++

*.C/*.C++

16位Thumb代码

 

在C\C++程序中使用内嵌的汇编指令的语法格式:

      在ARM C语言程序中,使用关键字__asm来标识一段汇

编指令程序。

              __asm      ;2 个下划线

              {

                  汇编语言程序

                  ~~~~~~~~

                  汇编语言程序

              }

其中:如果一行中有多个汇编指令,指令之间使用分号(;)分开。

         在一条指令占多行,要使用续行符号(\).

 

在C/C++程序中内嵌汇编指令注意事项:

o      必须小心使用物理寄存器,如R0~R3,SP,LR 和CPSR 中的N,Z,C,V 标志位.因为计算汇编代码中的C 表达式时,可能会使用这些物理寄存器,并会修改N,Z,C,V标志位。

              __asm

              {

              MOV R0,x

              ADD y,R0,x/y //计算x/y 时R0 会被修改

              }

       在计算x/y 时R0 会被修改,从而影响R0+x/y 的结果.用一个C 程序的变量代替

R0就可以解决这个问题:

              __asm

             {

              MOV var,x

              ADD y,var,x/y

             }

       内嵌汇编器探测到隐含的寄存器冲突就会报错.

o      不要使用寄存器代替变量.尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量.

              int bad_f(int x) //x 存放在R0 中

              {

                     __asm

                  {

                    ADD R0,R0,#1 //发生寄存器冲突,实际上x 的值没有变化

                  }

                  return(x);

              }

         尽管根据编译器的编译规则似乎可以确定R0 对应x,但这样的代码会使内嵌汇编器认为

发生了寄存器冲突.用其他寄存器代替R0 存放参数x,使得该函数将x 原封不动地返回.

          这段代码的正确写法如下:

              int bad_f(intx)

                {

                     __asm

                 {

                    ADD x,x,#1

                  }

                  return(x)

              }

 

从汇编程序中访问C程序变量

在C程序中声明的全局变量可以被汇编程序通过地址间接访问。具体访问方

法如下:

o      使用IMPORT伪指令声明这个全局变量。

o      使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。

o      根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。

              AREA  globals,CODE,READONLY

              EXPORT asmsub

              IMPORT  glovbvar;声明外部变量glovbvar

       asmsub

              LDR R1,=glovbvar;装载变量地址

              LDR R0,[R1] ;读出数据

              ADD R0,R0,#1;加1 操作

              STR R0,[R1];保存变量值

              MOV PC, LR

              END

 

C程序与汇编程序互相调用规则

寄存器的使用规则

  1. 子程序间通过寄存器R0~R3来传递参数。
  2. 在子程序中,使用寄存器R4~R11来保存局部变量。
  3. 寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。
  4. 寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 
  5. 寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。
  6. 寄存器R15是程序计数器,记作PC

 

 

*.axf (下载到sdram 里面调试(AXD))  

ARM fromelf(转化)   ---->    *.bin  *.elf  *.hex  *.i32 烧写到flash里面保存 

 

 

1.       将映象文件(*.axf)下载到SDRAM内调试,工具为JTAG 板 或者仿真器.

RO BASE: 设置SDRAM内的地址,可以设置SDRAM 的首地址,或者是靠近首

地址值的地址值,RO BASE的值一定要按照字对齐.

RW BASE: 也可以不设置,如果要设置,RW BASE –RO BASE >映象文件的大下

最好不设置, 值一定要按照字对齐.

 

2.       将映象文件(*.bin *.hex) 烧写到nor flash 内

RO BASE: 设置flash 首地址(0x00000000), 值一定要按照字对齐.

RW BASE: 一定要设置,设置的地址值在SD RAM 内, 值一定要按照字对齐.

 

IMAGE ENTRY POINT: 可以不设置,如果设置就和RO BASE的值.

 

PLACE AT BEGINNING OF IMAGE

Object/Symbol:填写映象文件中,第一个要执行的源文件的目标文件.

(异常中断的跳转函数)

关键字:ARM  汇编指令学  程序格式 引用地址:ARM汇编指令学习(0) ARM 汇编语言程序格式

上一篇:ARM汇编指令学习之开篇
下一篇:ARM 汇编指令条件执行详解

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

基于ARM9的数控铣床系统设计方案
引言   目前国内使用的数控系统通常是在通用计算机或工控机的基础上加装运动控制卡,使用Windows操作系统,并安装昂贵的数控软件构成的。这样的系统软件成本高、硬件资源浪费、功耗大。而嵌入式产品具有系统结构精简、功耗低等特点,能弥补传统数控系统的不足。免费软件Linux 操作系统进军嵌入式领域,更使得嵌入式产品能够充分发挥廉价、高性价比的优势。   本文所述的正是以Linux操作系统为软件平台,以ARM9微处理器为硬件平台,以数控铣床为背景,自主研发数控硬件及软件的嵌入式数控铣床控制系统。   1 系统硬件组成   系统的硬件由ARM系统主板和扩展板卡组成。   硬件结构如图1。   1.1 ARM系统主板   
[工业控制]
基于<font color='red'>ARM</font>9的数控铣床系统设计方案
基于ARM单片机的高精度电子秤设计与实现
1、系统框图简介 当秤盘上放入被秤物体后,电阻应变片受重力的影响产生形变,电阻值发生变化。应变片搭建的桥式电路会输出微弱的电压信号,微弱电压信号由HX711内部集成放大器放大后经过内部ADC进行采样转换后送到到MCU,接收到的数据信息经过线性拟合处理后送到LCD液晶显示。系统能完成称重、设置单价计算金额及金额累加、去皮及去皮范围限制等基本功能,还能实现时间、温度、报警、二维码支付等扩展功能。系统总体框图如图1所示。 图1:系统总体框图 2、理论分析与计算 2.1、电桥驱动电路分析 图2:差动全桥测量电路 如图2所示当被测负载作用在弹性臂梁上使其发生弹性形变;通过粘性物质使粘贴在感压装置上的电阻应变片发生形变,从而转化成
[单片机]
基于<font color='red'>ARM</font>单片机的高精度电子秤设计与实现
微软Windows再度拥抱ARM 突破英特尔、AMD双寡头
  微软(Microsoft)曾尝试让 Windows  RT运行ARM(ARM)处理器,最后以失败告终,如今微软再结盟高通(Qualcomm),推出搭载高通ARM架构Snapdragon 835芯片的随时连结PC(Always Connected PC),这等于打破多年来由英特尔(Intel)及AMD(AMD) x86架构盘据的全球PC中央处理器(CPU)市场格局,让这块市场终于出现非x86架构新选择,另也是微软在面临苹果(Apple) iPad入侵NB市场下,借由推常时连网PC以期抵挡来自iPad对企业PC市场的持续入侵。下面就随嵌入式小编一起来了解一下相关内容吧。   根据The Motley Fool网站报导,微软于20
[嵌入式]
STM32学习008_ARM产品浅析
ARM是英国Acorn有限公司设计的基于RSIC的一款微处理器,全称为Acorn RISC Machine,ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。 ARM处理器的三大特点是:耗电少功能强、16位/32位双指令集和合作伙伴众多。 1、体积小、低功耗、低成本、高性能; 2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件; 3、大量使用寄存器,指令执行速度更快; 4、大多数数据操作都在寄存器中完成; 5、寻址方式灵活简单,执行效率高; 6、指令长度固定。 ARM处理器共有37个寄存器,被分为若干个组(BANK),这
[单片机]
STM32学习008_<font color='red'>ARM</font>产品浅析
集齐x86、ARM 展讯进阶高端市场添保障
   展讯 通讯市场部总监蔡宗宇19日表示,紫光展锐预计2018年推出第一颗5G商用芯片,紧接着到2019年之间,将会推出第二款芯片,并赶上5G第一波商用进程。下面就随嵌入式小编一起来了解一下相关内容吧。 集齐x86、ARM 展讯进阶高端市场添保障   同时 展讯 也已取得ARM授权将自主研发CPU,也是 展讯 与ARM在CPU领域再续前缘。   蔡宗宇19日出席上海市集成电路行业协会大会时做出以上表示。他透露了几个重要的讯息,首先,蔡宗宇说,通讯芯片是集成电路行业的前沿,手机高端基带芯片已经走到三星16纳米、英特尔14纳米为主,包括紫光展锐与英特尔在先进工艺的结合则是确保了资金与生产工艺的合作,强强联手确保竞争力。预计2
[嵌入式]
UIT创新科DCServer ,全国首发10nm Arm伺服器
2018年4月9日,第六届中国电子信息博览会(简称:2018CITE)在深圳会展中心隆重召开。中国电子信息博览会是工业和信息化部与深圳市人民政府联手打造的国家级电子信息全产业链展示平台,集中体现了电子信息领域的最新发展成就。UIT创新科在2018CITE上,展示了首款10nmArm服务器DCServer H2000及其生态建设和软体定义存储等最新创新成果。 2018年4月10日,在2018CITE期间, UIT创新科联手高通和华芯通半导体,发布首款基于10nm Arm处理器的数据中心服务器DCServer H2000。UIT创新科董事长陈凯、UIT创新科副总裁兼服务器产品线总经理罗艳、高通公司中国区主要负责人,华芯通销售副总裁
[半导体设计/制造]
ARM微处理器的指令集概述三—— .word的含义
_undefined_instruction是一个标号,处理到这里时,as会把undefined_instruction的值按16bit的形式放在此标号处。 ldr pc, _undefined_instruction 就是从_undefined_instruction处取值,即undefined_instruction, 并设置到pc中 比如: ldr r1, _rWTCON _rWTCON: .word 0x15300000 是把地址_rWTCON上的内容放到r1,而地址_rWTCON上的内容是0x15300000。实际上就是把r1设置为0x15300000 .
[单片机]
基于ARM的车载导航系统的研究与设计
  0 引 言   在当今社会,汽车成为城市主要的交通工具之一,也越来越成为人们生活中不可缺少的一部分。实现对汽车更加准确的导航和定位,将使外出旅行变得更加快捷方便,同时对改善我国的交通状况也具有重要意义。   目前,国内由于GPS存在着导航卫星信号容易受到外部干扰或屏蔽的问题。例如,当车辆行驶在城市高楼区、地下隧道内、立交桥下时,由于卫星信号受到遮挡而容易暂时“丢失”,而使GPS接收机无法给出定位解或定位精度很差。DR系统可以实现连续自主的导航定位,抗干扰性强,但是DR方向传感器误差较大,且随时间积累,无法长期使用。针对这些情况,本文给出一种利用嵌入式微处理器S3C44B0x开发板作为中央处理单元,利用GPS模块提供位置
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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