您的位置 首页 报告

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

ARM汇编语言程序格式可执行映象文件的格式:*.axm*.bin*.elf*.hex代码段示例:汇编语言源程序的基本结构:AREAInit,CODE,READONLYENTR…

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指令修正该全局变量的值。

AREAglobals,CODE,READONLY

EXPORT asmsub

IMPORTglovbvar;声明外部变量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:填写映象文件中,第一个要履行的源文件的方针文件.

(异常中断的跳转函数)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/276857.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部