Linux下ARM汇编语法

发布者:MysticalSoul最新更新时间:2020-02-26 来源: eefocus关键字:Linux  ARM  汇编语法 手机看文章 扫描二维码
随时随地手机看文章

第一部分 Linux下ARM汇编语法


尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点 (www.gnu.org)上下载有关规范。


一. Linux汇编行结构


任何汇编行都是如下结构: 

[:] [} @ comment 

[:] [} @ 注释 

Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。 

【例1】定义一个"add"的函数,返回两个参数的和。 

.section .text, “x” 

.global add @ give the symbol add external linkage 

add: 

ADD r0, r0, r1 @ add input arguments 

MOV pc, lr @ return from subroutine 

@ end of program


--------------------------------------------------------------------------------


二. Linux 汇编程序中的标号


标号只能由a~z,A~Z,0~9,“.”,_等字符组成。当标号为0~9的数字时为局部标号,局部标号可以重复出现,使用方法如下: 

标号f: 在引用的地方向前的标号 

标号b: 在引用的地方向后的标号


【例2】使用局部符号的例子,一段循环程序 

1: 

subs r0,r0,#1 @每次循环使r0=r0-1 

bne 1f @跳转到1标号去执行 

局部标号代表它所在的地址,因此也可以当作变量或者函数来使用。


三. Linux汇编程序中的分段 

(1).section伪操作 

用户可以通过.section伪操作来自定义一个段,格式如下: 

.section section_name [, "flags"[, %type[,flag_specific_arguments]]] 

每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与armasm中的AREA相同)。 

下面是ELF格式允许的段标志 

含义 

a 允许段 

w 可写段 

x 执行段


【例3】定义段 

.section .mysection @自定义数据段,段名为 “.mysection” 

.align 2 

strtemp: 

.ascii "Temp string n"


(2)汇编系统预定义的段名 

.text @代码段 

.data @初始化数据段 

.bss @未初始化数据段 

.sdata @ 

.sbss @ 

需要注意的是,源程序中.bss段应该在.text之前。


--------------------------------------------------------------------------------


四. 定义入口点 

汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点。 

【例4】定义入口点 

.section.data 

.section .bss 

.section .text 

.globl _start 

_start:


--------------------------------------------------------------------------------


五. Linux汇编程序中的宏定义 

格式如下: 

.macro 宏名 参数名列表 @伪指令.macro定义一个宏 

宏体 

.endm @.endm表示宏结束 

如果宏使用参数,那么在宏体中使用该参数时添加前缀“”。宏定义时的参数还可以使用默认值。 

可以使用.exitm伪指令来退出宏。 

【例5】宏定义 

.macro SHIFTLEFT a, b 

.if b ”表示不相等,其他的符号如:+、-、*、/、%、、>>、|、&、^、!、==、>=、 {,} 

分配number_of_bytes字节的数据空间,并填充其值为fill_byte,若未指定该值,缺省填充0。(与armasm中的SPACE功能相同)


--------------------------------------------------------------------------------


六.word {,} … 

插入一个32-bit的数据队列。(与armasm中的DCD功能相同) 

可以使用.word把标识符作为常量使用 

例如: 

Start: 

valueOfStart: 

.word Start 

这样程序的开头Start便被存入了内存变量valueOfStart中。


--------------------------------------------------------------------------------


七.hword {,} … 

插入一个16-bit的数据队列。(与armasm中的DCW相同)


八. GNU ARM汇编特殊字符和语法 

代码行中的注释符号: ‘@’ 

整行注释符号: ‘#’ 

语句分离符号: ‘;’ 

直接操作数前缀: ‘#’ 或 ‘$’


第二部分 GNU的编译器和调试工具 

一. 编译工具 

1.编辑工具介绍 

GNU 提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二进制转换工具objcopy。基于ARM平台的工具分别为arm- linux-as、arm-linux-gcc、arm-linux-g++、arm-linux-ld和arm-linux- objcopy。GNU的编译器功能非常强大,共有上百个操作选项,这也是这类工具让初学者头痛的原因。不过,实际开发中只需要用到有限的几个,大部分可 以采用缺省选项。GNU工具的开发流程如下:编写C、C++语言或汇编源程序,用gcc或g++生成目标文件,编写连接脚本文件,用连接器生成最终目标文件(elf格式),用二进制转换工具生成可下载的二进制代码。 


