GET通经常使用于包括定义常量的源文件。 
  
  比如:GET 2440addr.inc
 用AREA定义一个段。ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束。  比如:
 AREA init, CODE, READONLY
 ENTRY
 ......
 END
 EQU用于定义常量,提醒:在每条ARM指令前必须有空格。可是用EQU定义常量时,必须顶格写,否则编译器报错。
 LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区。
 ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式。在ARM代码中要求地址标号是字对齐的。


 MACRO和MEND伪操作用于宏定义。语法例如以下:
 MACRO
 {$label} MacroName {$parameter1} {$parameter2} ...
 ;这里加入自己的代码
 MEND
 当中:$label代表一个标号,在宏展开时。替换成对应的值。MacroName用于指定宏名称。
$parameter代表要传递的參数。
{}中的项表示是可选的。
 比如:
 MACRO
 $label HANDLER $HandleAddr
 $label
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, =$HandleAddr
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
 MEND
 在程序中能够通过例如以下方式调用该宏:HandlerIRQ  HANDLER  HandleIRQ
 宏展开结果例如以下:
 HandlerIRQ
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, =HandleIRQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}

 MAP用于定义内存表的首地址,当中MAP能够用^表示。FIELD用于定义一个内存表中的数据域,当中FIELD能够用#表示。用法例如以下所看到的:
 _ISR_STARTADDRESS EQU0X33FFFF00
 MAP   _ISR_STARTADDRESS
 HandleReset  FIELD 4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03
 HandleUndef FIELD4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07
 HandleSWI FIELD4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B
 HandlePabrt FIELD4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F
 HandleDabrt FIELD4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13
 以上定义内存表的方式等价于例如以下方式:
 _ISR_STARTADDRESS EQU 0X33FFFF00
 ^ _ISR_STARTADDRESS
 HandleReset #4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03
 HandleUndef #4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07
 HandleSWI #4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B
 HandlePabrt #4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F
 HandleDabrt #4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13
 建立好上述内存表之后,能够从C源文件里通过例如以下方式訪问:
 #define pISR_SWI (*(unsigned int*)(_ISR_STARTADDRESS+0x8))


 ARM伪指令:中等范围的地址读取指令ADRL、大范围的地址读取指令LDR 比如:
 ADRL R1, var1 ;表示把var1的地址读取到R1中去。 var1 DCD 5
 LDR R1, =var1 ;表示把var1的地址读取到R1中去。 var1 DCD 5


 DCD用于分配一块连续的内存单元,并用expr初始化:{label} DCD expr{,expr}...    label代表所分配的内存单元的地址。
 SPACE用于分配一块内存单元,并将其初始化为0:{label} SPACE expr  label代表内存块的起始地址,expr表示所要分配的内存字节数目
 比如: zero SPACE 12    即分配12个字节长度的连续内存单元


 ARM汇编程序的结构:
ARM源程序有下面几种类型:
*.s:汇编语言源文件
*.inc:被汇编源文件包括的文件
*.c:C语言源文件
*.h:头文件
编写汇编语言源文件的格式规范:
全部标号必须在一行的顶格书写
全部的指令均不能顶格书写。指令前应该有空格或Tab缩进
凝视内容由";"開始到此行结束
指令、寄存器能够所有为大写或者小写字母,但不能大写和小写字母混用
定义变量、常量时。其标志符必须在一行的顶格书写


 经常使用汇编语言程序子模块实例:
 <1>关闭看门狗定时器
 WTCON EQU 0X53000000
LDR R0, =WTCON
MOV R1, #0
STR R1, [R0]
 <2>内存数据复制:如果R1指向源数据块的起始地址,R2指向源数据块的结束地址。R3指向目的数据块的起始地址。
 loop
LDR R0, [R1], #4
STR R0,[R3]. #4
CMP R1,R2
BCC loop
 <3>批量载入与存储:初始化SDRAM。SMRDATA是在内存中定义的一个数据表。占领13个字(52字节)的空间;BWSCON是2440处理器的存储控制器寄存器的起始地址。
