登录站点

用户名

密码

ARM汇编程序规则

1已有 2146 次阅读  2010-01-29 15:39   标签汇编程序  ARM  规则 

ARM处理器有两个指令集-ARM指令集和Thumb指令集,ARM汇编程序规则比较简单,因为在汇编程序中,汇编语句和指令代码是一一对应的。

汇编程序的规则是为了满足编译器的要求而规定的,编译器为了能够准确的编译,正确的辨别程序的内容,就必须规范的编写程序的表达和书写。

一段完整的汇编语言程序最基本、不可缺少的要素是:

l         段定义伪指令AREA。必须给出每个程序段的段定义,指出该段是代码段还是数据段。在目标代码链接时,链接器对代码段和数据段作出不同的处理。段定义同时给出段名称。

l         结束伪指令END。为汇编器标记程序结束。

l         汇编语言指令。汇编语言指令作为程序的主体,体现程序的功能。数据段可以不包含汇编语言指令。

l         程序结束设计。每个程序都有一个结尾,或是跳转指令,或是返回指令,或是死循环。跳转指令使程序跳转到其它程序段;返回指令用在子程序结尾,使程序返回到调用处,在有些情况下,也可以用死循环作为程序的结尾,在这时,程序等待异常中断,在中断处理程序中实现预定的工作。

l         程序入口伪指令ENTRY。使用该伪指令为程序指定一个入口。

 

. 汇编语言的程序组成和格式

1.1 程序组成

汇编语言的源程序由指令、伪指令、语句标号和注释组成。

指令

一条指令一般应该是一个简单的汇编语言行,由指令助记符和操作数、操作寄存器或语句标号组成。每一条指令经编译后,都会形成一组32位(ARM指令)或16位(Thumb指令)的代码。

伪指令

伪指令有两种:一种是通用伪指令,另一种是专用伪指令。

专用伪指令有两种:ARM专用伪指令只能在ARM指令中使用,Thumb专用伪指令只能在Thumb指令中使用.

通用伪指令既可以在ARM指令中使用,也可以在Thumb指令中使用。

语句标号

语句标号在程序中的主要作用有两种:一是表达地址,二是为一段语句命名,以方便记忆和阅读。当语句标号确定以后,链接器在链接时会自动搜索使用这个标号的语句,并计算这个语句和标号之间的地址偏移,在为这个语句编码时会用到这个偏移。

注释

注释是为了方便阅读和记忆。一般情况下,在一个程序段前要求有段的注释,在重要语句后面要有语句的注释。

1.2 书写格式

指令和伪指令

指令助记符和伪指令助记符可以大写,也可以小写,但不能大小写混合使用。所有的指令(包括ARM指令和Thumb指令)都不能在行的开头书写,必须在指令的前面有空格。寄存器名可以大写或小写。

语句标号

语句标号可以大小写字母混合使用,可以使用数字和下划线。语句标号不能和指令助记符、寄存器、变量名同名。语句标号必须在一行的开头书写,不能留空格。

注释

注释在一行中的位置没有限制,注释的最前面是一个分号“;”。汇编器在编译时,当发现一个分号后,把后面的内容解释为注释,不予编译。

 

.汇编语言程序中的表达式

1.变量表达式

变量有算术变量、逻辑变量和串变量3种形式。变量在编译过程中可能被改变。

逻辑变量有两种可能的值:{TRUE}{FALSE}

变量一旦被定义,它的值可以改变,但变量的形式不能改变。

2.字符串表达式

字符串表达式包括字符串、字符串变量、操作符和括号。字符串表达式长度可以是0,但最大不能超过512个。

l         字符串:用双引号包含在内的一系列字符称为字符串。

l         字符串变量:被定义为变量的字符串称为字符串变量。

l         单目操作符:只涉及一个字符串的操作符称单目操作符。在串运算中,单目操作符有较高的优先级。单目操作符有LENCHRSTR、和DEF

