跳至主要内容

【转】GNU ARM汇编快速入门

前言:

以前用ARMIDE工具,使用的是ARM标准的汇编语言。现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNU ARM的汇编程序,用不了多少时间你就就可以无师自通了。个人比较健忘,还是把文档翻译了一下,算是给自己一个避免遗忘的理由吧。

ARM
汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令.

目前常用的ARM编译环境有2种:
ARMASM: ARM
公司的IDE中使用了CodeWarrior的编译器,绝大多数windows下的开发者都在使用这一环境,完全按照ARM的规定;
GNU ARM ASM: GNU
工具的ARM版本,与ARMASM略有不同;

关于CodeWarriror ARM汇编的书和文章很多,本文假定你已经完全了解ARMASM,这里只说明GNU ARM汇编,并针对ARMASM给出说明。本文翻译自:GNU ARM Assembler Quick Reference 本人水平有限,错误难免,转载随意,请注明出处。英文原文地址不详。


GNU ARM 汇编快速入门


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

 

[<label>:] [<instruction or directive>} @ comment
[<
标签>:] [<指令>} @ 注释

 

GNU ARM 汇编中,任何以冒号结尾的都被认为是一个标签,而不一定非要在一行的开始。下面是一个简单的例子,这段汇编程序定义了一个"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

GNU ARM汇编伪指令


下面列出了一些
GNU ARM汇编伪指令,并给出了相应说明。


.ascii "<string>" 在汇编中定义字符串并为之分配存储空间(与armasm中的DCB功能类似)。

.asciz "<string>" 和
.ascii类似, 但不分配存储空间。

 

.balign <power_of_2> {,<fill_value> {,<max_padding>} }
以某种排列方式在内存中填充数值。 (该指令与armasm中的ALIGN类似)
power_of_2表示排列方式,其值可为
481632,单位是byte
fill_value
是要填充的值;
max_padding
最大的填充界限,请求填充的bytes数超过该值,将被忽略。

 

.byte <byte1> {,<byte2>} … 定义一个或多个Byte,并为之分配空间(与armasm的DCB类似)。 

.code <number_of_bits> 设定指令宽度,16表示Thumb,32表示ARM assembly
(和armasm中的CODE16,CODE32相同)。

 

.if 
.else
.endif
预编译宏(与armasm中的IF ELSE ENDIF相同)。

 

.end 汇编文件结束标志,常常省略不用。


.endm 宏结束标志。
.exitm 宏跳出。

.macro <name> {<arg_1} {,<arg_2>} … {,<arg_N>}
定义一段名为name的宏,arg_xxx为参数。

必须有对应的.endm结尾。

可以使用
.exitm从中间跳出宏。(与armasm中的MACRO, MEND, MEXIT相同)。
在使用宏参数时必须这样使用:"\<arg>"

例如:
[CODE].macro SHIFTLEFT a, b
.if \b < 0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm


.rept <number_of_times> 循环执行.endr前的代码段number_of_times次。
(与armasm中的WEN相似)


.irp <param> {,<val_1>} {,<val_2>} …
循环执行
.endr前的代码段,param依次取后面给出的值。
在循环执行的代码段中必须以
"\<param> "表示参数。


.endr 结束循环
(armasm中的WEND相似).

 

.equ <symbol name>, <value> 为一个标号赋值,类似C中的#define。(与armasm中的EQU相同)

 

.err 编译错误报告,将引起编译的终止。

 

.global <symbol> 全局声明标志,这样声明的标号将可以被外部使用。(与armasm中的EXPORT相同)。

 

.hword <short1> {,<short2>} …
插入一个16-bit的数据队列。(与armasm中的DCW相同)

 

.ifdef <symbol> 如果 <symbol>被定义,该快代码将被编译。以 .endif结束。
.ifndef <symbol> 如果 <symbol>未被定义,该快代码将被编译。以 .endif结束。

 

