arm gnu汇编宏定义.macro .endm
阅读数:405 评论数:0
跳转到新版页面分类
硬件/嵌入式
正文
一、概述
1、目前常用的arm汇编环境有以下两种:
(1)arm asm: arm公司的汇编器,适合于windows平台下使用。
(2)gnu arm asm:gnu交叉编译工具链中的汇编器,适合于linux开发平台。
对于嵌入式开发来说,因为我们运行代码的平台并不是电脑,而是其他架构的SoC,比如ARM架构的芯片。但是我们开发过程却是在电脑上开发,所以我们需要的事交叉编译工具链。
这些工具都有前缀字段,他们有通用的命名规则:arch - vendor - os - abi ,其中:
arch | 表示目标平台的CPU架构,比ARM架构 |
vendor | 这个单词指的是供应商。一般这个字段可以标识工具链由那个芯片厂商制作的,或者这个工具链可以编译哪个厂商的CPU。这个字段基本都是不写、或者写为none,这样就表示可以适用ARM架构的所有CPU。 |
os | 这个字段表示目标平台运行的操作系统。常见的会写linux、none。一般来说none的工具链都是用于编译裸机程序的。写linux则编译的程序是运行与linux系统上,当然这个字段就算写着linux,也是可以编译裸机程序的。 |
abi | 就是Application Binary Interface(应用程序二进制接口)英文的缩写。这个字段常见的有:abi、eabi、gnu、gnueabi、uclibc等等。其中gnu是指使用glic库,eabi是指Embedded Application Binary Interface(即嵌入式应用程序二进制接口)。 |
二、gnu风格arm汇编语法
.macro定义一段宏代码,.macro表示代码的开始,.endm表示代码的结束。
.macro 宏名称 参数(多个之间用“,”隔开,也可以不带参数)
宏的实体部分
.endm
如果宏使用参数,那么在宏体中使用该参数时添加前缀"\",使用.exitm伪指令来退出宏。
.macro SHIFTLEFT a, b
.if \b < 0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm
汇编程序的缺省入口是_start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。
.section .data
< initialized data here>
.section .bss
< uninitialized data here>
.section .text
.globl _start
_start:
<instruction code goes here>
相关推荐
一、armv8概述
ARM架构版本号从1-8,ARMv8架构支持以下两种执行状态:
1、aarch64
(1)提供31个64位通用寄存器(其中x30被用来做链接寄存器LR(函数返回地址)),一个64位
全称Prefetch from memory。
1、PLD = prefetch for load
2、PST = prefetch for store
3、L1表示一级缓存,L2表示二级存,L3表示
Vector Base Address Register,在开启MMU的系统,vbar中写入的是虚拟地址。
armv8定义了vbarel1、vbarel2、vbarel3三个基址寄存器。
当中断产生
当访问零寄存器时,所有写操作都被忽略,所有读操作返回0。因为操作寄存器的速度是最快的,这个寄存的作用是提供0这个值,避免操作内存。
零寄存器当用作源寄存器时读操作的结果为零,当用作目标寄存器时则将结果