`

ARM 汇编指令

 
阅读更多

http://blog.chinaunix.net/uid-23193900-id-3251565.html

 

ARM指令教程

 

ARM汇编程序特点:

l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值.

l         ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,0,为负…)

CMP R0,R1

BNE NoMatch

比如上一句,BNE隐含的使用的上一句CMP执行结果.NE后缀表示使用Z标志位.两句合起来的意思就是,如果R0,R1的值不相等,就跳转到NoMatch处执行.

注意,PC=R15,CPSR=R16,

 

 

 

 

 

     

    ARM伪指令不是必须的,但是一个完整没有伪指令几乎很难写出来.

n         比如一个程序至少包含READONLY AREAENTRY,否则CPU都无法知道从哪里开始运行

l         ARM的属于RISC,指令并不多,但是可以带后缀表示扩展出不同用法,这里与X86汇编完全不同风格

n         BNE实际上是B指令的变种,本质还同一类指令.只是多一个对CPSRZ标志位的判断。

 

 

ARM常用指令,伪指令

 

ARM常用指令并不太多,因此使用阅读ARM汇编代码,并不太困难.以下是使用频率最高的指令和伪指令,并不是完整的指令集的教材。详细指令参见参考资料。

l         B,BL

l         MOV,MVN

l         LDR,STR

l         ADD,SUB,ADC,SBC,MUL

l         AND,ORR,XOR,TST,BIC

l         CMP

l         LDM/STM

l         nop

1.         跳转语句 B,BL

      程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转指令用于实现

l  使用专门的跳转指令 B

l  直接向程序计数器PC 写入跳转地址值

n  这是几乎是任何一种CPU必备的机器,PC表示CPU当前执行语句位置,改变PC的值,相当于实现程序跳转

n  如实现类似C语言的Return 语句,就是用MOV PC,LR

n  这里可以在任意4G的空间进行跳转

 

B指令(Branch)表示无条件跳转.

   B main ;跳转到标号为main地代码处

 

BL指令(Branch with Link)表示带返回值的跳转.

   BLB多做一步,在跳转前,BL会把当前位置保存在R14(LR寄存器),当跳转代码结束后,MOV PC,LR指令跳回来,这实际上就是C语言执行函数的用法,

   汇编里调子程序都用BL,执行完子函数后,可以用MOV PC,LR跳回来.

   BL delay ;执行子函数或代码段delay ,delay可以为C函数.

 

MOV PC,XXX能在4G空间跳转不同,B语句只能32M空间跳转,(因为偏移量是一个有符号26bit的数值=32M)

 

2.         传输数据指令MOV,MVN

n  MOV(MOVE)指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器

MOV R0,R1 ; R1的值传到R0

MOV R3,#3 ;把常数3传给R3,MOV中用#表示常数,这个值不能超过

n  MVN( MOVE Negative)取反后再传值,MOV多了一步取反

MVN R0, #0 ;0取反(-1)传给R0

MVN R1,R2  ;R2的值取反传给R1

 

 

3.         加载/存储指令,LDR,STR

n  LDR,STR是用于寄存器和外部存储器交换数据指令,注意与MOV的区别,后面只在寄存器或常数交换.

u              LDR/STR可以采用多种寻址方式,以下只举出使用频率最高几种用法

n  LDR(load)用于把一个32BitWORD数据从外部存储空间装入到寄存器中

LDR R0,[R1]; R1的值当成地址,再从这个地址装入数据到R0 (R0=*R1)

LDR R1,=0x30008000 ; 把地址0x30008000的值装入到R1,LDR中用常数要用=打头.(注意跟MOV的区别,MOV#)

ldr  r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)

用位与的方法赋值

 

n  STR(Store) 用于把一个寄存器的值存入外部存储空间,LDR的逆操作.

STR R0,[R1] ; R0的值,存入到R1对应地址空间上(*R1 = R0)

STR R0,=0x30008000 ;R0中值存入到地址0x30008000

 

S2C2440的中CPU内核以外的模块的控制寄存器空间也是属于外部空间,所以也得用如下指令LDR R0,=GPFDAT

 

4.         算术运算指令,ADD/ADC,SUB/SBC ,MUL

n         ADD加法指令

ADD R0,R1,R2; R0=R1+R2

ADD R0,R1,#3 ;R0=R1+3

n         ADC带进位加法指令,即除了加两个数以外,还要把CPSRC值也要带进来

u              通常用于大数(超过32Bit整数)相加,这时单用ADD不能处理,必须折成两步,其中一步用ADC.

u              以下是做64Bit的加法

ADDS R0,R1,R2; R0=R1+R2,ADDSS表示把进位结果写入CPSR

ADC R5,R3,R4 ;R5=R3+R4+C

n         SUB减法指令

SUB R0,R1,R2; R0=R1-R2

SUB R0,R1,#3 ;R0=R1-3

n         SBC带进位减法指令,即除了加两个数以外,还要把CPSRC值也要带进来,类似ADC

u              以下是做64Bit的减法

SUBS R0,R1,R2; R0=R1-R2,SUBSS表示把进位结果写入CPSR

SBC R5,R3,R4 ;R5=R3-R4-C

n         MUL 乘法指令

MUL R0,R1,R2; R0=R1*R2

MUL R0,R1,#3 ;R0=R1*3

 

5.         位操作指令 AND,ORR, TST,BIC

n         AND位与指令

AND R0,R1,R2; R0=R1 & R2

AND R0,R1,#0xFF ;R0=R1 & 0xFF

n         ORR位或指令

ORR R0,R1,R2; R0=R1 | R2

ORR R0,R1,#0xFF ;R0=R1 | 0xFF

n         TST测试某一位是否为1,并把结果写入CPSR,供下一句使用

TST R1,#0xffe;   等同于if(R1 & 0xffe)

TST R1,#%1;测试最低位是否为1,%表示二进制

n         BIC清位操作

BIC   R0R0,#0xF           等同于 R0 &=~(0xF)

BIC   R0R0,#%1011    该指令清除 R0 中的位 0 1  3,其余的位保持;   %表示是二进制,0x表示十六进制

 

6.         比较指令 CMP

n         CMP比较两个操作数,并把结果存入CPSR供下一句语句使用

CMP R0,R1; 比较R0,R1

 

7.         多寄存器语句传输指令,LDM,STM

类似于一次传一个BUFFER到寄存器当中,或反过来.后面一般要接一个地址改变方法

n         LDM BUFFER传数据多个寄存器传输数据到

LDMIA R0! ,{R3-R9} ;R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新,IA后缀表示按WORD递增

LDMFD SP!,{R0-R7,PC}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。

n         STM 从寄存器列表向存储空间传值。

STMIA R1!,{R3-R9} ;R3-R9的数据存储到R1指向的地址上,R1值更新。

STMFD SP!,{R0-R7,LR}; 现场保存,将R0~R7LR入栈

  stmfd    sp!,{r8-r9} ,把SP寄存器对庆的地址的值存到R8,R9当中.!表示最后的值写入SP中。Fd表示

8.         ARM指令的变形

大部分指令后位可以接 <cond>S两个特殊位来表示,CPSR特殊的一些判断

S,表示当前指令执行后把结果改写CPSR

subs,Adds

<Cond>取决于具体条件,只有CPSR满足指定条件时才指这一指令

 

 

BEQ 实际上B+ EQ的条件执行.

addne 表示ADD +NE 才开始加.

 

9.         ARM指令的寻址方式

  寻址方式是根据指令中给出的地址码来定位真实的地址,ARM中有9种寻址方法

l  寄存器寻址

直接用寄存器编号来寻址,最为常用

  MOV R1,R2 ;R2->R1

l  立即数寻址

即指令中的地址码是操作数本身,可以立即取出使用,立即数前带一个#表示,否则表示一个地址

SUBS R0,R0,#1   ;R0 -1 ->R0

注意与SUBS R0,R0,1区别

l  寄存器偏移寻址

这是ARM特有的寻址模式,当第2操作数是寄存器,在执行操作之前,可以做一次移位操作

MOV R0,R2,LSL #3 ;R2的逻辑左移3,结果放入R0,R0=R2*8

ANDS R1,R1,R2,LSL R3;RS的值左移R3,然后和R1相与操作,结果放入R1

移位操作有LSL (逻辑左移),LSR(逻辑右移) ,ASR(算术右移),ROR(循环右移)RRX带扩展的循环右移

 

 

l         寄存器间接寻址

即寄存器中值是一个地址,[]来取出定位到地址当中

 LDR R2,[R0] ;R0的值当成地址,取出相应值,赋给R2

l         基址寻址

把寄存器的地址值加上一个偏移量

LDR R2,[R3,#0x0F]; R3中的值加上0x0F,从这个地址取出值赋给R@

l         相对寻址

基址寻址的变形,PC寄存器提供基准地址,指令中地址段作为偏移量.两者相加即是有效地址,以下是BL采用相对寻址

BL NEXT

NEXT

    

MOV PC,LR ;从子程序返回

10.     ADS ARM的伪指令

  类似于C语言的宏,由汇编程序预处理.

l         符号定义指令

全局变量定义 GBLA ,GBLL,GBLS

局域变量定义 LCLA,LCLL,LCLS

变量赋值SETA,SETL,SETS

其中上述伪指令中,最后面的A表示给一个算术变量赋值,L表示用于给一个逻辑变量赋值,s表示给一个字符串赋值

GBLL codedbg; 声明一个全局的逻辑变量

Codebg SETL  {TRUE}  ; 设置变量为{TRUE}

LCLA bitno;  声明一个算术变量

Bitno SETA 8 ;设变量值为8

l         数据定义伪指令

n         SPACE 定义一个内存空间,并用0初始化

{label }  SPACE expr

 DataBuf SPACE 100 ;定义100字节长空间, unsigned char DataBuf[100];

n         DCB 定义一个连续字节内存空间,用伪指令的表达式expr来初始化.一般可以用定义数据表格,或文字字符串.(这时等同于SETS),用于初始二进制BUFFER

      {label} DCB expr{,expr …}

       Dest DCB -120,20,36,55 ;等同于 unsigned char Dest[]={-120,20,36,55};

n         DCU定义的一段字的内存空间(DCB是字节),并用后面表达式初始化

      _RESET DCU Reset ; 等同于 DWORD _RESET[]={Reset};

 

n          MAP定一个结构化内存,相当于定义一个C结构

n         FILED 定义一个结构化内存的成员

MAP 0x00,R9 ; 定义内存表,地址为R9

Timer   FIELD 4 ; 定义数据域Timer,长为4

Attrib  FIELD 4 ; 定义数据域Attrib,长为4

String  FILED 100  ; 定义数据域String ,长为100

相当于C语言的定义:

struct {

DWORD Timer ;

DWORD Attrib ;

Char String[100];

} R9;

 

11.     杂项的伪指令

n         字节对齐 ALIGN

ALIGN; 声明4字节对齐

n         定义一个数字常量定义 EQU

NAME EQU expr {type}

  PLLCON EQU 0xE01FC080;定义PLLCON,类似于C的宏或C++的常量

n         包含文件 GETINCLUDE

INCLUDE lpc2106.inc

n         NOP 空指令

在汇编时会被ARM的空操作代替,比如MOV R0,R0,一般用于延时与占位。

n         声明一个外部符符号 IMPORT,EXTERN

IMPORT,EXTERN 向外部导入一个符号,一般是外部程序全局变量

 

n         条件编译:[]。类似于C#ifdef 之类定义。

格式 :[ 条件表达式

        满足条件分支

        |

        不满足条件分支

      ]

示例1

 [ ENTRY_BUS_WIDTH=32  类似#if ENTRY_BUS_WIDTH=32

      b   ChangeBigEndian     ;DCD 0xea000007

   ] ; 类似#endif 

示例2   [ CLKDIV_VAL>1      ; 类似#if CLKDIV_VAL>1

bl MMU_SetAsyncBusMode

          |;类似#else 

        bl MMU_SetFastBusMode ; default value.

]; 类似#endif

          示例3 [ THUMBCODE  类似#ifdef  THUMBCODE

                                   bx lr

                                 | ;类似#else

                              mov   pc,lr

                               ]  ;类似#endif

n         段定义 AREA

n         指令集定义 CODE16CODE32

指示是Thumb 指令集(压缩指令集,每个指令16)。还是普通32位指令集

n         汇编结束:END

n         程序入口ENTRY

 

一个基本ARM程序结构

ARM汇编程序结构

源代码由文本文件组成.按照汇编的编译器不同,分为两大量,一类是ADS的汇编程序,一类是GNU汇编格式,两者在指令集是完成一样,但是在伪指令.程序结构等方法各不同相同.本节主要是讲解ADS汇编格式.

   ADS汇编程序,主要包含如下几类程序

n         汇编源程序,后缀名是.S

n         汇编包含文件,后缀名是.inc

n         如果是与C混和编程..C,.h也能识别

 

         ARM 汇编语句格式

          

           [标号]  <指令|条件|S> <操作数> [;注释]

 

l         所有标号顶格写,而指令和伪指令不能顶格写

l         标识符(标号,指令)大小写敏感,所以要在标号和指令时书写一致,一般伪指令,指令,寄存器名可以全部为大写

l         注释以;开头,可以顶格写

l         可以使用\来分行写太长语句

l         变量,常量的定义必须在一行顶格写

 

常量的书写

l         数字常量

在程序中直接写数字 ,十进制 12,256,十六进制 0x1228,

l         字符常量

类似于C的定义,SETS来定义字符常量

HELLO SETS “hello,the world!”

l         逻辑常量

逻辑真为{TRUE},逻辑假为{FLASE}

  Testno SETS {TURE}

 

     

 

       汇编程序的段定义

            任何一个程序都要分段,C语言一般由编译器自动分段,(分成.Text,.Data段之类),但在汇编程序这样的底层程序中,由开发者自行分段.  它包含如下段

l         至少一个代码段,并且代码段是只读的,对应(.Text)

l         数据段可以没有,也可以有多个.

l         每一个段用END结束

 

AREA 定义一个段

AREA  段名    属性1, 属性2,

例子:AREA InitCODEREADONLY

l         ENTRY 指明一个段的入口

l         END结束一个段

 

         ABC EQU 0x12

            AREA Example,CODE,READONLY

            ENTRY

        START MOV R7,#10

              MOV R6,#5

              ADD R6,R6,R7

              B   

              END

 

ADS ARM汇编程序格式要求

1.     所有标

ARM指令教程

 

ARM汇编程序特点:

l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通用寄存器来完成.因此代码中大量看到LDR,STR指令来传送值.

l         ARM汇编语句中.当前语句很多时候要隐含的使用上一句的执行结果.而且上一句的执行结果,是放在CPSR寄存器里,(比如说进位,0,为负…)

CMP R0,R1

BNE NoMatch

比如上一句,BNE隐含的使用的上一句CMP执行结果.NE后缀表示使用Z标志位.两句合起来的意思就是,如果R0,R1的值不相等,就跳转到NoMatch处执行.

注意,PC=R15,CPSR=R16,

 

 

 

 

 

     

    ARM伪指令不是必须的,但是一个完整没有伪指令几乎很难写出来.

n         比如一个程序至少包含READONLY AREAENTRY,否则CPU都无法知道从哪里开始运行

l         ARM的属于RISC,指令并不多,但是可以带后缀表示扩展出不同用法,这里与X86汇编完全不同风格

n         BNE实际上是B指令的变种,本质还同一类指令.只是多一个对CPSRZ标志位的判断。

 

 

ARM常用指令,伪指令

 

ARM常用指令并不太多,因此使用阅读ARM汇编代码,并不太困难.以下是使用频率最高的指令和伪指令,并不是完整的指令集的教材。详细指令参见参考资料。

l         B,BL

l         MOV,MVN

l         LDR,STR

l         ADD,SUB,ADC,SBC,MUL

l         AND,ORR,XOR,TST,BIC

l         CMP

l         LDM/STM

l         nop

1.         跳转语句 B,BL

      程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转指令用于实现

l  使用专门的跳转指令 B

l  直接向程序计数器PC 写入跳转地址值

n  这是几乎是任何一种CPU必备的机器,PC表示CPU当前执行语句位置,改变PC的值,相当于实现程序跳转

n  如实现类似C语言的Return 语句,就是用MOV PC,LR

n  这里可以在任意4G的空间进行跳转

 

B指令(Branch)表示无条件跳转.

   B main ;跳转到标号为main地代码处

 

BL指令(Branch with Link)表示带返回值的跳转.

   BLB多做一步,在跳转前,BL会把当前位置保存在R14(LR寄存器),当跳转代码结束后,MOV PC,LR指令跳回来,这实际上就是C语言执行函数的用法,

   汇编里调子程序都用BL,执行完子函数后,可以用MOV PC,LR跳回来.

   BL delay ;执行子函数或代码段delay ,delay可以为C函数.

 

MOV PC,XXX能在4G空间跳转不同,B语句只能32M空间跳转,(因为偏移量是一个有符号26bit的数值=32M)

 

2.         传输数据指令MOV,MVN

n  MOV(MOVE)指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器

MOV R0,R1 ; R1的值传到R0

MOV R3,#3 ;把常数3传给R3,MOV中用#表示常数,这个值不能超过

n  MVN( MOVE Negative)取反后再传值,MOV多了一步取反

MVN R0, #0 ;0取反(-1)传给R0

MVN R1,R2  ;R2的值取反传给R1

 

 

3.         加载/存储指令,LDR,STR

n  LDR,STR是用于寄存器和外部存储器交换数据指令,注意与MOV的区别,后面只在寄存器或常数交换.

u              LDR/STR可以采用多种寻址方式,以下只举出使用频率最高几种用法

n  LDR(load)用于把一个32BitWORD数据从外部存储空间装入到寄存器中

LDR R0,[R1]; R1的值当成地址,再从这个地址装入数据到R0 (R0=*R1)

LDR R1,=0x30008000 ; 把地址0x30008000的值装入到R1,LDR中用常数要用=打头.(注意跟MOV的区别,MOV#)

ldr  r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)

用位与的方法赋值

 

n  STR(Store) 用于把一个寄存器的值存入外部存储空间,LDR的逆操作.

STR R0,[R1] ; R0的值,存入到R1对应地址空间上(*R1 = R0)

STR R0,=0x30008000 ;R0中值存入到地址0x30008000

 

S2C2440的中CPU内核以外的模块的控制寄存器空间也是属于外部空间,所以也得用如下指令LDR R0,=GPFDAT

 

4.         算术运算指令,ADD/ADC,SUB/SBC ,MUL

n         ADD加法指令

ADD R0,R1,R2; R0=R1+R2

ADD R0,R1,#3 ;R0=R1+3

n         ADC带进位加法指令,即除了加两个数以外,还要把CPSRC值也要带进来

u              通常用于大数(超过32Bit整数)相加,这时单用ADD不能处理,必须折成两步,其中一步用ADC.

u              以下是做64Bit的加法

ADDS R0,R1,R2; R0=R1+R2,ADDSS表示把进位结果写入CPSR

ADC R5,R3,R4 ;R5=R3+R4+C

n         SUB减法指令

SUB R0,R1,R2; R0=R1-R2

SUB R0,R1,#3 ;R0=R1-3

n         SBC带进位减法指令,即除了加两个数以外,还要把CPSRC值也要带进来,类似ADC

u              以下是做64Bit的减法

SUBS R0,R1,R2; R0=R1-R2,SUBSS表示把进位结果写入CPSR

SBC R5,R3,R4 ;R5=R3-R4-C

n         MUL 乘法指令

MUL R0,R1,R2; R0=R1*R2

MUL R0,R1,#3 ;R0=R1*3

 

5.         位操作指令 AND,ORR, TST,BIC

n         AND位与指令

AND R0,R1,R2; R0=R1 & R2

AND R0,R1,#0xFF ;R0=R1 & 0xFF

n         ORR位或指令

ORR R0,R1,R2; R0=R1 | R2

ORR R0,R1,#0xFF ;R0=R1 | 0xFF

n         TST测试某一位是否为1,并把结果写入CPSR,供下一句使用

TST R1,#0xffe;   等同于if(R1 & 0xffe)

TST R1,#%1;测试最低位是否为1,%表示二进制

n         BIC清位操作

BIC   R0R0,#0xF           等同于 R0 &=~(0xF)

BIC   R0R0,#%1011    该指令清除 R0 中的位 0 1  3,其余的位保持;   %表示是二进制,0x表示十六进制

 

6.         比较指令 CMP

n         CMP比较两个操作数,并把结果存入CPSR供下一句语句使用

CMP R0,R1; 比较R0,R1

 

7.         多寄存器语句传输指令,LDM,STM

类似于一次传一个BUFFER到寄存器当中,或反过来.后面一般要接一个地址改变方法

n         LDM BUFFER传数据多个寄存器传输数据到

LDMIA R0! ,{R3-R9} ;R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新,IA后缀表示按WORD递增

LDMFD SP!,{R0-R7,PC}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。

n         STM 从寄存器列表向存储空间传值。

STMIA R1!,{R3-R9} ;R3-R9的数据存储到R1指向的地址上,R1值更新。

STMFD SP!,{R0-R7,LR}; 现场保存,将R0~R7LR入栈

  stmfd    sp!,{r8-r9} ,把SP寄存器对庆的地址的值存到R8,R9当中.!表示最后的值写入SP中。Fd表示

8.         ARM指令的变形

大部分指令后位可以接 <cond>S两个特殊位来表示,CPSR特殊的一些判断

S,表示当前指令执行后把结果改写CPSR

subs,Adds

<Cond>取决于具体条件,只有CPSR满足指定条件时才指这一指令

 

 

BEQ 实际上B+ EQ的条件执行.

addne 表示ADD +NE 才开始加.

 

9.         ARM指令的寻址方式

  寻址方式是根据指令中给出的地址码来定位真实的地址,ARM中有9种寻址方法

l  寄存器寻址

直接用寄存器编号来寻址,最为常用

  MOV R1,R2 ;R2->R1

l  立即数寻址

即指令中的地址码是操作数本身,可以立即取出使用,立即数前带一个#表示,否则表示一个地址

SUBS R0,R0,#1   ;R0 -1 ->R0

注意与SUBS R0,R0,1区别

l  寄存器偏移寻址

这是ARM特有的寻址模式,当第2操作数是寄存器,在执行操作之前,可以做一次移位操作

MOV R0,R2,LSL #3 ;R2的逻辑左移3,结果放入R0,R0=R2*8

ANDS R1,R1,R2,LSL R3;RS的值左移R3,然后和R1相与操作,结果放入R1

移位操作有LSL (逻辑左移),LSR(逻辑右移) ,ASR(算术右移),ROR(循环右移)RRX带扩展的循环右移

 

 

l         寄存器间接寻址

即寄存器中值是一个地址,[]来取出定位到地址当中

 LDR R2,[R0] ;R0的值当成地址,取出相应值,赋给R2

l         基址寻址

把寄存器的地址值加上一个偏移量

LDR R2,[R3,#0x0F]; R3中的值加上0x0F,从这个地址取出值赋给R@

l         相对寻址

基址寻址的变形,PC寄存器提供基准地址,指令中地址段作为偏移量.两者相加即是有效地址,以下是BL采用相对寻址

BL NEXT

NEXT

    

MOV PC,LR ;从子程序返回

10.     ADS ARM的伪指令

  类似于C语言的宏,由汇编程序预处理.

l         符号定义指令

全局变量定义 GBLA ,GBLL,GBLS

局域变量定义 LCLA,LCLL,LCLS

变量赋值SETA,SETL,SETS

其中上述伪指令中,最后面的A表示给一个算术变量赋值,L表示用于给一个逻辑变量赋值,s表示给一个字符串赋值

GBLL codedbg; 声明一个全局的逻辑变量

Codebg SETL  {TRUE}  ; 设置变量为{TRUE}

LCLA bitno;  声明一个算术变量

Bitno SETA 8 ;设变量值为8

l         数据定义伪指令

n         SPACE 定义一个内存空间,并用0初始化

{label }  SPACE expr

 DataBuf SPACE 100 ;定义100字节长空间, unsigned char DataBuf[100];

n         DCB 定义一个连续字节内存空间,用伪指令的表达式expr来初始化.一般可以用定义数据表格,或文字字符串.(这时等同于SETS),用于初始二进制BUFFER

      {label} DCB expr{,expr …}

       Dest DCB -120,20,36,55 ;等同于 unsigned char Dest[]={-120,20,36,55};

n         DCU定义的一段字的内存空间(DCB是字节),并用后面表达式初始化

      _RESET DCU Reset ; 等同于 DWORD _RESET[]={Reset};

 

n          MAP定一个结构化内存,相当于定义一个C结构

n         FILED 定义一个结构化内存的成员

MAP 0x00,R9 ; 定义内存表,地址为R9

Timer   FIELD 4 ; 定义数据域Timer,长为4

Attrib  FIELD 4 ; 定义数据域Attrib,长为4

String  FILED 100  ; 定义数据域String ,长为100

相当于C语言的定义:

struct {

DWORD Timer ;

DWORD Attrib ;

Char String[100];

} R9;

 

11.     杂项的伪指令

n         字节对齐 ALIGN

ALIGN; 声明4字节对齐

n         定义一个数字常量定义 EQU

NAME EQU expr {type}

  PLLCON EQU 0xE01FC080;定义PLLCON,类似于C的宏或C++的常量

n         包含文件 GETINCLUDE

INCLUDE lpc2106.inc

n         NOP 空指令

在汇编时会被ARM的空操作代替,比如MOV R0,R0,一般用于延时与占位。

n         声明一个外部符符号 IMPORT,EXTERN

IMPORT,EXTERN 向外部导入一个符号,一般是外部程序全局变量

 

n         条件编译:[]。类似于C#ifdef 之类定义。

格式 :[ 条件表达式

        满足条件分支

        |

        不满足条件分支

      ]

示例1

 [ ENTRY_BUS_WIDTH=32  类似#if ENTRY_BUS_WIDTH=32

      b   ChangeBigEndian     ;DCD 0xea000007

   ] ; 类似#endif 

示例2   [ CLKDIV_VAL>1      ; 类似#if CLKDIV_VAL>1

bl MMU_SetAsyncBusMode

          |;类似#else 

        bl MMU_SetFastBusMode ; default value.

]; 类似#endif

          示例3 [ THUMBCODE  类似#ifdef  THUMBCODE

                                   bx lr

                                 | ;类似#else

                              mov   pc,lr

                               ]  ;类似#endif

n         段定义 AREA

n         指令集定义 CODE16CODE32

指示是Thumb 指令集(压缩指令集,每个指令16)。还是普通32位指令集

n         汇编结束:END

n         程序入口ENTRY

 

一个基本ARM程序结构

ARM汇编程序结构

源代码由文本文件组成.按照汇编的编译器不同,分为两大量,一类是ADS的汇编程序,一类是GNU汇编格式,两者在指令集是完成一样,但是在伪指令.程序结构等方法各不同相同.本节主要是讲解ADS汇编格式.

   ADS汇编程序,主要包含如下几类程序

n         汇编源程序,后缀名是.S

n         汇编包含文件,后缀名是.inc

n         如果是与C混和编程..C,.h也能识别

 

         ARM 汇编语句格式

          

           [标号]  <指令|条件|S> <操作数> [;注释]

 

l         所有标号顶格写,而指令和伪指令不能顶格写

l         标识符(标号,指令)大小写敏感,所以要在标号和指令时书写一致,一般伪指令,指令,寄存器名可以全部为大写

l         注释以;开头,可以顶格写

l         可以使用\来分行写太长语句

l         变量,常量的定义必须在一行顶格写

 

常量的书写

l         数字常量

在程序中直接写数字 ,十进制 12,256,十六进制 0x1228,

l         字符常量

类似于C的定义,SETS来定义字符常量

HELLO SETS “hello,the world!”

l         逻辑常量

逻辑真为{TRUE},逻辑假为{FLASE}

  Testno SETS {TURE}

 

     

 

       汇编程序的段定义

            任何一个程序都要分段,C语言一般由编译器自动分段,(分成.Text,.Data段之类),但在汇编程序这样的底层程序中,由开发者自行分段.  它包含如下段

l         至少一个代码段,并且代码段是只读的,对应(.Text)

l         数据段可以没有,也可以有多个.

l         每一个段用END结束

 

AREA 定义一个段

AREA  段名    属性1, 属性2,

例子:AREA InitCODEREADONLY

l         ENTRY 指明一个段的入口

l         END结束一个段

 

         ABC EQU 0x12

            AREA Example,CODE,READONLY

            ENTRY

        START MOV R7,#10

              MOV R6,#5

              ADD R6,R6,R7

              B   

              END

 

ADS ARM汇编程序格式要求

1.     所有标号要顶格写.

2.     所有指令不能顶格写,一般插入Tab键在行首

3.     ADS ARM,是大小写敏感的.建议标号,指令,伪指令,寄存器名全部为大写

4.     注释采用;打头

5.     每个程序至少有一个AREA在代码里(READONLY)

6.     每个段都要用END结束(不能顶格)

 

最常见几个伪指令 AREA,EQU,DCB,END ,ENTRY,EXPORT,GOBEL,IMPORT,

 

常见伪定义

l         DCB 定义字符中

   Str DCB “hello, world “

 

号要顶格写.

 

2.     所有指令不能顶格写,一般插入Tab键在行首

3.     ADS ARM,是大小写敏感的.建议标号,指令,伪指令,寄存器名全部为大写

4.     注释采用;打头

5.     每个程序至少有一个AREA在代码里(READONLY)

6.     每个段都要用END结束(不能顶格)

 

最常见几个伪指令 AREA,EQU,DCB,END ,ENTRY,EXPORT,GOBEL,IMPORT,

 

常见伪定义

l         DCB 定义字符中

   Str DCB “hello, world “

分享到:
评论

相关推荐

    ARM汇编指令集详解

    ARM汇编指令集是嵌入式系统开发中的基础,它是一种低级编程语言,用于直接控制计算机硬件。本文将深入探讨ARM汇编指令集的主要概念、语法和常见指令,帮助你更好地理解和应用这一关键技术。 首先,理解ARM架构是至...

    ARM汇编指令集查看手册

    ARM汇编指令集是ARM处理器的核心组成部分,它为开发者提供了低级编程的工具,使得硬件资源得以高效管理。在深入理解ARM汇编指令集之前,我们首先要明确其在ARM架构中的地位:它是ARM处理器执行操作的基础,涵盖了从...

    arm汇编指令全集

    在本文中,我们将深入探讨ARM汇编指令全集,覆盖基本概念、指令分类以及常见指令的使用。 首先,我们要明白ARM汇编语言的基础。ARM处理器使用RISC(精简指令集计算机)架构,其指令集设计简洁高效。汇编语言由一...

    ARM汇编指令.rar

    ARM汇编指令是嵌入式系统开发中的基础知识,尤其对于低功耗和高性能的设备,如智能手机、嵌入式系统和物联网设备等,ARM架构的应用非常广泛。ARM汇编语言是一种低级编程语言,用于直接控制处理器硬件,提供对硬件...

    ARM汇编指令集详细介绍

    本篇文章将深入探讨ARM汇编指令集及其在处理器中的应用,同时也会讲解寄存器和处理器状态模式。 首先,让我们从基础开始。ARM汇编指令集包括数据处理指令、移动指令、加载和存储指令、分支指令、比较和跳转指令以及...

    arm汇编指令chm

    ARM汇编指令是嵌入式系统开发中的基础知识,尤其在低功耗、高性能的设备设计中,理解并熟练掌握ARM汇编语言至关重要。ARM架构以其高效能和广泛的应用范围,成为了移动设备、物联网设备和服务器领域的主流选择。下面...

    ARM汇编指令集(全)

    在本文中,我们将深入探讨ARM汇编指令集、寻址方式、伪指令以及C与汇编混合编程。 首先,让我们了解ARM处理器的寻址方式。ARM架构支持多种寻址模式,包括立即寻址、寄存器寻址、寄存器间接寻址、偏移寻址、预增/后...

    ARM汇编指令(中文版).chm

    这份"ARM汇编指令(中文版).chm"文档,很可能是包含了一个完整的ARM汇编指令集的参考手册,以中文形式呈现,方便国内开发者阅读和学习。CHM文件是一种Windows平台下的帮助文档格式,通常包含索引、搜索功能和详细...

    ARM汇编指令.pdf

    ### ARM汇编指令详解 #### 程序状态寄存器访问指令 在ARM架构的处理器中,程序状态寄存器(Program Status Register, PSR)扮演着至关重要的角色,它包含了条件码标志、中断使能状态以及其他系统状态信息。PSR分为...

    ARM-汇编指令集-PDF版

    ARM汇编指令集是ARM架构微处理器编程的基础,它包含了用于控制和操作ARM处理器的一系列指令。ARM(Advanced RISC Machines)处理器以其高效、低成本和低能耗的特点,在嵌入式系统、消费电子、多媒体处理、数字信号...

    arm汇编指令集大全

    ARM汇编指令集是ARM架构处理器编程的基础,它包含了各种指令用于控制程序流程、数据处理以及与其他硬件交互。本文将详细解析其中的跳转指令和数据处理指令。 **跳转指令** 1. **B指令**: B指令是无条件跳转指令,...

    很全的ARM汇编指令查询手册CHM.zip

    "很全的ARM汇编指令查询手册CHM.zip"是一个压缩文件,包含了一个详细的ARM汇编指令查询手册,格式为CHM(Compiled Help Manual),这是一种由Microsoft开发的、用于存储和查看离线帮助文件的格式。 这个手册很可能...

    嵌入式技术及应用ARM汇编指令的简单使用

    "嵌入式技术及应用ARM汇编指令的简单使用" 嵌入式技术及应用ARM汇编指令的简单使用是指使用Embest IDE for ARM开发环境及ARM软件模拟器,通过实验掌握简单ARM汇编指令的使用方法。本实验的主要目的是为了让学生初步...

    ARM汇编指令的一些总结

    虽然ARM汇编指令众多,但实际开发中常用的并不多。以下是对ARM汇编指令的一些核心知识点的详解: 1. **MOV指令**: MOV指令用于在寄存器之间或者寄存器与立即数之间移动数据。它支持多种寻址方式,如立即数寻址、...

    ARM汇编指令集.pdf

    ARM汇编指令集是嵌入式系统开发中一种重要的基础技能,它用于编写高效的底层程序,直接影响到嵌入式设备的运行效率和性能。以下是根据提供的文件内容,对ARM汇编指令集中的两个主要知识点——跳转指令和数据处理指令...

    arm汇编指令集 ——基于arm汇编的指令

    ### ARM汇编指令集概述 ARM(Advanced RISC Machines)是一种精简指令集计算机(RISC)架构,广泛应用于移动设备、嵌入式系统及服务器等领域。ARM汇编语言是直接与ARM处理器交互的一种低级编程语言,它通过一系列...

    arm汇编指令(全).rar_ARM 汇编_ARM9 boot code_ARM汇编指令_SMULBT_arm 指令

    本文将深入探讨ARM汇编指令,包括ARM9 Boot Code的基本概念,以及SMULBT和其他ARM指令的详细解释。 ARM9是ARM公司设计的一款高性能、低功耗的处理器内核,广泛应用于各种嵌入式设备。在启动过程中,Boot Code通常由...

    ARM7汇编指令集 ARM汇编指令集

    ARM汇编指令集是为ARM7处理器设计的一系列指令,它允许程序员直接对处理器的每一个操作进行精确控制。 1. **基本结构** - ARM7架构基于RISC(精简指令集计算机)设计原则,具有固定长度的指令,每个指令通常执行一...

Global site tag (gtag.js) - Google Analytics