ADRL R0, SAMRDATA
LDMIA R0, {R1-R13}
LDR R0, = BWSCON
STMIA R0, {R1-R13}
 <4>堆栈操作:堆栈初始化
 FIQMODE EQU  0X11
 IRQMODE EQU 0X12
 SVCMODE EQU 0X13
 MODEMASK EQU 0X1F
 NOINT EQU 0XC0
 _STACK_BASE_ADDRESS EQU 0X33FF8000


 FIQStack EQU (_STACK_BASE_ADDRESS-0X0) ;0X33FF8000~
 IRQStack EQU (_STACK_BASE_ADDRESS-0X1000) ;0X33FF7000~
 SVCStack EQU (_STACK_BASE_ADDRESS-0X2800) ;0X33FF5800~


 InitStacks
MRS R0, CPSR
BIC R0, R0, #MODEMASK
ORR R1, R0, #IRQMODE | NOINT
MSR CPSR_CXSF, R1;IRQMode
LDR SP, =IRQStack;IRQStack=0x33FF7000

ORR R1, R0, #FIQMODE | NOINT
MSR CPSR_C, R1;FIQMode
LDR SP, =FIQStack;FIQStack=0x33FF8000

BIC R0, R0, #MODEMASK | NOINT
ORR R1, R0, #SVCMODE
MSR CPSR_CXSF, R1;SVCMode
LDR SP, =SVCStack;SVCStack=0x33FF5800
MOV PC, LR
 <5>实现查表功能:
MOV R9, #4
LDR R8, =DATATABLE
LDR R8, [R8,R9,LSL,#2]
 DATATABLE DCD 0X10, 0X20, 0X30, 0X40, 0X50 DCD 0X60, 0X70, 0X80, 0X90, 0XA0

/**************************************************************/
 在基于ARM处理器的裸机程序开发中,启动代码主要用于为执行用户程序准备主要的执行环境。它主要实现下面功能:
 <1>建立异常中断向量表
 <2>初始化各种模式下的堆栈
 <3>初始化硬件:包含
关闭看门狗
屏蔽全部中断
初始化时钟
初始化存储系统:NandFlash、NorFlash、SDRAM等
 <4>初始化应用程序运行环境:代码的搬移和未初始化数据段ZI的清零。一个ARM映像文件主要由RO、RW、ZI段构成。
 <5>跳转到主程序(用户程序)运行。 
   
  
         
  GET通经常使用于包括定义常量的源文件。 
  
  比如:GET 2440addr.inc
 用AREA定义一个段。ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束。  比如:
 AREA init, CODE, READONLY
 ENTRY
 ......
 END
 EQU用于定义常量,提醒:在每条ARM指令前必须有空格。可是用EQU定义常量时,必须顶格写,否则编译器报错。
 LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区。
 ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式。在ARM代码中要求地址标号是字对齐的。


 MACRO和MEND伪操作用于宏定义。语法例如以下:
 MACRO
 {$label} MacroName {$parameter1} {$parameter2} ...
 ;这里加入自己的代码
 MEND
 当中:$label代表一个标号,在宏展开时。替换成对应的值。MacroName用于指定宏名称。
$parameter代表要传递的參数。
{}中的项表示是可选的。
 比如:
 MACRO
 $label HANDLER $HandleAddr
 $label
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, =$HandleAddr
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
 MEND
 在程序中能够通过例如以下方式调用该宏:HandlerIRQ  HANDLER  HandleIRQ
 宏展开结果例如以下:
 HandlerIRQ
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, =HandleIRQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}

 MAP用于定义内存表的首地址,当中MAP能够用^表示。FIELD用于定义一个内存表中的数据域,当中FIELD能够用#表示。用法例如以下所看到的:
 _ISR_STARTADDRESS EQU0X33FFFF00
 MAP   _ISR_STARTADDRESS
 HandleReset  FIELD 4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03
 HandleUndef FIELD4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07
 HandleSWI FIELD4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B
 HandlePabrt FIELD4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F
 HandleDabrt FIELD4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13
 以上定义内存表的方式等价于例如以下方式:
 _ISR_STARTADDRESS EQU 0X33FFFF00
 ^ _ISR_STARTADDRESS
 HandleReset #4 ;HandleReset的地址范围为0X33FFFF00~0X33FFFF03
 HandleUndef #4 ;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07
 HandleSWI #4 ;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B
 HandlePabrt #4 ;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F
 HandleDabrt #4 ;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13
 建立好上述内存表之后,能够从C源文件里通过例如以下方式訪问:
 #define pISR_SWI (*(unsigned int*)(_ISR_STARTADDRESS+0x8))


 ARM伪指令:中等范围的地址读取指令ADRL、大范围的地址读取指令LDR 比如:
 ADRL R1, var1 ;表示把var1的地址读取到R1中去。 var1 DCD 5
 LDR R1, =var1 ;表示把var1的地址读取到R1中去。 var1 DCD 5


 DCD用于分配一块连续的内存单元,并用expr初始化:{label} DCD expr{,expr}...    label代表所分配的内存单元的地址。
 SPACE用于分配一块内存单元,并将其初始化为0:{label} SPACE expr  label代表内存块的起始地址,expr表示所要分配的内存字节数目
 比如: zero SPACE 12    即分配12个字节长度的连续内存单元


 ARM汇编程序的结构:
ARM源程序有下面几种类型:
*.s:汇编语言源文件
*.inc:被汇编源文件包括的文件
*.c:C语言源文件
*.h:头文件
编写汇编语言源文件的格式规范:
全部标号必须在一行的顶格书写
全部的指令均不能顶格书写。指令前应该有空格或Tab缩进
凝视内容由";"開始到此行结束
指令、寄存器能够所有为大写或者小写字母,但不能大写和小写字母混用
定义变量、常量时。其标志符必须在一行的顶格书写


 经常使用汇编语言程序子模块实例:
 <1>关闭看门狗定时器
 WTCON EQU 0X53000000
LDR R0, =WTCON
MOV R1, #0
STR R1, [R0]
 <2>内存数据复制:如果R1指向源数据块的起始地址,R2指向源数据块的结束地址。R3指向目的数据块的起始地址。
 loop
LDR R0, [R1], #4
STR R0,[R3]. #4
CMP R1,R2
BCC loop
 <3>批量载入与存储:初始化SDRAM。SMRDATA是在内存中定义的一个数据表。占领13个字(52字节)的空间;BWSCON是2440处理器的存储控制器寄存器的起始地址。
ADRL R0, SAMRDATA
LDMIA R0, {R1-R13}
LDR R0, = BWSCON
STMIA R0, {R1-R13}
 <4>堆栈操作:堆栈初始化
 FIQMODE EQU  0X11
 IRQMODE EQU 0X12
 SVCMODE EQU 0X13
 MODEMASK EQU 0X1F
 NOINT EQU 0XC0
 _STACK_BASE_ADDRESS EQU 0X33FF8000


 FIQStack EQU (_STACK_BASE_ADDRESS-0X0) ;0X33FF8000~
 IRQStack EQU (_STACK_BASE_ADDRESS-0X1000) ;0X33FF7000~
 SVCStack EQU (_STACK_BASE_ADDRESS-0X2800) ;0X33FF5800~


 InitStacks
MRS R0, CPSR
BIC R0, R0, #MODEMASK
ORR R1, R0, #IRQMODE | NOINT
MSR CPSR_CXSF, R1;IRQMode
LDR SP, =IRQStack;IRQStack=0x33FF7000

ORR R1, R0, #FIQMODE | NOINT
MSR CPSR_C, R1;FIQMode
LDR SP, =FIQStack;FIQStack=0x33FF8000

BIC R0, R0, #MODEMASK | NOINT
ORR R1, R0, #SVCMODE
MSR CPSR_CXSF, R1;SVCMode
LDR SP, =SVCStack;SVCStack=0x33FF5800
MOV PC, LR
 <5>实现查表功能:
MOV R9, #4
LDR R8, =DATATABLE
LDR R8, [R8,R9,LSL,#2]
 DATATABLE DCD 0X10, 0X20, 0X30, 0X40, 0X50 DCD 0X60, 0X70, 0X80, 0X90, 0XA0

/**************************************************************/
 在基于ARM处理器的裸机程序开发中,启动代码主要用于为执行用户程序准备主要的执行环境。它主要实现下面功能:
 <1>建立异常中断向量表
 <2>初始化各种模式下的堆栈
 <3>初始化硬件:包含
关闭看门狗
屏蔽全部中断
初始化时钟
初始化存储系统:NandFlash、NorFlash、SDRAM等
 <4>初始化应用程序运行环境:代码的搬移和未初始化数据段ZI的清零。一个ARM映像文件主要由RO、RW、ZI段构成。
 <5>跳转到主程序(用户程序)运行。