微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

代码段和数据段。

使用示例:

AREAInit,CODE,READONLY

该伪指令定义了一个代码段,段名为Init,属性为只读

2)、ENTRY

格式:ENTRY

用于指定汇编程序的入口点。一个源文件里最多只能有一个ENTRY(可以没有)。

3)、END

格式:END

用于通知编译器已经到了源程序的结尾。

4)、CODE16、CODE32

格式:CODE16(或CODE32)

CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。

CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。

在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换

示例:

AREAInit,CODE,READONLY

CODE32;通知编译器其后的指令为32位的ARM指令

LDRR0,=NEXT+1;将跳转地址放入寄存器R0

BXR0;程序跳转到新的位置执行,并将处理器切换到Thumb工作状态

……

CODE16;通知编译器其后的指令为16位的Thumb指令

NEXTLDRR3,=0x3FF

……

END;程序结束

5)、EXPORT(或GLOBAL)

格式:EXPORT标号

export伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。

6)、IMPORT

格式:IMPORT标号

IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用

如果当前源文件实际并未引用该标号,该标号也会被加入到当前源文件的符号表中。

7)、EXTERN

格式:EXTERN标号

EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用

如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。

8)、GET(或INCLUDE)

格式:GET文件名

GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。

汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪指令将这个源文件包含到其他的源文件中。使用方法与C语言中的"include"相似。

GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN伪指令

示例:

AREAInit,CODE,READONLY

GETa1.s;通知编译器当前源文件包含源文件a1.s

GETC:\a2.s;通知编译器当前源文件包含源文件C:\a2.s……

END

9)、INCBIN

格式:INCBIN文件名

INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中

示例:

AREAInit,CODE,READONLY

INCBINa1.dat;通知编译器当前源文件包含文件a1.dat

INCBINC:\a2.txt;通知编译器当前源文件包含文件C:\a2.txt……

END

10)、ROUT

格式:{名称}ROUT

ROUT伪指令用于给一个局部变量定义作用范围。

在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,

而使用ROUT后,局部变量的作为范围为当前ROUT和下一个ROUT之间。

11)、ALIGN

格式:ALIGN{表达式{,偏移量}}

ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式

表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、8、16等。

偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2的表达式次幂+偏移量。

示例:

AREAInit,CODE,READONLY,ALIEN=3;指定后面的指令为8字节对齐。

五.ARM汇编伪指令(读取内存地址)

1)ADR及ADRL

将PC相对偏移的地址或基于寄存器相对偏移的地址值读取到寄存器中

格式:ADR(ADRL)寄存器,地址表达式

ADR小范围的地址读取伪指令,

ADRL中等范围的地址读取伪指令

例:

查表

ADRR0,D_TAB;加载转换表地址

LDRBR1,[R0,R2];使用R2作为参数,进行查表

……

D_TAB

DCB0xC0,0xF9,0xA4,0xB0,0x99,0x92

2)LDR

用于加载32位立即数或一个地址值到指定的寄存器,大范围的地址读取伪指令.

LDR通常都是作加载指令,但是它也可以作伪指令。作用是装载一个32bit常数和一个地址到寄存器。

格式:LDR寄存器,=地址表达式

COUNTEQU0x56000054;COUNT是一个变量,地址为0x56000054。

LDRR1,=COUNT;将COUNT这个变量的值(地址),也就是0x56000054放到R1中。

MOVR0,#0

STRR0,[R1];是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去

;这三条指令是为了完成对变量COUNT赋值。

3)NOP

空操作伪指令,可用于延时操作

例:延时子程序

Delay

NOP;空操作

NOP

NOP

SUBSR1,R1,#1;循环次数减1

BNEDelay

MOVPC,LR

六、Thumb指令集

有兴趣的自学

//*arm体系结构第五天*

七、C语言与汇编混合编程

完全使用汇编语言来编写程序会非常的繁琐

通常,只是使用汇编程序来完成少量必须由汇编程序才能完成的工作,而其它工作则由C语言程序来完成。

(一)、ATPCS规则

混合编程中,双方都须遵守ATPCS规则。这些基本规则

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top