l         双目操作符:这些操作符涉及两个表达式,其中至少有一个是字符串。双目操作符有LEFTRIGHTCC

3.数字表达式

数字表达式包括数字、数字常量、数字变量、双目操作符和括号。表达式的结果不能超过一个32位的表达范围。

l         数字:数字表达方式有十进制、十六进制、N进制和ASCII

l         数字常量:数字常量是一个32位的整数。可以使用伪指令EQU定义一个数字常量,数字常量一经定义,就不能改变。

l         数字变量:被定义为变量的数字称为数字变量。

l         双目操作符:双目操作符表明两个表达式之间的运算关系。在数字表达式中双目操作符有以下几种:

-“+”、“-”、“*”、“/”、MOD操作符,分别是加、减、乘、除和取模。

-移位操作符:ROLRORSHLSHR,分别是循环左移、循环右移、左移和右移。

-逻辑操作符ANDOREOR,分别是逻辑“与”、逻辑“或”和逻辑“异或”。

以上这些操作符和数字组成的表达式执行顺序遵循以下规则:

l         先计算括号内的表达式。

l         操作符按优先级顺序计算。一元操作符优先二元操作符。

l         相邻的一元操作符按从左到右计算。

l         优先级相等的二元操作符从左到右计算。

 

三.预定义寄存器

ARM开发工具ADS中,已经实现了寄存器的预定义。用户如果需要,则可以另定义寄存器;否则,按照预定义直接使用就可以了。预定义寄存器识别大、小写。这些寄存器已经定义如下:

l         a1~a4  用于参数、结果或scratch寄存器,使用r0~r3

l         r0~r15  普通定义的寄存器,也可以写为R0~R15

l         v1~v8  变量寄存器,使用r4~r11

l         sb或者SB  用于栈基址寄存器,使用r9

l         sl或者SL  栈限制检查寄存器,使用r10

l         fp或者FP   frame指针,使用r11

l         ip或者IP    内部程序调用scratch寄存器,使用r12。用于在ARM/Thumb调用是引用Veneer代码段。

l         sp或者SP   数据栈指针,使用r13;堆栈指针,指向下降式满堆栈的堆栈。

l         lr或者LR   链接寄存器,使用r14;在函数调用时,这个寄存器保存返回地址。

l         pc或者PC  程序计数器,使用r15

 

以下例程来源于周立功公司的,原版copy供大家学习:

;/****************************************Copyright (c)**************************************************

;**                               Guangzou ZLG-MCU Development Co.,LTD.

;**                                      graduate school

;**                                 http://www.zlgmcu.com

;**

;**--------------File Info-------------------------------------------------------------------------------

;** File name:                      Startup.s

;** Last modified Date:  2004-09-17

;** Last Version:           1.0

;** Descriptions:          The start up codes for LPC2100, including the initializing codes for the entry point of exceptions and the stacks of user tasks.

;**                        Every project should have a independent copy of this file for related modifications

;**------------------------------------------------------------------------------------------------------

;** Created by:                    Chenmingji

;** Created date:                2004-02-02

;** Version:                          1.0

;** Descriptions:          The original version

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:           Chenmingji

;** Modified date:          2004-09-17

;** Version:                          1.01

;** Descriptions:          Modified the bus setting to adapt for many common situations

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:           Chenmingji

;** Modified date:          2004-09-17

;** Version:                          1.02

;** Descriptions:          Added codes to support the enciphering of the chip

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:           Chenmingji

;** Modified date:          2004-09-17

;** Version:                          1.04

;** Descriptions:          Renewed the template, added codes to support more compilers

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:           Chenxibing    

;** Modified date:          2004-12-09

;** Version:                   1.05

;** Descriptions:

;**

;********************************************************************************************************/

 

;define the stack size

;定义堆栈的大小

SVC_STACK_LEGTH         EQU         0

FIQ_STACK_LEGTH         EQU         0

