ARM之汇编学习---如何编写ARM汇编程序

如何编写ARM汇编程序编程

---------------------------------------------------------spa

Author             :tiger-john
WebSite            :blog.csdn.net/tigerjb
.net

Email               jibo.tiger@gmail.com设计

编译环境           ADS1.2code

Tiger声明:本人鄙视直接复制本人文章而不加出处的我的或团体,orm

但不排斥别人转载tiger-john的文章,只是请您注明出处并和本人xml

联系或留言给我3Q对象

---------------------------------------------------------blog

一.前言字符串

1.   看一个程序:

                 AREA    TigerJohn,CODE,READONLY;声明代码段

                     CODE32                       ;声明为32ARM指令

                     ENTRY                         ;声明程序入口

START           MOV      R0 ,#0

                     MOV R1 ,#1

                     ADD R1, R1,R0

                     B     START

                     END

2.   ARM汇编程序中用“;”号进行注释。

二.汇编语言程序格式

一个完整的ARM汇编由两部分组成:声明,实际代码段两部分组成。

1.   声明:在一个程序以前先要进行声明

1>都要声明什么

l  声明代码段:

AREA指令定义一个段,说明所定义段的相关属性

(说明段的名字,段的属性)

l  声明ARM指令:

CODE32CODE16来声明程序为32ARM指令或是16Thumb指令。

l  声明程序入口:用ENTRY指令标识程序的入口点。

2>3个声明缺一不可。

3>在程序完成后要用END 指令声明程序结束。每个汇编程序段都必须有一条END指令,指示代码段的结束。

2.  

1>ARM汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具备特定的名称。

2>段的分类

Ø 代码段:代码段的内容为执行代码

Ø 数据段:数据段存放代码运行时须要用到的数据。

注:一个汇编程序至少有一个代码段。若是程序较长时,能够分割为多个代码段和数据段。多个段在程序编译链接时最终造成一个可执行的映像文件。

3>段具备如下的属性

Ø READONLY

Ø READWRITE

三.汇编语言的语句格式

[LABEL]  OPERATION  [OPERAND] [COMMENT]

标号域 操做助记符域 操做数域   注释域 

1.   标号域(LABLE

1>标号域用来表示指令的地址、变量、过程名、数据的地址和常量。

2>标号是能够本身起名的标识符,语句标号能够是大小写字母混合,一般以字母开头,由字母、数字、下划线等组成。

3> 语句标号不能与寄存器名、指令助记符、伪指令(操做)助记符、变量名同名。

4> 语句标号必须在一行的开头书写,不能留空格     

2.   操做助记符域(OPERATION)

1>操做助记符域能够为指令、伪操做、宏指令或伪指令的助记符。

2> ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符能够所有用大写、或所有用小写,但不容许在一条指令中大、小写混用

3> 全部的指令都不能在行的开头书写,必须在指令的前面有空格,而后再书写指令。

4> 指令助记符和后面的操做数或操做寄存器之间必须有空格,不能够在这之间使用逗号。

3.   操做数域(OPERAND)

操做数域表示操做的对象,操做数能够是常量、变量、标号、寄存器名或表达式,不一样对象之间必须用逗号分开。

四.ARM指令集格式

opcode  {<cond>}{S}    <Rd>,<Rn>  {,<operand2>}

1.   其中<>中的项是必须的,{}中的项是可选的。

2.   opcode  表示指令助记符。

cond:表示执行条件。

S:表示是否影响CPSR寄存器的值。

Rd:表示目标寄存器。

Rn:表示第一个操做数的寄存器。

operand2:表示第2个操做数。

3.operand2”具备以下的形式:

1>#immed_8r:常数表达式

eg:MOV  R0,#1

      ADD   R0,R1,#0X0F 

2>Rm:寄存器形式。

即在寄存器方式下,操做数即为寄存器的数值。

eg:MOV     PC,R0

      ADD     R1,R1,R2

3>Rm,shift:寄存器移位方式。

将寄存器的移位结果做为操做数,当Rm值保持不变。

Ø ASR #n:表示算术右移n位。

Ø LSR  #n:表示逻辑右移n位。

Ø ROR #n:表示循环右移n位。

Ø RRX    #n:带扩展的循环右移n位。

Ø LSL  #n:逻辑左移n位。

3.   使用条件码“cond”能够实现高效的逻辑操做,提升代码的效率。

Ø 全部的ARM指令均可以条件执行。

Ø Thumb指令只有B(跳转)指令具备条件执行功能。

注:若是执行中不代表条件码,默认为无条件(AL)执行。

五.汇编程序中经常使用的符号

在汇编语言程序设计中,常常使用各类符号表示变量、常量和地址

Ø 符号由大小写字母、数字以及下划线组成。

Ø 符号区分大小写,同名的大、小写符号会被编译器认为是两个不一样的符号。

Ø 符号在其做用范围内必须惟一,即在其做用范围内不可有同名的符号。

Ø 自定义的符号名不能与系统的保留字相同。

  符号名不该与指令或伪指令同名。

1.   程序中的变量:

1>ARM汇编程序所支持的变量有数字变量,逻辑变量和字符串变量

2>ARM汇编程序设计中,可以使用GBLA,GBLL,GBLS伪定义声明全局变量,使用LCLA,LCLL,LCLS声明局部变量,并可以使用SETA,SETLSETS对其经行初始化。

2.   程序中的常量

1>ARM汇编程序所支持常量有数字常量,逻辑常量和字符串常量。

3.   程序中的变量代换

1>程序中的变量可经过代换操做取的一个常量。代换操做符为”$”

2>使用示例:

LCLS    S1

LCLS    S2    ;定义局部字符串变量S1S2

S1       SETS        “Test!”

S2       SETS        “This is a $ S1”;S2的值为“This is a Test