[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt

上传人:sccc 文档编号:5683567 上传时间:2023-08-09 格式:PPT 页数:108 大小:1.10MB
返回 下载 相关 举报
[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt_第1页
第1页 / 共108页
[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt_第2页
第2页 / 共108页
[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt_第3页
第3页 / 共108页
[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt_第4页
第4页 / 共108页
[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt_第5页
第5页 / 共108页
点击查看更多>>
资源描述

《[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt》由会员分享,可在线阅读,更多相关《[PPT]嵌入式系统概论—基于32位微处理器与实时操作系统第四讲.ppt(108页珍藏版)》请在三一办公上搜索。

1、嵌入式系统概论基于32位微处理器与实时操作系统第四讲 ARM指令集与编程北京航空航天大学机器人研究所魏洪兴,指令长度,指令集可以是以下任一种32 bits 长(ARM状态)16 bits 长(Thumb 状态)ARM7TDMI 支持3种数据类型字节(8-bit)半字(16-bit)字(32-bit)字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,ARM 指令集的特点,向后兼容:新版本增加指令,并保持指令向后兼容;Load-store 结构*load/store 从存储器中读某个值,操作完后再将其放回存储器中只对存放在寄存器的数据进行处理;对于存储器中的数据,只能使用load/s

2、tore指令进行存取,指令格式,指令格式3 地址指令格式 在ARM状态中使用例,ARM 指令分类,数据处理指令 使用和改变寄存器的值数据传送指令 把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store)控制流指令 分支分支和链接,保存返回的地址,以恢复最先的次序软件中断指令程序状态寄存器指令协处理器指令,ARM指令编码格式,说明Cond指令执行的条件编码Opcode指令操作符编码S决定指令的操作是否影响CPSR的值Rd操作目标寄存器编码Rn包含第一操作数的寄存器编码Shifter_operand表示第二操作数,31 28 27 25 24 21 20 19 16

3、15 12 11 8 7 0,ARM指令集,数据处理指令-1,数据处理指令的类别算术操作按位逻辑操作寄存器移位操作比较操作操作数:32-bits 宽;有3种指定操作数的方式来自寄存器第二操作数可以是常数(立即数)移位寄存器操作数结果:32-bits 宽,放在寄存器中长乘法产生64位结果,数据处理指令 2*,数据处理指令-3,数据处理指令-4,算术操作,按位逻辑操作,寄存器移位,比较操作,数据处理指令-MOV,MOV指令是把一个数N送到目标寄存器中,N可以是寄存器,也可以是立即数。MOV指令语法:指令cond S Rd,N例:PRE r0=5,r2=6 MOV r0,r2 POST r0=6,r

4、2=6,桶形移位器,桶形移位器的使用,PRE r0=8,r2=5MOV r0,r2,LSL#2(逻辑左移两位:r22=r5*4)POST r0=20,r2=5,数据处理指令,移位操作在任何数据处理指令中,第二个寄存器操作数可以有应用该操作数的移位操作.逻辑移位LSL:逻辑左移字的最小位空位清零LSR:逻辑右移字的最大位空位清零.,桶形移位器操作,LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。ASR:算术右移(Arithmetic Shift Right)。算术移位

5、的对象是带符号数,在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。ROR:循环右移(Rotate Right)。从字的最低端移出的位填入字的高端空出的位。RRX:扩展为1的循环右移(Rotate Right Extended by 1 place)。操作数右移一位,空位(位31)用原C标志填充。,数据处理指令-7,移位操作(contd)算术移位ASR:算术右移ASL:算术左移循环移位:ROR,RRX,数据处理指令,立即数操作:移位寄存器操作数第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,条件码标志,任何数据

6、处理指令都可以设置条件码(N,Z,V,and C)适用于除比较操作外的所有数据处理指令特殊的请求必须在汇编语言中实现,这种请求是通过把”S”增加到选择代码中指定的算术操作设置所有的标志位(N,Z,C,and V)逻辑和移位操作设置 N and Z当无移位操作时,保存V和C,或根据移位操作设置,ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的。这样可以提高代码密度,减少分支跳转指令数目,提高性能。CMP r3,#0 CMP r3,#0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2 skip默认情况下,数据处理指令不影响程序状态寄存器的条件码标志位,但可以选择

7、通过添加“S”来影响标志位。CMP不需要增加“S”就可改变相应的标志位。loop SUBS r1,r1,#1 BNE loop,条件执行及标志位*,Condition Codes,下表为所有可能的条件码:注意:AL为默认状态,不需要单独指出,条件执行示例,一系列的指令都使用条件指令if(a=0)func(1);CMP r0,#0MOVEQ r0,#1;把func()函数的参数赋给r0 BLEQ func置标志位,再使用不同的条件码if(a=0)x=0;r0:a,r1:x if(a0)x=1;CMP r0,#0MOVEQ r1,#0MOVGT r1,#1使用条件比较指令if(a=4|a=10)x

8、=0;CMP r0,#4CMPNE r0,#10MOVEQ r1,#0,条件执行,所有的ARM指令都可以条件执行指令的执行与否取决于CPSR寄存器的N,Z,C and V标志位所有的Thumb指令都可以解压成全部条件指令Condition Field in instruction0000=EQ-Z set(equal)0001=NE-Z clear(not equal)0010=CS-C set(unsigned higher or same)0011=CC-C clear(unsigned lower)0100=MI-N set(negative)0101=PL-N clear(positi

9、ve or zero)0110=VS-V set(overflow)0111=VC-V clear(no overflow)1000=HI-C set and Z clear(unsigned higher)1001=LS-C clear or Z set(unsigned lower or same)1010=GE-N set and V set,or N clear and V clear(greater or equal)1011=LT-N set and V clear,or N clear and V set(less than)1100=GT-Z clear,and either

10、N set and V set,or N clear and V clear(greater than)1101=LE-Z set,or N set and V clear,or N clear and V set(less than or equal)1110=AL-always1111=NV-never,乘法指令集,在寄存器产生32位值,乘法,例子(乘法,乘法累加器)注意最低 32-bits 置于结果寄存器中,其余被忽略 不支持第二立即操作数结果寄存器与源寄存器必须不同 if S bit is set the V is preserved and the C is rendered mea

11、ningless,数据传送指令-1,单指令传送(LDR,STR)单字(32bit),半字(6 bit)以及字节(8 bit)传送寻址寄存器偏移地址=基址 寄存器偏移立即数偏移地址=基址 立即数常数后变址Post-indexing:modify address after use前变址Pre-indexing:modify address before use回写如果可能,更新基址寄存器,单寄存器传送指令,寻址方式,例子,PRE r0=0 x00000000,r1=0 x00009000,Mem320 x00009000=0 x01010101 Mem320 x00009004=0 x02020

12、202回写型前变址寻址:LDR r0,r1,#0 x4!POST r0=0 x02020202,r1=0 x00009004前变址寻址:LDR r0,r1,#0 x4 POST r0=0 x02020202,r1=0 x00009000后变址寻址:LDR r0,r1,#0 x4POST r0=0 x01010101,r1=0 x00009004,数据传送指令-5,多寄存器数据传送指令-LDM,多数据传送指令(LDM,STM)load(LDM)或 store(STM)当前可访问寄存器的任意子集 使用堆栈:maintaining full or empty stacks which can gro

13、w up or down memory上下文切换:保存或重新存储工作寄存器块拷贝:在主存储器中移动大数据块寻址Pre/Post indexingAuto increment or decrement回写到基址寄存器Write back the base register,多寄存器数据传送指令的要点,多寄存器Load/Store指令会增加中断的延迟,因为ARM不会打断正在执行的指令去响应中断,而必须等到指令执行完成;一般编译器将提供一个选项以控制Load/Store指令可以传送的最大寄存器数目,以限制最大中断延迟。,多寄存器传送指令的寻址模式,注:!决定Rn的值是否随着传送而改变,例子,要求:保

14、存r1r3到内存地址0 x90000 x900c,并且更新基址寄存器r4PRE:r1=0 x00000001,r2=0 x00000002,r3=0 x00000003,r4=0 x9000执行操作:STMIA r4!,r1,r2,r3(执行后增加)POST:mem320 x9000=0 x00000001 mem320 x9004=0 x00000002 mem320 x9008=0 x00000003 r4=0 x900c,多寄存器传送寻址模式,r5,r1,r9,r0,r9,STMIA r9!,r0,r1,r5,1000,16,100c,16,1018,16,r1,r5,r9,STMDA

15、r9!,r0,r1,r5,r0,r9,1000,16,100c,16,1018,16,r5,r9,STMDB r9!,r0,r1,r5,r1,r0,r9,1000,16,100c,16,1018,16,r5,r1,r0,r9,r9,STMIB r9!,r0,r1,r5,1000,16,100c,16,1018,16,例1:将存储器中的连续数据装载到寄存器,PRE mem320 x80018=0 x03,mem320 x80014=0 x02,mem320 x80010=0 x01,r0=0 x00080010,r1=0 x00000000,r2=0 x00000000,r3=0 x000000

16、00执行指令:LDMIA r0!,r1-r3POST r0=0 x0008001c,r1=0 x00000001,r2=0 x00000002,r3=0 x00000003,地址指针 存储地址 数据,r3=0 x00000000r2=0 x00000000r1=0 x00000000,r0=0 x80010,例2:完成一个存储器数据块拷贝,注:r9存放源数据的起始地址 r10存放目标起始地址 r11存放源结束地址 loop LDMIA r9!,r0-r7;装载32字节并更新r9指针 STMIA r10!,r0-r7;存储32字节并更新r10指针 CMP r9,r11;是否到达结束地址 BNE

17、loop;不相等跳转,堆栈操作,ARM使用多寄存器Load/Store指令来完成堆栈操作;使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的“A”)还是向下生长(递减的“D”);满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(“E”)是指SP指向堆栈的第一个没有使用的地址或空位置;,堆栈操作寻址方式,堆栈,100,FF,1234,A0BE,8034,ARM堆栈操作通过块传送指令来完成:STMFD(Push)块存储-Full Descending stack STMDBLDMFD(Pop)块装载-Full Descending stack LDMIA,STM

18、FD sp!,r4-r7,lr,例:把寄存器内容放入堆栈,更新sp,PRE 地址 数据,POST 地址 数据,SP,SP,PRE:r1=0 x00000002,r4=0 x00000003,sp=0 x00080014执行指令:STMFD sp!,r1,r4POST:r1=0 x00000002,r4=0 x00000003,sp=0 x0008000c,单数据交换指令-SWAP,单数据交换(SWAP)在寄存器和外部存储器之间交换字节或字读存储器和写存储器是是放在一起的原子指令执行时不能中断当LOCK 信号输出操作时,外部存储器管理单元被锁定,当多线程操作时使程序同步(OS支持)锁定信号量,在

19、寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。语法:SWPB Rd,Rm,Rn可用作信号量不能由armcc编译产生,必须使用汇编器。,Rm,Rd,temp,存储器,Rn,SWP,SWAP指令的用法,PRE mem320 x9000=0 x12345678,r0=0 x00000000,r1=0 x11112222,r2=0 x00009000执行操作:SWP r0,r1,r2POST:mem320 x9000=0 x11112222,r0=0 x12345678,r1=0 x11112222,r2=0 x00009000交换指令多用于实现操作系统中的信

20、号量和互斥操作,该指令有修饰符B,即有字交换和字节交换两种形式;,SWP指令应用示例,Spin MOV r1,=semaphore MOV r2,#1 SWP r3,r2,r1 CMP r3,#1 BEQ spin注:信号量指向的单元是0或1,如果为1,则表示该服务被另一个过程使用,程序继续循环,直至为0,软件中断(SWI),产生一个异常陷阱,跳转到SWI 硬件向量。SWI 处理程序可以检测SWI号,从而决定采取何种操作。通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。语法:SWI,软件中断(SWI)执行的操作,SWI中断处理程序,处理软件中断的代码段称为中断处理

21、程序(SWI Handler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的;SWI号的确定方法:SWI_Number=and NOT(0 xff00000000),28,31,24,27,0,Cond 1 1 1 1,SWI number(ignored by processor),23,条件域,SWI处理程序应用示例,SWI_handler;保存寄存器r0r12和lr STMFD sp!,r0-r12,lr;read the SWI instruction LDR r10,lr,#-4;make off top 8 bits BIC r10,r10,#0 xf

22、f000000;r10-contains the SWI number BL service_routine;return from SWI handler LDMFD sp!,r0-r12,pc,控制和分支指令,控制指令分支和分支连接跳到希望的指令中保存当前的PC并返回(with L bit)分支和交换跳到期望的指令中与指令集交换Rm0=1:Subsequent inst.are THUMB.Rm0=0:Subsequent inst.are ARM.,Branch:B labelBranch with Link:BL subroutine_label处理器把偏移量左移两位,进行符号扩展后再

23、与PC相加 跳转范围:32 Mbyte?如何执行长跳转?,28,31,24,0,Cond 1 0 1 L 偏移量,条件码区域,Link bit0=Branch1=Branch with link,23,25,27,分支指令,控制流指令,分支和链接指令,分支子程序(r14 serves as a link register)嵌套子程序,Full Descending,请求管理程序,管理程序是在特权级操作的程序,它可以实现用户级程序不能实现的任务Example:send text to the displayARM ISA 包括 SWI(SoftWare Interrupt),转移表,根据程序计算

24、值调用一个子程序,Note:slow when the list is long,and all subroutines are equally frequent,程序状态寄存器访问指令,程序状态寄存器访问指令(MRS,MSR)MRS 程序状态寄存器到通用寄存器的数据传送指令MSR 通用寄存器到程序状态寄存器的数据传送指令,PSR 传送指令,MRS和MSR允许传送CPSR/SPSR中的内容到/从一个通用寄存器中。语法:MRS Rd,;Rd=MSR,Rm;=Rm在这里:=CPSR or SPSR_fields=fsxc的任意组合也允许送一个立即数到 psr_fields MSR,#Immedia

25、te用户模式下,所有位均可以被读取,但只有条件标志位(_)可被写。,协处理器指令-1,协处理器一般原理是通过增加核扩展指令集Example:如 MMU&cache.FPU等系统控制器寄存器协处理器专用ARM 控制数据流协处理器只包含数据处理和存贮器传送操作协处理器数据操作(CDP)这类指令是用来告诉协处理器执行某些内部操作无结果返回ARM,ARM并不等待操作完成,协处理器指令,ARM体系支持16个协处理器针对每个协处理器的指令占用 ARM指令集中的固定部分 如果相应的协处理器不存在,将发生一个未定义指令异常。这有三种协处理器指令协处理器数据处理指令 CDP:初始化协处理器数据处理操作协处理器寄

26、存器传送指令 MRC:从 ARM 寄存器移到协处理器寄存器 MCR:从协处理器寄存器移到ARM 寄存器协处理器存储器传送指令 LDC:从存储器装载到协处理器寄存器 STC:从协处理器寄存器存储到存储器,常量的装载,ARM指令不用于将一个32位的常量装入寄存器,因为ARM本身是32位的,所以指令中不可能再定义一个普通的32位常量;ARM增加了2条伪指令,把32位常量送入寄存器:例:LDR Rd,=constant;LDR常量装载伪指令 ADR Rd,Label;ADR地址装载伪指令,为允许装载大常数,汇编器提供了一条伪指令:LDR rd,=const它可能汇编成下列指令:MOV or MVN。或

27、LDR 指令,从数据池(Literal pools)读取常数。For exampleLDR r0,=0 xFF=MOV r0,#0 xFFLDR r0,=0 x55555555=LDR r0,PC,#Imm12DCD 0 x55555555推荐使用这种方法把常数装入寄存器。,装载32 bit常数,0,15,31,0,ADDS r2,r2,#1,ADD r2,#1,32-bit ARM 指令,16-bit Thumb 指令,对于由编译器产生的大部分指令:没有条件执行源、目的寄存器必须相同仅能使用低寄存器常数大小有限制不能使用在线移位器,关于Thumb指令集,Thumb 是16-bit 指令集代码

28、密度优化(总代码大小约为ARM指令的65%)使用窄总线存储器时可以大大提高性能。是 ARM 指令集的一个子集。核存在一个执行状态 Thumb状态ARM和Thumb之间切换使用BX 指令,写 Thumb汇编程序,Thumb不是一个“好”指令集!最好用编译器来产生约束并不一致手动编码使用ARM指令集比较好 更多细节,参看:ARM“Architecture Reference Manual”,ADS与ARM汇编程序设计,生成二进制文件的过程,编译器的基本功能,规定汇编语言的语法规则ADS Vs.GNU预编译(Pre-assembler)标准汇编语言编译二进制文件,预编译(Pre-assembler)

29、,处理伪指令(Pseudo-Instruction)伪指令:做为汇编语言的参数,或被预编译器识别,翻译成标准汇编语言。伪指令的功能:提高程序的可读性和易维护性易于编程,链接器(Linker),将多个目标文件链接成一个可执行的文件编译器只负责把程序翻译成机器码,但处理与存储器地址相关的内容,这部分工作由链接器来完成;一个程序编译完成后会分成代码段(Read-Only,RO)、数据段(Read-Write,RW)、零初始化段(Zero-Initialized,ZI),需要把不同的程序的不同区段链接成一个完整连续的区。,符号定义伪指令数据定义伪指令汇编控制伪指令信息报告伪指令宏指令以及其他伪指令。,

30、伪指令,符号定义伪指令,用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。用于定义局部变量的LCLA、LCLL、LCLS;用于定义全局变量的GBLA、GBLL、GBLS;用于对变量赋值的SETA、SETL、SETS;为通用寄存器列表定义名称的RLIST。,符号定义伪指令,1.LCLA、LCLL、LCLS格式:LCLA/LCLL/LCLS局部变量名说明:LCLA、LCLL、LCLS伪指令用于定义一个汇编程序中的局部变量,并初始化,其中:LCLA定义一个局部的数字变量,初始化为0;LCLL定义一个局部的逻辑变量,初始化为F;LCLS定义一个局部的字符串变量,初始化为空串;这三条伪指

31、令用于声明局部变量,在其局部作用范围内变量名必须唯一。,符号定义伪指令,2.GBLA、GBLL、GBLS格式:GBLA/GBLL/GBLS 变量名说明:GBLA、GBLL、GBLS伪操作定义一个汇编程序中的全局变量,并初始化,其中:GBLA定义一个全局数字变量,并初始化为0;GBLL定义一个全局逻辑变量,并初始化为“F”;GBLS定义一个全局字符串变量,并初始化为空串;这三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。,符号定义伪指令,3.SETA、SETL、SETS格式:变量名SETA/SETL/SETS表达式说明:SETA:给一个数字变量赋值;SETL:给一个逻辑变量赋值;

32、SETS:给一个字符串变量赋值;格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。,符号定义伪指令,4.RLIST格式:名称 RLIST寄存器列表说明:RLIST可用于对一个通用寄存器列表定义名称,该名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器为根据寄存器的编号由低到高访问次序,与列表中的寄存器排列次序无关。,数据定义伪指令,用于为数据分配存储单元,同时也可完成已分配存储单元的初始化。DCBDCW/DCWUDCD/DCDU DCQ/DCQU DCFS/DCFSU DCFD/DCFDU SPACE FIELD MAP,数据定义伪指令,1.

33、DCB:标号 DCB 表达式 说明:DCB用于分配一块字节单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0255的数字,DCB可用“=”代替。2.DCW/DCWU:标号 DCW/DCWU 表达式 说明:DCW分配一段半字存储单元并用表达式值初始化,它定义的存储空间是半字对齐的。,数据定义伪指令,3.DCD/DCDU:标号 DCD/DCDU 表达式 说明:DCD伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。4.DCQ/DCQU:标号 DCQ/DCQU 表达式 说明:DCQ用于分配一块以8个字节为单位

34、的存储区域并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCQU功能跟DCQ类似,只是分配的存储单元不严格字对齐。,数据定义伪指令,5.DCFD/DCFDU:标号DCFD/DCFDU 表达式 说明:DCFD用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的,每个双精度的浮点数占据两个字单元。DCFDU功能跟DCFD类似,只是分配的存储单元不严格字对齐。6.DCFS/DCFSU:标号DCFS/DCFSU 表达式 说明:DCFS用于为单精度的浮点数分配一片连续的字存储单元并用表达式初始化,它定义的存储空间是字对齐的,每个单精度浮点数

35、使用一个字单元.DCFSU功能跟DCFS类似,只是分配的存储单元不严格字对齐。,数据定义伪指令,7.SPACE:标号 SPACE表达式 说明:SPACE用于分配一片连续的存储区域并初始化为0,表达式为要分配的字节数,SPACE也可用“”代替。8.MAP:MAP 表达式,基址寄存器 说明:MAP定义一个结构化的内存表的首地址,“”可以用来代替MAP。9.FILED:标号 FIELD字节数 说明:FIELD用于定义一个结构化内存表中的数据域,“#”可用来代替FILED。,汇编控制伪指令,汇编控制伪操作用于指引汇编程序的执行流程:MACRO、MEND IF、ELSE、ENDIFWHILE、WENDM

36、EXIT,汇编控制伪指令,1.MACRO、MEND MACRO$标号宏名$参数1,$参数2,指令序列 MEND 说明:MACRO 表明一个宏定义的开始,MEND则表示一个宏的结束,MACRO、MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后就可以在程序中通过宏的名称及参数调用该段代码。MACRO和MEND之间的代码称为宏定义体,在宏定义体的第一行声明宏的原型,宏的原型包含宏名、所需的参数。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参数的值传递给宏定义中的参数。注意宏操作可以嵌套使用,并可以在编译时用选项加以控制。,汇编控制伪指令,2.IF、

37、ELSE、ENDIF IF逻辑表达式 代码段1 ELSE 代码段2 ENDIF 说明:IF、ELSE、ENDIF伪操作能根据逻辑表达式的成立与否决定是否在编译时加入某个指令序列。IF、ELSE、ENDIF可以分别用“”、“|”、“”代替。IF、ELSE、ENDIF伪指令可以嵌套使用。,汇编控制伪指令,3.WHILE、WEND:WHILE 逻辑表达式 代码段 WEND 说明:WHILE和WEND伪指令能根据逻辑表达式的成立与否决定是否循环执行这个代码段。WHILE、WEND伪指令可以嵌套使用。4.MEXIT:MEXIT 说明:MEXIT用于从宏中退出。,其他伪指令,1.ASSERT:ASSERT

38、 逻辑表达式 说明:ASSERT用来表示程序的编译必须满足一定的条件,如果逻辑表达式不满足,则编译器会报错。2.ALIGN:ALIGN 表达式,偏移量 说明:ALIGN伪操作可以通过填充字节使当前的位置满足一定的对齐方式。其中,表达式的值为2的幂,如1、2、4、8、16等,用于指定对齐方式。如果伪操作中没有指定表达式,则编译器会将当前位置对齐到下一个字的位置。偏移量也是个数字表达式,如果存在偏移量,则当前位置的自动对齐到:2的表达式值次方偏移量。,其他伪指令,3.AREA:AREA 段名 属性,说明:AREA用于定义一个代码段、数据段或者特定属性的段。如果段名以数字开头,那么该段名需用“|”字

39、符括起来,如|7wolf|,用C的编译器产生的代码一般也用“|”括起来。属性部分表示该代码段/数据段的相关属性,多个属性可以用“,”分隔。常见属性如下:DATA:定义数据段。CODE:定义代码段。READONLY:表示本段为只读。READWRITE:表示本段可读写。ALIGN=表达式:对齐方式为2表达式次方,例如:表达式=3,则对齐方式为8字节对齐。表达式的取值范围为031。COMMON属性:定义一个通用段,这个段不包含用户代码和数据。,其他伪指令,4.CODE16、CODE32:CODE16/CODE32 说明:CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操

40、作指示编译器后面的代码为32位的ARM指令。5.ENTRY:ENTRY 说明:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定,但在一个源文件里最多只能有一个ENTRY或者没有ENTRY。,其他伪指令,6.END:END 说明:“END”告诉编译器已经到了源程序的结尾。7.EQU:名称 EQU 表达式,类型 说明:EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的define,可用“*”代替EQU。如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有

41、以下三种:CODE16/CODE32/DATA,其他伪指令,8.EXPORT:EXPORT 标号,WEAK 说明:EXPORT 在程序中声明一个全局标号,该标号可以被其他的文件中的代码引用。用户也可以用GLOBAL代替EXPORT。,WEAK可选项声明其他文件有同名的标号,则该同名标号优先于该标号被引用。9.IMPORT:IMPORT 标号,WEAK 说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。,WEAK选项表示如果所有的源文件都没有找到这个标号的定义,编译器也不会提示错误信息

42、。编译器在多数情况下将该标号置为0,如果这个标号被B或BL指令引用,则将B或BL指令替换为NOP操作。,其他伪指令,10.EXTERN:EXTERN 标号,WEAK 说明:EXTERN告诉编译器所使用的标号要在当前源文件中引用,但该标号是在其他的源文件中定义的。与IMPORT不同的是,如果当前源文件实际上没有引用该标号,该标号就不会被加入到当前文件的符号表中。,WEAK选项意义同IMPORT。11.RN:名称RN 表达式 说明:RN用于给一个寄存器定义一个别名,以便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。,其他伪指令,12.GET/INCLUDE:GET

43、文件名 说明:GET将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置展开进行汇编处理。INCLUDE和GET作用等效的。我们通常这样使用这个伪指令:在某源文件中定义一些宏指令,用MAP和FIELD定义结构化的数据类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他的源文件中。GET/INCLUDE只能用于包含源文件,包含其他文件则需要使用INCBIN伪指令。13.INCBIN:INCBIN 文件名 说明:INCBIN将一个数据文件或者目标文件包含到当前的源文件中,编译时被包含的文件不作任何变动的存放在当前文件中,编译器从后面开始继续处理。,其他伪指

44、令,14.ROUT:名称 ROUT 说明:ROUT可以给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作用范围为当前ROUT和下一个ROUT之间。,应用示例-系统初始化,复位动作,初始化过程,初始化堆栈(1),第一步:定义6种操作模式AREA RamData,DATA,READWRITE 0 xDffff00-10240(MAP:定义存储器的起始地址)UserStack#2048;(FIELD:预留2KB的存储空间)SVCStack#2048;UndefStack#2048;AbortStack#2048;IRQStack#

45、2048;FIQStack#0;,初始化堆栈(2),第二步:定义各种模式下的寄存器,设定未定义指令模式堆栈:mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x1b|0 xc0msr cpsr_cxsf,r1;chang mode to UnderStack M11011ldr sp,=UndefStack;let sp=UnderStack,设定中止模式堆栈:mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x17|0 xc0msr cpsr_cxsf,r1;chang mode to UnderStack M10111ldr sp

46、,=AbortStack;let sp=AbortStack,初始化堆栈(3),设定中断模式堆栈:mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x12|0 xc0msr cpsr_cxsf,r1;chang mode to UnderStack M10010ldr sp,=IRQStack;let sp=IRQStack,设定快速中断模式堆栈:mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x11|0 xc0msr cpsr_cxsf,r1;chang mode to UnderStack M10001ldr sp,=FIQSt

47、ack;let sp=FIQStack,初始化堆栈(4),设定监控模式堆栈:mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x13|0 xc0msr cpsr_cxsf,r1;chang mode to UnderStack M10011ldr sp,=SVCStack;let sp=SVCStack,ATPCS(arm/thumb程序调用规范),r8,r9/sb,r10/sl,r11,r12,r13/sp,r14/lr,r15/pc,r0,r1,r2,r3,r4,r5,r6,r7,寄存器变量必须保护,作为函数传递的参数值,Scratch register(co

48、rruptible),Stack PointerLink RegisterProgram Counter,编译器使用一套规则的来设置寄存器的用法ARM-Thumb Procedure Call Standard or ATPCS(or APCS)CPSR 标志位可被函数调用所破坏任何和编译过的代码交互工作的汇编码在接口层必 须满足ATPCS的规范,Register,-如果 RWPI选项有效,作为栈的基地址,-如果软件堆栈检查有效,作为栈的限制值,-可作为临时的一个值栈一样来使用,-子程序内部调用的可改写的寄存器,-程序计数器,参数传递,开始四个字大小的参数直接使用寄存器的R0-R3来传递(快速

49、且高效的)更多的信息可参看ATPCS如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操作)所以通常限制参数的个数,使它为4或更少。如果不可避免,把常用的参数前4个放在R0-R3中,Example.,Parameter Passing(4 parameters)int func1(int a,int b,int c,int d)return a+b+c+d;int caller1(void)return func1(1,2,3,4);,func1 0 x000000:ADD r0,r0,r1 0 x000004:ADD r0,r0,r2 0 x000008:ADD r0,r0,r3

50、 0 x00000c:MOV pc,lr caller1 0 x000014:MOV r3,#4 0 x000018:MOV r2,#3 0 x00001c:MOV r1,#2 0 x000020:MOV r0,#1 0 x000024:B func1,Parameter Passing(4 parameters),Parameter Passing(6 parameters),Parameter Passing(6 parameters),func2 0 x000000:STR lr,sp,#-4!0 x000004:ADD r0,r0,r1 0 x000008:ADD r0,r0,r2 0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号