IRQ_STACK_LEGTH         EQU         256

ABT_STACK_LEGTH         EQU         0

UND_STACK_LEGTH         EQU         0

 

NoInt       EQU 0x80

NoFIQ           EQU       0x40

 

USR32Mode   EQU 0x10

SVC32Mode   EQU 0x13

SYS32Mode   EQU 0x1f

IRQ32Mode   EQU 0x12

FIQ32Mode   EQU 0x11

 

    IMPORT __use_no_semihosting_swi

 

;The imported labels

;引入的外部标号在这声明

    IMPORT  FIQ_Exception                   ;Fast interrupt exceptions handler 快速中断异常处理程序

    IMPORT  __main                          ;The entry point to the main function C语言主程序入口

    IMPORT  TargetResetInit                 ;initialize the target board 目标板基本初始化

      

;The emported labels

;给外部使用的标号在这声明

    EXPORT  bottom_of_heap

    EXPORT  StackUsr

    

    EXPORT  Reset

    EXPORT __user_initial_stackheap

 

 

;启动代码入口

   

    CODE32

 

    AREA    vectors,CODE,READONLY

    ENTRY

 

;interrupt vectors

;中断向量表

Reset

        LDR     PC, ResetAddr

        LDR     PC, UndefinedAddr

        LDR     PC, SWI_Addr

        LDR     PC, PrefetchAddr

        LDR     PC, DataAbortAddr

        DCD     0xb9206e50

        LDR     PC, [PC, #-0x120]

        LDR     PC, FIQ_Addr

 

ResetAddr           DCD     ResetInit

UndefinedAddr       DCD     Undefined

SWI_Addr            DCD     SoftwareInterrupt

PrefetchAddr        DCD     PrefetchAbort

DataAbortAddr       DCD     DataAbort

Nouse               DCD     0

IRQ_Addr            DCD     0

FIQ_Addr            DCD     FIQ_Handler

 

 

;未定义指令

Undefined

        B       Undefined

 

;软中断

SoftwareInterrupt                

;        B       SoftwareInterrupt

;//增加开/关中断处理 Chenxibing-2004-02-09                                

        CMP     R0, #4

        LDRLO   PC, [PC, R0, LSL #2]

        MOVS    PC, LR

 

SwiFunction

        DCD     IRQDisable       ;0

        DCD     IRQEnable        ;1

        DCD              FIQDisable            ;2

        DCD              FIQEnable             ;3

 

IRQDisable

        ;IRQ中断

        MRS     R0, SPSR

        ORR     R0, R0, #NoInt

        MSR     SPSR_c, R0

        MOVS    PC, LR

 

IRQEnable

        ;IRQ中断

        MRS     R0, SPSR

        BIC      R0, R0, #NoInt

        MSR     SPSR_c, R0

        MOVS    PC, LR

       

FIQDisable

        ;FIQ中断

        MSR              CPSR_c, #(SVC32Mode|NoFIQ)

        MRS     R0, SPSR

        ORR     R0, R0, #NoFIQ

        MSR     SPSR_c, R0

        MOVS    PC, LR

 

FIQEnable

        ;FIQ中断

        MSR              CPSR_c, #(SVC32Mode|NoFIQ)

        MRS     R0, SPSR

        BIC      R0, R0, #NoFIQ

        MSR     SPSR_c, R0

        MOVS  PC, LR

;// Changed 2004-12-09

     

;取指令中止

PrefetchAbort

        B       PrefetchAbort

 

;取数据中止

DataAbort

        B       DataAbort

 

;快速中断

FIQ_Handler

        STMFD   SP!, {R0-R3, LR}

        BL      FIQ_Exception

        LDMFD   SP!, {R0-R3, LR}

        SUBS    PC,  LR,  #4

 

           

;/*********************************************************************************************************

;** unction name   函数名称:      InitStack

;** Descriptions    功能描述:      Initialize the stacks  初始化堆栈

;** input parameters     输 入:        None

;** Returned value      输 出 :       None

;** Used global variables 全局变量:    None

;** Calling modules       调用模块:      None

;**

;** Created by              作 者: Chenmingji 陈明计

;** Created Date    日 期: 2004/02/02 200422

;**-------------------------------------------------------------------------------------------------------

;** Modified by     修 改:

;** Modified date   日 期:

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

InitStack   

        MOV     R0, LR

;Build the SVC stack

;设置管理模式堆栈

        MSR     CPSR_c, #0xd3         

        LDR     SP, StackSvc

;Build the IRQ stack     

;设置中断模式堆栈

        MSR     CPSR_c, #0xd2

        LDR     SP, StackIrq

;Build the FIQ stack

;设置快速中断模式堆栈

        MSR     CPSR_c, #0xd1

        LDR     SP, StackFiq

;Build the DATAABORT stack

;设置中止模式堆栈

        MSR     CPSR_c, #0xd7

        LDR     SP, StackAbt

;Build the UDF stack

;设置未定义模式堆栈

        MSR     CPSR_c, #0xdb

        LDR     SP, StackUnd

;Build the SYS stack

;设置系统模式堆栈

        MSR     CPSR_c, #0xdf

        LDR     SP, =StackUsr

 

        MOV     PC, R0

 

;/*********************************************************************************************************

;** unction name   函数名称:      ResetInit

;** Descriptions    功能描述:      RESET  复位入口

;** input parameters     输 入:        None

;** Returned value      输 出 :       None

;** Used global variables 全局变量:    None

;** Calling modules       调用模块:      None

;**

;** Created by              作 者: Chenmingji 陈明计

;** Created Date    日 期: 2004/02/02 200422

;**-------------------------------------------------------------------------------------------------------

;** Modified by     修 改: Chenmingji 陈明计

;** Modified date   日 期: 2004/02/02 200433

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

ResetInit

       

        BL      InitStack               ;初始化堆栈 Initialize the stack

        BL      TargetResetInit         ;目标板基本初始化 Initialize the target board

                                        ;跳转到c语言入口 Jump to the entry point of C program

        B       __main

 

;/*********************************************************************************************************

;** unction name   函数名称:      __user_initial_stackheap

;** Descriptions    功能描述:      Initial the function library stacks and heaps, can not deleted!   库函数初始化堆和栈,不能删除

;** input parameters     输 入:        reference by function library 参考库函数手册

;** Returned value      输 出 :       reference by function library 参考库函数手册

;** Used global variables 全局变量:    None

;** Calling modules       调用模块:      None

;**

;** Created by              作 者: Chenmingji 陈明计

;** Created Date    日 期: 2004/02/02 200422

;**-------------------------------------------------------------------------------------------------------

;** Modified by    

;** Modified date  

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

__user_initial_stackheap   

    LDR   R0, =bottom_of_heap            

   ; LDR   R1, =StackUsr               

    LDR   R2, =top_of_heap           

    LDR   R3, =bottom_of_Stacks         

    MOV   PC, LR   

   

StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4

StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4

StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4

StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4

StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

 

;/*********************************************************************************************************

;** unction name   函数名称:      CrpData

;** Descriptions    功能描述:      encrypt the chip

;** input parameters     输 入:        None

;** Returned value      输 出 :       None

;** Used global variables 全局变量:    None

;** Calling modules       调用模块:      None

;**

;** Created by              作 者: Chenmingji 陈明计

;** Created Date    日 期: 2004/03/27 2004327

;**-------------------------------------------------------------------------------------------------------

;** Modified by     修 改:

;** Modified date   日 期:

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

    IF :DEF: EN_CRP

        IF  . >= 0x1fc

        INFO    1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."

        ENDIF

CrpData

    WHILE . < 0x1fc

    NOP

    WEND

CrpData1

    DCD     0x87654321          ;/*When the Data is 0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */

    ENDIF

   

;/* 分配堆栈空间 */

        AREA    MyStacks, DATA, NOINIT, ALIGN=2

SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;Stack spaces for Administration Mode 管理模式堆栈空间

IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间

FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间

AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;Stack spaces for Suspend Mode 中止义模式堆栈空间

UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;Stack spaces for Undefined Mode 未定义模式堆栈

 

 

        AREA    Heap, DATA, NOINIT

bottom_of_heap    SPACE   1

 

        AREA    HeapTop, DATA, NOINIT

top_of_heap

 

        AREA    StackBottom, DATA, NOINIT

bottom_of_Stacks  

 

        AREA    Stacks, DATA, NOINIT

StackUsr   SPACE   1

    END

 

;/*********************************************************************************************************

;**                            End Of File

;********************************************************************************************************/

 

 

;/****************************************Copyright (c)**************************************************

;**                               Guangzou ZLG-MCU Development Co.,LTD.

;**                                      graduate school

;**                                 http://www.zlgmcu.com

;**

;**--------------File Info-------------------------------------------------------------------------------

;** File Name: IRQ.s

;** Last modified Date:  2004-06-14

;** Last Version: 1.1

;** Descriptions: The irq handle that what allow the interrupt nesting.

;**

;**------------------------------------------------------------------------------------------------------

;** Created By: Chenmingji

;** Created date:   2004-09-17

;** Version: 1.0

;** Descriptions: First version

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:

;** Modified date:

;** Version:

;** Descriptions:

;**

;********************************************************************************************************/

 

 

NoInt       EQU 0x80

 

USR32Mode   EQU 0x10

SVC32Mode   EQU 0x13

SYS32Mode   EQU 0x1f

IRQ32Mode   EQU 0x12

FIQ32Mode   EQU 0x11

 

    CODE32

 

    AREA    IRQ,CODE,READONLY

 

    MACRO

$IRQ_Label HANDLER $IRQ_Exception_Function

 

        EXPORT  $IRQ_Label                      ; The label for exports 输出的标号

        IMPORT  $IRQ_Exception_Function         ; The imported labels 引用的外部标号

 

$IRQ_Label

        SUB     LR, LR, #4                      ; Calculate the returning address 计算返回地址

        STMFD   SP!, {R0-R3, R12, LR}           ; Protects the task environments 保存任务环境

        MRS     R3, SPSR                        ; Protects the status variable 保存状态

        STMFD   SP, {R3,LR}^                    ; Protects SPSR and SP in user status, Notice: DO NOT write back.保存SPSR和用户状态的SP,注意不能回写

                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP

        NOP

        SUB     SP, SP, #4*2

 

        MSR     CPSR_c, #(NoInt | SYS32Mode)    ; Switch to the System Mode 切换到系统模式

      

        BL      $IRQ_Exception_Function         ; call the C interrupt handler funtion 调用c语言的中断处理程序

 

        MSR     CPSR_c, #(NoInt | IRQ32Mode)    ; Switch bak to IRQ mode 切换回irq模式

        LDMFD   SP, {R3,LR}^                    ; Recover SPSR and SP in user status, Notic: DO NOT write back. 恢复SPSR和用户状态的SP,注意不能回写

                                                ; If the SP is written back, it should be adjusted to its appropriate value later.如果回写的是用户的SP,所以后面要调整SP

        MSR     SPSR_cxsf, R3

        ADD     SP, SP, #4*2                    ;

 

        LDMFD   SP!, {R0-R3, R12, PC}^          ;

    MEND

 

;/* 以下添加中断句柄,用户根据实际情况改变 */

;/* Add interrupt handler hereuser could change it as needed */

 

;Timer0_Handler  HANDLER Timer0

 

    END

;/*********************************************************************************************************

;**                            End Of File

;********************************************************************************************************/

 

上一篇: VHDL编写的比较器 下一篇: 汇编器的应用(基于ADS1.2)

分享 举报