Chinaunix首页 | 论坛 | 博客
  • 博客访问: 272837
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1917
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 16:27
文章分类

全部博文(33)

文章存档

2015年(33)

分类: 嵌入式

2015-05-30 18:06:09

ARM 汇编语言程序中的语句可以由指令、伪指令和宏指令组成。

伪指令:以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,
称为汇编指示(Assembler Directive)或伪操作(Pseudo-operation)(伪指令对应的动作称为伪操作)。
其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行。
也就是说,这些伪指令只是汇编过程中起作用,一旦汇编结束,伪指令的使命也就随之消失。
对应到C中可理解为:
int i=1; // 它就相当于伪操作,只是负责定义一个变量并赋初值,并不会翻译成具体的机器指令
i=i+1; //它会被翻译成具体的机器指令,对应一个具体动作

宏指令:类似于C语言里的宏,调用宏时通过实际的指令来代替宏体实现相关的一段代码,与 C 语言中的子函数形参和实参的调用
相似,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性
以及宏内容可以同步修改。其中语句可以是指令、伪指令,甚至是已定义的宏指令。

指令:这个不需要多说,就是干事的,每一条指令在执行时都对应一种CPU操作,不来虚的。


关于汇编的语法:
这里有两套汇编的语法:分为ARM公司的标准ARM汇编语言和GNU对ARM支持的GNU ARM汇编。ARM标准汇编语言即ARM公司的开发
工具ADS里用的汇编语言;GNU汇编即在LINUX下用GCC编译的汇编。两者语法有少许差异。因此,通常我们下载的LINUX下的ARM接口
代码(uboot汇编和内核汇编)放到ADS下是不能编译通过的,需要进行少许修改。GNU AS语法即AT&T汇编语法,uboot用到的语法。

Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号。

先看看伪指令

1. abort
.abort
停止汇编

2. if...else...endif2. if...else...endif
.if
.else
.endif
支持条件预编译
和下面的作用一样,而且在uboot里一般使用下面的做法:
#ifdef CONFIG_USE_IRQ
A

#else
B

#endif
上面表示如果定义了CONFIG_USE_IRQ(不管CONFIG_USE_IRQ的逻辑是“真”还是“假”)就汇编A段代码(不汇编B段代码),否则汇编B段代码。
另外,#if defined (x)和#ifdef (x)表示的意思一样,只是前者可以组成复杂的预编译条件,如;
#if defined (A) && defined (B)
#if defined (A) || VERSION > 12

3.  include
.include "file"
包含指定的头文件,  可以把一个汇编常量定义放在头文件中。

4. comm
.comm   symbol, length
在bss段申请一段命名空间,该段空间的名称叫symbol,长度为length。ld连接器在连接会为它留出空间。

5. data
.data subsection
说明接下来的定义归属于subsection数据段。

6. equ
.equ symbol, expression
把某一个符号(symbol)定义成某一个值(expression)。该指令并不分配空间。相当于C语言的#define

7. global
.global symbol
.globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号,
链接器在链接时会查找目标文件中的_start符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序
都要提供一个_start符号并且用.globl声明。如果一个符号没有用.globl声明,就表示这个符号不会被链接器用到。

8. ascii
.ascii "string"
定义一个字符串并为之分配空间.

9 long
.long expressions
定义一个长整型,  并为之分配空间。就是相当于在当前位置分配空间并放置一个值。例如:
_rWTCON:  
    .long 0x15300000  
就是在当前地址,即_rWTCON所代表的地址处放一个值0x15300000 

10. macro/endm   定义一个宏
 .macro 宏名 参数名列表
  宏体
 .endm @.endm表示宏结束
如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。宏定义时的参数还可以使用默认值。
可以使用.exitm伪指令来退出宏。
【例5】宏定义
.macro SHIFTLEFT a, b
.if \b < 0
MOV \a, \a, ASR #-\b
.exitm
.endif
MOV \a, \a, LSL #\b
.endm

11. req
name .req register_name:  为寄存器定义一个别名.

12. code
.code [16|32]:  指定指令代码产生的长度, 16 表示 Thumb 指令, 32 表示 ARM 指令.

13. align absexpr1,absexpr2:
以某种对齐方式,在未使用的存储区域填充值.  第一个值表示对齐方式,4, 8,16 或 32.  第二个表达式值表示
填充的值.


这里只是列举了常用的一些,关于ldr和adr单独讲。


关于注释:在gnu arm的汇编里,也就是我们经常看到的uboot和内核里的汇编,常用的注释有两种:
1、“/*   comment    */”  像C语言里的注释,常用来连续注释几行


2、 “@” 这种注释方法常用来注释一整行,或在某一行的中间开始使用,那么这一行的后面部分就被注释了,如:
orr r0, r0, #0x00000002 @ set bit 2 (A) Align

GNU汇编GNU ASM链接如下:

阅读(3133) | 评论(0) | 转发(0) |
0

上一篇:mdev详解

下一篇:ldr和str及adr

给主人留下些什么吧!~~