ARM体系结构与编程-5

来源:互联网 发布:单位网络监测系统 知乎 编辑:程序博客网 时间:2024/06/05 06:38
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>跳转到主程序(用户程序)执行。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在家被蜘蛛咬了怎么办 被蜘蛛咬了很痒怎么办 被蜘蛛咬了红肿怎么办 宝宝被蜘蛛咬了怎么办 红鹦鹉鱼产卵了怎么办 掉灰的墙面怎么办简单 辣椒上的白粉虱怎么办 巨门在父母宫怎么办 空腹吃柿子胃胀怎么办 吃了山药过敏痒怎么办 瓷砖活动了怎么办的下 家里进了大蛾子怎么办 沙漠玫瑰烂根了怎么办 打麻药的地方疼怎么办 做月子奶不够吃怎么办 坐月子手痛怎么办才好 产后胖了20斤怎么办 手动挡汽车闯动怎么办 孕妇风热感冒了怎么办 孕妇得风热感冒怎么办 小鸡站不起来了怎么办 感冒了流清鼻涕怎么办 哈士奇又吐又拉怎么办 怀孕乳房长妊娠纹怎么办 乳房长妊娠纹了怎么办 宝宝忌奶晚上哭怎么办 20岁胸下垂松软怎么办 断奶时乳房有肿块怎么办 孩子断奶后乳房变小怎么办 断奶了月经不来怎么办 钥匙在门上拔不出来怎么办 钥匙拔不下来了怎么办 养了几天鱼死了怎么办 乌龟的眼睛肿了怎么办 手被鱼刺扎了怎么办 被鱼刺扎手肿了怎么办 手被桂鱼扎了怎么办 三岁宝宝卡鱼刺怎么办 一岁宝宝卡鱼刺怎么办 鱼刺卡在胸口了怎么办 婴儿被鱼刺卡了怎么办