(1)编写C、C++语言或汇编源程序 

通常汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,读者可以从GNU的站点(www.gnu.org)上下载有关规范。汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点(见下文关于连接脚本的说明)。 


(2)用gcc或g++生成目标文件 

如果应用程序包括多个文件,就需要进行分别编译,最后用连接器连接起来。如笔者的引导程序包括3个文件:init.s(汇编代码、初始化硬件)xmrecever.c(通信模块,采用Xmode协议)和flash.c(Flash擦写模块)。分别用如下命令生成目标文件: arm-linux-gcc-c-O2-oinit.oinit.s arm-linux-gcc-c-O2-oxmrecever.oxmrecever.c arm-linux-gcc-c-O2-oflash.oflash.c 其中-c命令表示只生成目标代码,不进行连接;-o命令指明目标文件的名称;-O2表示采用二级优化,采用优化后可使生成的代码更短,运行速度更快。如果项目包含很多文件,则需要编写makefile文件。关于makefile的内容,请感兴趣的读者参考相关资料。 


(3)编写连接脚本文件 

gcc 等编译器内置有缺省的连接脚本。如果采用缺省脚本,则生成的目标代码需要操作系统才能加载运行。为了能在嵌入式系统上直接运行,需要编写自己的连接脚本文件。编写连接脚本,首先要对目标文件的格式有一定了解。GNU编译器生成的目标文件缺省为elf格式。elf文件由若干段(section)组成,如不特殊指明,由C源程序生成的目标代码中包含如下段:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符 串;.bss(未初始化数据段)包含未初始化的变量、数组等。C++源程序生成的目标代码中还包括.fini(析构函数代码)和. init(构造函数代码)等。连接器的任务就是将多个目标文件的.text、.data和.bss等段连接在一起,而连接脚本文件是告诉连接器从什么地址 开始放置这些段。例如连接文件link.lds为: 

ENTRY(begin) 

SECTION 

.=0x30000000; 

.text:{*(.text)} 

.data:{*(.data)} 

.bss:{*(.bss)} 

其中,ENTRY(begin)指明程序的入口点为begin标号;.=0x00300000指明目标代码的起始地址为0x30000000,这一段地址为 MX1的片内RAM;.text:{*(.text)}表示从0x30000000开始放置所有目标文件的代码段,随后的.data:{* (.data)}表示数据段从代码段的末尾开始,再后是.bss段。 


(4)用连接器生成最终目标文件 

有了连接脚本文件,如下命令可生成最终的目标文件:arm-linux-ld –no stadlib –o bootstrap.elf -Tlink.lds init.o xmrecever.o flash.o 

其中,ostadlib表示不连接系统的运行库,而是直接从begin入口;-o指明目标文件的名称;-T指明采用的连接脚本文件(也可以使用-Ttext address,address表示执行区地址);最后是需要连接的目标文件列表。 


(5)生成二进制代码 

连接生成的elf文件还不能直接下载执行,通过objcopy工具可生成最终的二进制文件: 

arm-linux-objcopy –O binary bootstrap.elf bootstrap.bin 

其中-O binary指定生成为二进制格式文件。Objcopy还可以生成S格式的文件,只需将参数换成-O srec。还可以使用-S选项,移除所有的符号信息及重定位信息。如果想将生成的目标代码反汇编,还可以用objdump工具: 

arm-linux-objdump -D bootstrap.elf 

至此,所生成的目标文件就可以直接写入Flash中运行了。 


2.Makefile实例 

example: head.s main.c 

arm-linux-gcc -c -o head.o head.s 

arm-linux-gcc -c -o main.o main.c 

arm-linux-ld -Tlink.lds head.o ain.o -o example.elf 

arm-linux-objcopy -O binary -S example_tmp.o example 

arm-linux-objdump -D -b binary -m arm example >ttt.s 


二. 调试工具 