.include "<filename>" 包含文件。(与armasm中的INCLUDE 或者C中的#i nclude一样)

 

<register_name> .req <register_name>
定义一个寄存器,.req的左边是定义的寄存器名,右边是使用的真正使用的寄存器。

(与
armasm中的RN类似)
例如:
acc .req r0

 

[CODE].section <section_name> {,"<flags>"}
开始一个新的代码或数据段。.text, 代码段;.data, 初始化数据段;.bss, 未初始化数据段。
这些段都有缺省的标志(flags,联接器可以识别这些标志。(armasm中的AREA相同)


下面是
ELF格式允许的段标志
<标志
> 含义
a
允许段
w
可写段
x 执行段

 

.set <variable_name>, <variable_value> 变量赋值。(与armasm中的SETA相同)

 

.space <number_of_bytes> {,<fill_byte>}
分配number_of_bytes字节的数据空间,并填充其值为fill_byte,若未指定该值,缺省填充0。

(与
armasm中的SPACE功能相同)

 

.word <word1> {,<word2>} …
插入一个32-bit的数据队列。(与armasm中的DCD功能相同)


GNU ARM汇编特殊字符和语法

 

代码行中的注释符号: '@'
整行注释符号: '#'
语句分离符号: ';'
直接操作数前缀: '#' '$'

 

.arm arm格式编译,同code32
.thumb
thumb格式编译,同code16
.code16
thumb格式编译
.code32
arm格式编译

 

篇后语:


更详细的使用说明请参照:ARM Architecture Reference Manual, Addison-Wesley ISBN 0-201-73719-1

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】select问题

问: 该串口初始化如下 ioctl(comm2Fd,FIOBAUDRATE,9600) ioctl(comm2Fd,FIOSETOPTIONS,OPT_RAW) 使用如下 FD_ZERO   (&readFds); FD_SET   (comm2Fd,   &readFds);   width   =   comm2Fd   +   1; FD_ISSET   (comm2Fd,   &readFds); FOREVER { if(timeoutvalue==0) { printf("\nselect   start!\n"); selectnum   =   select   (width,   &readFds,   NULL,   NULL,   NULL); printf("\nselect   over!\n"); }                                 ........... } 现在的状况是程序跑一段时间后会死机或这个串口通讯任务死掉,每次死机都是"select   start!"打印出来,而"select   over!"打印不出来,在仅这个串口通讯任务死掉的情况下,用comm1Fd超级终端登陆,查询任务状态,会发现tExcTask任务居然处于挂起状态??? 哪位大哥帮忙分析一下或给予一点提示,小弟不胜感激!! 答: sele...

搞笑

1.55岁的周润发宣布死后将捐出99%的财产,什么都不想带走。作家顾晓军评论道:千万不要捐到大陆来,不要害了无辜的官员。 2.发改委成立至今只做过两件事:1)涨价,2)替涨价辩护。 3.目前中国有效的反腐手段有:1夫妻反目;2家中被盗;3情人举报;4狗咬狗,5站错队 4.国外奶粉热销中国的原因:1没有三聚氰胺;2如果有,可以索赔巨款;3如果索赔不成,不会坐牢 5.1955年中国的人均收入是韩国的3.2倍,日本的1.1倍。但经过50多年翻天覆地的增长,2008年中国的人均收入是日本的3%,韩国7%,但韩国、日本从来没宣布自己经济怎么翻番,只有中国是天天说自己翻了很多番。 6.中国人固有一死,或死于地沟油,或死于石灰面粉,或死于结石奶粉,或死于毒疫苗,或死于危房,或死于拆迁,或死于躲猫猫,或死于日记,或死于酒色,或死于车轮下,或死于被自杀……死并不可怕,可怕的是你根本不知道自己是怎么死的! 7.中国不一定是和邻国土地争端最多的国家,但肯定是和本国公民土地争端最多的国家。 8.在谈所谓大国崛起之时,请扪心自问:你的收入崛起没有、你的住房面积崛起没有、你的护照免签国家数量崛起没有、你的食品安全崛起没有、你的医保社保崛起,你的国防力量增强了没有...如果都没有,那么大国再崛起关你P事。 9.日本人冈本真夜1997年的一首歌无耻地抄袭了我们2010年世博会的会歌,太可恶了!!? 10.什么是奇迹?我建了一座豆腐渣大楼,然后雇了150个短工装修,很多人说这房子容易塌,我充耳不闻。结果「哗啦」的塌了,把他们埋在废墟里整整八天八夜,我找人挖开塌坍时,有一百多人活着。这是个奇迹,更奇迹的是我他妈不但无罪,表彰会上我还成了救人的大英雄! 11.统计局宣布:中国城市人均月收入已突破9000人民币大关。拖祖国后腿的请自觉转发。 看到这个消息我不禁黯然神伤,仔细算算,我何止才拖了祖国的大腿,我都扒到祖国的臀部了,对不起,祖国---我是否扯到你的蛋了!!