嵌入式系统原理-第3章_第1页
嵌入式系统原理-第3章_第2页
嵌入式系统原理-第3章_第3页
嵌入式系统原理-第3章_第4页
嵌入式系统原理-第3章_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3ARM9汇编语言ARM9微处理器采用的是ARMv4版本的指令集架构,其指令集代码的格式如:3.1ARM9指令集

32位的ARM指令集由14种基本指令类型组成。指令操作码中的Cond子域是条件域,它表明ARM指令集中的所有指令是有条件执行的。指令执行的条件是根据CPSR寄存器中的状态标志位和指令的条件域确定,见下表:寄存器装载及存储类指令这类指令是最常用的指令之一。它们把数据从存储器单元中装载(读入)到微处理器核的寄存器(即R0~R15)中,或者把微处理器核的寄存器中的数据存储(写入)到存储器单元中。(1)单一数据加载/存储指令:LDR/STR

指令书写格式:(1)LDR/STR{条件码}{B}Rd,[Rn]

(2)LDR/STR{条件码}{B}Rd,[Rn,Flexoffset]{!}

(3)LDR/STR{条件码}{B}Rd,label

(4)LDR/STR{条件码}{B}Rd,[Rn],Flexoffset下面是几条LDR/STR指令书写的示例:LDRR2,[R5];无偏移量,R2←[R5]LDREQR5,[R6,#28]!;(若相等)R5←[R6+28],R6←R6+28LDRR8,label

;加载一个字到R8,该字存于label对应单元处STRR1,[R3],#-6!;R1→[R3],R3←R3-6STRBR0,[R3,-R8ASR#2]

;R0的最低字节→[R3-R8/4]单元的低字节

(2)多数据加载/存储指令:LDM和STM。指令书写格式:LDM/STM{条件码}类型Rn{!},寄存器列表{^}指令中的类型是指存储器地址变化的方式。也就是说,每加载或者存储完一个寄存器后,存储器的地址需要自动变化,如何变化则由指令助记符后面所跟的类型确定。类型可以是下列情况之一:IA每次数据传送后存储器的地址加1;IB每次数据传送前存储器的地址加1;DA每次数据传送后存储器的地址减1;DB每次数据传送前存储器的地址减1;FD满递减堆栈;ED空递减堆栈;FA满递增堆栈;EA空递增堆栈。例如:STMFDR13!,{R0-R12,R14};寄存器进栈…LDMFDR13!,{R0-R12,PC};寄存器出栈,返回利用STM指令把存储在LR寄存器中的当前PC值保存到存储器中的时候,同时还保存了CPSR寄存器的值。在用LDM指令重新装载PC寄存器的时候,除非设计者在指令中写上相应的符号,否则不会恢复CPSR的值。所写的符号是在寄存器列表后跟随一个“^”符号。例如:STMFDR13!,{R0-R12,R14};寄存器进栈…LDMFDR13!,{R0-R12,PC}^;寄存器出栈,返回,同时恢复CPSR(3)单一数据交换指令:SWP。该指令完成在寄存器和存储器之间进行数据交换的功能,其句法如下:

SWP{条件码}{B}Rd,Rm,[Rn]若指令助记符中加上可选后缀B,则交换的是字节数据,否则交换的是字数据。该指令的具体作用是数据从存储单元加裁到Rd寄存器中,Rm寄存器的内容存储到存储单元中,该存储单元的地址是Rn寄存器的值。影响状态标志位类指令CPSR寄存器是ARM9微处理器核中保存状态标志位的寄存器,其中N、V、C、Z标志是由指令执行结果确定的。能影响这些标志生成的指令或读/写CPSR寄存器的指令如下:(1)ADC,ADD,SBC,SUB,RSC和RSB指令;(2)AND,ORR,EOR和BIC指令;(3)MOV和MVN指令;注:MOV和MVN是寄存器与寄存器间的传送指令。若R15是目的寄存器,则会修改程序计数器PC的值或标志。这一点可被用于子程序返回,方法是把链接寄存器R14的内容传送到R15中。(4)MUL和MLA指令;(5)MRS和MSR指令。注:MRS:只能完成CPSR寄存器和SPSR寄存器的读操作;

MSR:只能完成CPSR寄存器和SPSR寄存器的写操作。比较类指令

(1)CMP和CMN指令

CMP{条件码}Op1,Op2

该条指令的功能如下:状态位=Op1-Op2的结果。

CMN:与取负的数比较指令CMN{条件码}Op1,Op2

该条指令的功能如下:状态位=Op1-(-Op2)的结果。(2)TST和TEQ指令

TST{条件码}Op1,Op2

该条指令的功能如下:状态位=Op1ANDOp2的结果。

TEQ{条件码}Op1,Op2

该条指令的功能如下:状态位=Op1EOROp2的结果。分枝类指令

(1)B和BLB:分枝指令,其句法是:B{条件码}destaddB指令是最简单的分枝指令。ARM9微处理器一旦遇到一个B指令,将立即跳转到指令中给定的目的地址处,从那里继续执行。BL:带链接的分枝指令,其句法是:BL{条件码}destaddBL指令是一个需要返回的分枝指令。该分枝指令在分枝之前,R14寄存器(即LR寄存器)中会装载上R15寄存器(即PC寄存器)的内容。若要从分枝处返回发生转移的地方,可以通过重新把R14寄存器的内容装载到R15寄存器中来实现,ARM微处理器返回到这个分枝指令之后的第一条指令处继续执行。软件中断指令

SWI:软件中断指令,SWI是SoftwareInterrupt的缩写。其句法是:

SWI{条件码}destcoad

上述句法中destcoad是一个24位的编号,即软件中断号。SWI指令会引起SWI异常,使得微处理器的工作模式变换为管理模式,CPSR将被保存到管理模式的SPSR中,指令执行流水被阻塞,并转移到SWI异常向量处。该指令不影响条件码标志。SWI指令主要是为操作系统提供的。汇编器伪指令

伪指令不是目标系统能够执行的指令,而是汇编器采用的,用来指示如何进行汇编的符号,这种符号在汇编时,汇编器会把它汇编成一条或几条正真的汇编指令。几种主要的伪指令:(1)ADR

将程序相对偏移或寄存器相对偏移地址加载到寄存器中

(2)ADRL

该伪指令是加载长地址,功能类似如ADR伪指令

(3)LDR

该伪指令作用是把一个32位常量或常量表达式加载到寄存器中。

3.3汇编程序设计嵌入式系统发展到今天,程序的运行效率及存储容量已不是嵌入式系统设计时所需考虑的主要问题。若只是关心嵌入式系统所具有的应用功能,那么,在设计中,采用高级编程语言(例如C语言等)编写程序更合适,它隐藏了微处理器执行指令的许多细节,设计时相对方便。但是,如果嵌入式系统设计者希望对嵌入式系统有更深层次的了解,希望能完成系统启动程序的编写、操作系统移植等任务,那么,掌握汇编语言程序设计是非常必要的。汇编编程规则利用ARM9汇编指令进行程序设计时,程序中的每一语句行的格式为:

{标号}{指令“或”指示符“或”伪指令}{;注解}。指示符是汇编器定义的,也是用来指示汇编器如何进行汇编的符号,这些符号仅指示汇编器如何进行汇编和连接,不会被汇编成一条正真的汇编指令。几个主要指示符:(1)AREA指示汇编器汇编一段新的代码段或数据段的指示符;(2)ENTRY指示汇编器把其后的首条指令作为程序入口的指示符,一个源文件中只能有一个ENTRY指示符;(3)END表示源程序结束的指示符;(4)IMPORT告诉汇编器某个变量名或标号在当前程序段中未曾定义的指示符,这个变量名或标号由连接器进行定位;(5)EXPORT指示由连接器在目标和库文件中使用的符号的指示符;(6)CODE32指示汇编器将随后的指令作为32位ARM指令进行汇编的指示符;(7)CODE16指示汇编器将随后的指令作为16位Thumb指令进行汇编的指示符;(8)GET指示包含一个文件的指示符,汇编器在GET处汇编包含的文件;(9)DATA指示一个标号是代码段中数据区域的标号,该符号后是通常是伪指令DCB或DCD。汇编指令的特点ARM9的汇编指令相对于其他微处理器的汇编指令来说,具有许多特点:(1)指令的条件执行:32位ARM指令集中的所有指令都是条件执行的指令。需要条件执行的指令只需要使用条件后缀,就可以实现条件执行。例1:

CMPR0,R1;比较R0和R1的值,结果用于更新标志

ADDEQSR0,R1,R2;如标志Z=1,则加法指令执行,并更新标志(2)多种形式的传送类指令(3)多寄存器加载/存储指令(4)映射存储的指示符:ARM汇编器可以使用MAP和“#”指示符,来描述一个结构体,指示符MAP和“#”主要用于完成结构体的定义,并不一定具体确定其内存空间地址。指示符MAP说明结构体的基地址,指示符“#”定义数据项的标号并说明所需空间。例如:

MAP0x00001000element1#4;element1占用4字节

element2#4;element2占用4字节

element3#8;element3占用8字节

element4#8;element4占用8字节

element5#256;element5占用256字节(5)程序中的宏定义:在汇编程序设计时,宏定义的使用是为了提高程序的可读性、以及可维护性。ARM汇编器提供的宏类似于标准C语言中的#define,其功能是在程序源代码中进行字符替代。ARM汇编器把指示符MACRO作为宏定义的开始,指示符MEND作为宏定义的结束,并且可以带有参数。例如:

MACRO$aaexample$bb,$cc,$dd$aaCMP$cc,#0B$dd$bbMEND汇编程序实例--系统引导程序

系统引导程序(Bootloader)是目标系统硬件上电或复位后执行的第一段程序代码,它通常被安排在系统复位异常向量地址处。系统引导程序是依赖于具体硬件环境的,除了依赖于微处理器的体系结构外,还依赖于具体的板级硬件配置。通常系统引导程序需完成以下功能:设置异常向量表(即在异常向量地址处设置相关分枝指令)关看门狗定时器,关中断。有时需要设置系统微处理器的速度和时钟频率。设置好堆栈指针。系统堆栈初始化取决于用户使用哪些异常,以及系统需要处理哪些错误类型。一般情况下,管理模式堆栈必须设置;若使用了IRQ中断,则IRQ中断堆栈必须设置。如果系统应用程序是运行在用户模式下,可在系统引导程序中将微处理器的工作模式改为用户模式并初始化用户模式下的堆栈指针。若系统使用了DRAM或其他外设,需要设置相关寄存器,以确定其刷新频率、总线宽度等信息。初始化所需的存储器空间。跳转到C程序的入口点。一个启动引导程序示例(文件名:Startup.s);下面指令包含2440addr.s文件,该文件中定义了S3C2440内部寄存器地址对应的变量,如WTCON、INTMSK等。GET2440addr.s;某些ARM920TCPSR寄存器位的定义,定义了部分常量。USERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0I_Bit * 0x80F_Bit * 0x40;AREA指示汇编器汇编一段新的代码

AREA Init,CODE,READONLY;IMPORT提供汇编器在当前汇编中未曾定义的符号名。

IMPORT__use_no_semihosting_swi IMPORT Enter_UNDEF IMPORT Enter_SWI IMPORT Enter_PABORT IMPORT Enter_DABORT IMPORT Enter_FIQ;下面ENTRY指明了程序的入口,在应用程序中有且只有一个程序入口。

ENTRY;下面是异常向量表,第一条语句是复位异常对应的跳转指令。

B ColdReset ;复位

B Enter_UNDEF ;未定义指令错误

B Enter_SWI ;软件中断

B Enter_PABORT ;预取指令错误

B Enter_DABORT ;数据存取错误

B . ;一个保留的中断向量

B IRQ_Handler ;IRQHandler B Enter_FIQ ;FIQHandler;涉及IRQ异常的处理

EXPORT IRQ_Handler IRQ_Handler IMPORT ISR_IrqHandler STMFD sp!,{r0-r12,lr} BL ISR_IrqHandler LDMFD sp!,{r0-r12,lr} SUBS pc,lr, #4;系统上电或复位后跳转到此处开始进行运行。

EXPORTColdResetColdReset;关看门狗定时器

LDR R0,=WTCON LDR R1,=0x0 STR R1,[R0];关所有中断

LDR R0,=INTMSK LDR R1,=0xffffffff

STR R1,[r0] LDR R0,=INTSUBMSK LDR R1,=0x7ff ;关所有子中断源

STR R1,[r0];初始化堆栈,使用了带链接的分枝指令,跳转到堆栈指针设置子程序中

BL InitStacks;下面调转到C语言的主函数处

IMPORT__main BL __main;转移到用户C语言的主函数,引导应用程序

B .;下面是初始化堆栈的子函数 IMPORTUserStack IMPORTSVCStack

IMPORT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论