Linux 下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux下应用程序的远程调试。 gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行,并通过串口与上位机上的gdb通信。开发者可以通过上位机的gdb输入命令,控制目标板上进程的运行,查看内存和寄存器的内容。gdb5.1.1以后的版本加入了对ARM处理器的支持,在初始化时加入- target==arm参数可直接生成基于ARM平台的gdbserver。gdb工具可以从ftp: //ftp.gnu.org/pub/gnu/gdb/上下载。 


对于Linux内核的调试,可以采用kgdb工具,同样需要通过串口与上位机上的gdb通信,对目标板的Linux内核进行调试。可以从http://oss.sgi.com/projects/kgdb/上了解具体的使用方法。

关键字:Linux  ARM  汇编语法 引用地址:Linux下ARM汇编语法

上一篇:arm汇编adrl(以及ldr与adr的区别)
下一篇:Python2.5.4移植到arm-linux

推荐阅读最新更新时间:2024-11-11 19:04

当STM32遇到Linux = STM32MP1
STM32MP1 系列是ST今年2月重磅推出的最新多核微处理器产品(MPU),集成两颗主频 650MHz 的 Arm® Cortex-A7 应用处理器内核和一颗运行频率209MHz 的高性能 Arm® Cortex-M4 微控制器内核。这一灵活的异构计算架构在充分满足多种应用的灵活性需求的同时,又实现了最佳性能和低功耗特性。Cortex-A7 内核支持开源操作系统 (Linux/Android),Cortex-M4 内核完美沿用现有的 STM32 MCU 生态系统,有助于开发者轻松实现各类开发应用。同时,STM32MP1嵌入了3D图形处理器(GPU),以支持人机界面(HMI)显示器;兼备高能效实时控制和高功能集成度,有助于简化工业
[单片机]
ARM串口硬件及软件测试
从51开始就深受串口的打击,先是从华强买来的MAX232本来就是坏的,结果以为是自己电路或者原理图有问题,由于也没有一个好用的串口,就想着所有从自己开始,从最小系统板到后来的外围电路,后来验证是芯片不好使。之后又发现公头,母头在设计电路上还有讲究。在ARM设计时还需要将电平转换芯片换成MAX3232,即驱动电压为3.3V的芯片。 接下来做一些串口调试方面的相关总结: 1. 给刚焊接好的板子上电,通过万用表测试MAX3232 产生的电压信号验证。MAX3232 的2 脚对地是+10V 左右,6 脚对地是-10V 左右,16 脚是+5V 左右,15 脚接地 2. 打开我的电脑- 管理- 设备管理器- 端口- 通讯端口,双击,进
[单片机]
<font color='red'>ARM</font>串口硬件及软件测试
ARM-FPGA杜邦线之片间传输--高速数据串扰
片间传输--高速数据串扰 这几天调试一个东东,STM32的FSMC传输数据给Bingo自制的VGA控制器,由于没有直接打板,板间用了杜邦线连接。FMSC传输模式为最快的速度,FSMC写时序如下图所示,最快达到了72M(HCLK)的速度。但是我用了杜邦线,,没办法。。。神奇的事情不断地发生,幽灵一直在身边,以此分享给大家点滴心得,虽然我也只是知道皮毛。 下图是我项目中STM32与FPGA间,杜邦线连接的图,杜邦线20cm,FSMC 最高HCLK=72MHz。从右到左分别为D0-D15,CS,RS,WR,RD 先贴一下贵人相助时的聊天记录,众人经验总结,精华部分,值得分享:
[单片机]
<font color='red'>ARM</font>-FPGA杜邦线之片间传输--高速数据串扰
ARM携手合作伙伴在深圳建立面向创客、创业者的合作平台
ARM今日宣布,与国家集成电路设计深圳产业化基地(以下简称:SZICC)、北京安创空间科技有限公司(以下简称:安创空间)以及深圳原子比特智造科技有限公司(以下简称:ABI)在深圳建立战略合作关系,并推动创建旨在孵化创新创业项目、帮助创客团队的资源共享平台。ARM将与SZICC、安创空间和ABI通力协作,通过整合国内外领先的世界级技术与优秀团队,推动中国智能硬件产业升级,协助深圳市实现 大众创业、万众创新 的目标。 今后,ARM将向本地更多地引入智能硬件领域全球领先的技术、解决方案、开发资源、设计服务、品牌资源等,并利用ARM生态系统的优势,打造符合深圳市场特点的智能硬件生态系统,为当地的初创公司与OEM厂商提供平台级的
[网络通信]
英特尔前总裁自立门户,推出ARM架构数据中心芯片
众所周知,服务器芯片一直被Intel垄断,不过近年来,AMD在这一领域开始崛起,逐渐蚕食Intel的市场,Intel对手可不止这一家,这不,Intel前总裁创立的公司也推出了服务器芯片,不过和Intel 至强处理器不同,该公司推出的是arm架构的数据中心芯片。不过,如果这家公司发展壮大,对Intel的影响还是不容忽视的。 据国外媒体报道,英特尔前总裁蕾妮·詹姆斯(Renee James)领导的初创公司Ampere Computing周二表示,该公司推出了其首批数据中心芯片,采用了ARM构架。 该公司表示,这些售价在550美元至850美元之间的新芯片,已经被联想集团和其他几家制造服务器的公司所选用。 英特尔在服务器芯片市场占据主导地
[嵌入式]
采用ARM7的S3C44BOX的嵌入式定量分析系统设计方案
  煤矸石是采煤和洗煤过程中排放的固体废物,是一种在成煤过程中与煤层伴生的黑灰色岩石。全国现有矸石山1500余座,堆积量30亿吨以上,占中国工业固体废物排放总量的40%以上。煤矸石的大量堆放,不仅占用土地资源,而且造成环境污染。用洗中煤和矸石混烧发电,是解决污染的有效途径。2009年,煤矸石综合利用量3.9亿吨以上,利用率达到70%以上。如何快速、精确地定量分析混合燃料中煤与矸石的搭配比例,就成为监管部门及企业需要解决的问题。为解决上述问题,本文基于ARM7芯片S3C44BOX,设计了一个集数据采集、处理、显示为一体的嵌入式定量分析系统,并可以通网络将数据传送到远程PC。   1 系统原理及总体方案设计   1.1 系统原理
