两种arm汇编程序结构和基本语法

存在两种ARM编译开发环境

1.ADS/SDT、RealView MDK等ARM公司推出的开发工具
2.GNU ARM开发工具

大家所熟知的一般都是第一种,第二种一般只有在系统移植中大家才会去接触,ARM汇编语言的伪操作、宏指令在不同的编译环境下有不同的编写形式和规则


第一种环境的ARM汇编框架和常用语法

			AREA	Example,CODE,READONLY	; 声明代码段Example 
			ENTRY				; 标识程序入口
			CODE32				; 声明32位ARM指令
START			MOV		R0,#1	
			MOV		R0,#0		
			END	;标明程序结束

AREA定义一个段,Example为段名,CODE说明是代码段,READONLY表面这个段是只读的

ENTRY相当于C语言中的入口函数main

START定义程序起始地方

后面必须加上一个END

1.符号定义伪操作

  • 全局变量定义GBLA、GBLL及GBLS
  • 局部变量定义LCLA、LCLL及LCLS
  • 变量赋值伪操作SETA、SETL及SETS
  • 给通用寄存器列表定义名称RLIST

2.数据定义位操作

  • DCD(DCDU)
  • 声明数据缓存池LTORG
  • 分配存储空间SPACE
  • 定义结构化内存表首地址/数据域 MAP

3.汇编控制伪操作

  • 条件编译(IF、ELSE、ENDIF)
  • 重复汇编(WHILE、WEND)
  • 宏定义 (MACRO、MEND、MEXIT)

4.杂项伪操作

  • 段属性定义伪操作AREA
  • 对齐方式设置ALIGN
  • 声明程序的入口点ENTRY
  • 源程序结尾标识END
  • 定义常量或标号名称EQU
  • 声明全局标号EXPORT(或GLOBAL)
  • 将符号导出到目标文件EXPORTAS
  • 外部符号声明IMPORT 和 EXTERN
  • 文件包含伪操作GET和INCBIN

汇编语句格式

{程序标号} {指令} {;注释}
{程序标号} {伪操作} {;注释}
{程序标号} {伪指令} {;注释}

符号命名规则

符号由大小写字母、数字、下划线组成,且符号是区分大小写的。
符号在其作用范围内必须是唯一的。
程序中的符号不要与指令助记符或者伪操作同名。
局部标号可以用数字开头,其他的标号不能。




第二种环境的ARM汇编架构和常用语法

.global _start
.text
_start:
        ....
        ....
.end


1.符号定义位操作

  • 常量定义伪操作.equ或.set
  • 声明全局变量伪操作.global或.globl
  • 声明外部变量伪操作.extern

2.数据定义伪操作

  • 字节定义.byte
  • 半字定义.hword或.short
  • 字定义.word或.int或.long
  • 双字定义.quad
  • 四字定义.octa
  • 字符串定义.ascii和.asciz或.string
  • 单精度浮点数定义.float或.single
  • 双精度浮点数定义.double
  • 声明数据缓冲池.ltorg

3.汇编与反汇编代码控制伪操作

  • 指令集类型标识伪操作arm    包括  .code 32    .thumb    .code 16
  • 段属性定义伪操作   可以是.text、.data、.bss中的一个
  • 对齐方式设置伪操作.align或.balign
  • 代码位置设置伪操作.org 

4.预定义控制伪操作

  • 文件包含伪操作.include       格式:.include "file_name"    用于将一个源文件包含到当前的源文件中,所包含的文件在.include指令的位置处进行汇编处理
  • 条件编译伪操作.if  
    格式
    .if logical_expression
    程序代码段A
    {.else
    程序代码段B
    } .
    .endif 
  • 宏定义伪操作.macro

基本规则实际上和GNU C语言规则













顺便给出ARM汇编立即数的表示方法,在ARM汇编中,如果没有特别表示,一般立即数都默认表示为10进制的,16进制的立即数前面加上0x,二进制的立即数前面加上2_,立即数前面不要忘记加上#

你可能感兴趣的:(mini2440学习)