1、         汇编语言的程序格式

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

  可执行文件通常由以下几个部分构成:(1)、一个或多个代码段,代码段的属性是只读;(2)、零个或多个数据段,数据段的属性为可读写。

2、         汇编语言子程序调用(基本结构如下):

 

    AREA  Init,CODE,READONLY

    ENTRY

  Start

    LDR   R0,=0x3FF50000

    LDR   R1,0XFF

    STR    R1,[R0]

    …

    PRINT_TEXT

    …

    MOV  PC,BL

    …

    END

3、         过程调用标准AAPCS

  AAPCS(Procedure Call Standard for the ARM Architecture),即ARM体系结构过程调用标准,它规定子程序的调用规则。ARM寄存器使用规则如下:

  a)     子程序间通过寄存器R0-R3来传递参数。如果参数多于4个,则多出的部分用堆栈传递。被调用的子程序在返回前无需恢复寄存器R0-R3的内容。(如果主程序中R0-R3的数据在子程序返回后有用到,则在子程序调用前要保存)

  b)     在子程序中,使用R4-R11来保存局部变量。如果子程序中使用到了R4-R11中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。

  c)     寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器栈),记作ip。在子程序间的链接代码段中常有这种使用规则。

  d)     寄存器R13用作数据栈指针,记作sp,不能用于其它用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。

  e)     寄存器R14称为链接寄存器,记作lr。用于保存子程序的返回地址。如果在子程序中保存了返回地址(如利用堆栈),则R14可以用于其它用途。

  f)      寄存器R15是程序计数器,记作pc。不能用作其它用途。

  g)     ARM

4、         Scatter文件,可以指定相关的地址映射关系。编写方法如下:

LOAD_ROM   0x0000 0x4000
// 定义加载地址,0x0000是开始地址,0x4000是空间长度
{
    EXEC_ROM 0x0000 0x4000
    // 定义属性为RO域的运行地址,0x0000是开始地址,0x4000是空间长度   
    {  
        *(+R0)  // 域名    
    }
    RAM 0x10000 0x8000
    // 定义属性为RW、ZI域的运行地址,0x0000是开始地址,0x4000是空间长度   
    { 
        *(+RW,+ZI)    
    }
}

参考文件:针对用仿真器调试时使用的RuninRAM.sct和针对程序下载到Flash运行的RuninFlash.sct

5、         堆栈的使用

6、         程序举例:

a)     著名的Euclid最大公约数算法(分支语句)

b)     块复制(LDM和STM指令)