[单片机]
采用<font color='red'>ARM</font>7的S3C44BOX的嵌入式定量分析系统设计方案
全志推出基于玄铁C906的Linux SBC,售价12美元
本文来源CNX-Software,作者Jean-Luc Aufranc 阿里巴巴在2019年推出了玄铁910 RISC-V内核(又名XT910),具有强大功能,最多支持16个内核。但在2020年的更新显示,该公司计划开发一个完整的RISC-V核心系列产品,用于从低功耗微控制器到服务器SoC的广泛应用。 当时,我只是假设公司计划保留他们的核心,但时间证明我错了,因为阿里巴巴负责开发RISC-V核心的子公司平头哥开始与全志科技合作开发开源处理器,很快就会发布低成本的支持Linux的RISC-V SBC(单板电脑)。 据我所知,公司与全志科技签订了保密协议,但根据现阶段可用的公开信息,售价12.5美元的矽速科技(Sipee
[嵌入式]
全志推出基于玄铁C906的<font color='red'>Linux</font> SBC,售价12美元
基于ARM9的机电设备检测终端研究与设计
机电设备检测终端系统集微处理器、数据采集、控制执行、通信接口、人机接口等模块于一体,达到实时监测机电设备状态的目的。 随着生产自动化水平的提高,机电设备在很多大型设备中处于核心地位,渐趋复杂,对其维护的要求越来越高,若机电设备的故障得不到及时的发现,整个大型装备的正常运行将会受到影响。根据设备实时检测数据和故障诊断为基础的维修具有针对性强,实时性高的优点。从而达到降低生产成本、提高企业效益的目的,极具研究前景。 1 机电设备检测终端系统硬件设计 机电设备检测终端控制结构框图如图1所示。主控模块是机电设备检测终端的核心,主要负责从信号采集模块获取机电设备的运行参数,对获得的数据进行相关分析与处理,显示机电设备的运行参数,定时
[单片机]
基于<font color='red'>ARM</font>9的机电设备检测终端研究与设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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