嵌入式微处理器-arm指令集-课件.ppt

上传人:可**** 文档编号:91536616 上传时间:2023-05-27 格式:PPT 页数:75 大小:1.78MB
返回 下载 相关 举报
嵌入式微处理器-arm指令集-课件.ppt_第1页
第1页 / 共75页
嵌入式微处理器-arm指令集-课件.ppt_第2页
第2页 / 共75页
点击查看更多>>
资源描述

《嵌入式微处理器-arm指令集-课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式微处理器-arm指令集-课件.ppt(75页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1第五讲第五讲 ARM ARM指令集与编程指令集与编程2ARM 指令集的特点l向后兼容:新版本增加指令,并保持指令向后兼容;向后兼容:新版本增加指令,并保持指令向后兼容;lLoad-store Load-store 结构结构*uload/store load/store 从存储器中读某个值从存储器中读某个值,操作完后再将其放回存储操作完后再将其放回存储器中器中u只对存放在寄存器的数据进行处理;只对存放在寄存器的数据进行处理;u对于存储器中的数据,只能使用对于存储器中的数据,只能使用load/storeload/store指令进行存取指令进行存取3指令格式l指令格式指令格式u3 3 地址指令格式

2、地址指令格式 在在ARMARM状态中使用状态中使用u例例指令语法指令语法目标寄存器(目标寄存器(Rd)源寄存器源寄存器1(Rn)源寄存器源寄存器2(Rm)ADD r3,r1,r2r3r1r24ARM指令编码格式l说明说明lCondl指令执行的条件编码指令执行的条件编码lOpcodel指令操作符编码指令操作符编码lSl决定指令的操作是否影响决定指令的操作是否影响CPSR的值的值lRdl操作目标寄存器编码操作目标寄存器编码lRnl包含第一操作数的寄存器编码包含第一操作数的寄存器编码lShifter_operandl表示第二操作数表示第二操作数cond001opcodesRnRdShifter_op

3、erand 31 28 27 25 24 21 20 19 16 15 12 11 8 7 056ARM 指令分类l数据处理指令数据处理指令 使用和改变寄存器的值使用和改变寄存器的值l数据传送指令数据传送指令 把存储器的值拷贝到寄存器中把存储器的值拷贝到寄存器中 (load)or(load)or 把寄存器中的值拷贝到存储器中把寄存器中的值拷贝到存储器中(store)(store)l控制流指令控制流指令 分支分支分支和链接分支和链接,保存返回的地址保存返回的地址,以恢复最先的次序以恢复最先的次序l软件中断指令软件中断指令l程序状态寄存器指令程序状态寄存器指令l协处理器指令协处理器指令7数据处理指

4、令-1l数据处理指令的类别数据处理指令的类别u算术操作算术操作u按位逻辑操作按位逻辑操作u寄存器移位操作寄存器移位操作u比较操作比较操作l操作数操作数:32-bits:32-bits 宽宽;有有3 3种指定操作数的方式种指定操作数的方式u来自寄存器来自寄存器u第二操作数可以是常数第二操作数可以是常数(立即数立即数)u移位寄存器操作数移位寄存器操作数8数据处理指令-2ADD r0,r1,r2r0:=r1+r2ADC r0,r1,r2r0:=r1+r2+CSUB r0,r1,r2r0:=r1-r2SBC r0,r1,r2r0:=r1-r2+C-1RSB r0,r1,r2r0:=r2 r1RSC r

5、0,r1,r2r0:=r2 r1+C-1算术操作算术操作按位逻辑操作按位逻辑操作AND r0,r1,r2r0:=r1 and r2ORR r0,r1,r2r0:=r1 or r2EOR r0,r1,r2r0:=r1 xor r2BIC r0,r1,r2r0:=r1 and(not)r2寄存器移位寄存器移位MOV r0,r2r0:=r2MVN r0,r2r0:=not r2比较操作比较操作CMP r1,r2set cc on r1-r2CMN r1,r2set cc on r1+r2TST r1,r2set cc on r1 and r2TEQ r1,r2set cc on r1 xor r29

6、10桶形移位器的使用lPRE r0=8,r2=5lMOV r0,r2,LSL#2(逻辑左移两位:(逻辑左移两位:r20)x=1;CMP r0,#0MOVEQ r1,#0MOVGT r1,#1l使用条件比较指令使用条件比较指令if(a=4|a=10)x=0;CMP r0,#4CMPNE r0,#10MOVEQ r1,#019条件执行l所有的所有的ARM指令都可以指令都可以条条件件执行行l指令的指令的执行行与与否取否取决决于于CPSR寄存器的寄存器的N,Z,C and V标标志位志位lCondition Field in instructionl0000=EQ-Z set(equal)l0001=

7、NE-Z clear(not equal)l0010=CS-C set(unsigned higher or same)l0011=CC-C clear(unsigned lower)l0100=MI-N set(negative)l0101=PL-N clear(positive or zero)l0110=VS-V set(overflow)l0111=VC-V clear(no overflow)l1000=HI-C set and Z clear(unsigned higher)l1001=LS-C clear or Z set(unsigned lower or same)l1010

8、=GE-N set and V set,or N clear and V clear(greater or equal)l1011=LT-N set and V clear,or N clear and V set(less than)l1100=GT-Z clear,and either N set and V set,or N clear and V clear(greater than)l1101=LE-Z set,or N set and V clear,or N clear and V set(less than or equal)l1110=AL-alwaysl1111=NV-ne

9、ver20数据传送指令-1l单指令传送单指令传送 (LDR,STR)(LDR,STR)u单字单字(32bit),(32bit),半字半字(1(16 bit)6 bit)以及字节以及字节(8 bit)(8 bit)传送传送u寻址寻址u寄存器偏移寄存器偏移u地址地址 =基址基址 寄存器偏移寄存器偏移u立即数偏移立即数偏移u地址地址=基址基址 立即数常数立即数常数u后变址后变址Post-indexingPost-indexing:modify address after use:modify address after useu前变址前变址Pre-indexing:modify address be

10、fore usePre-indexing:modify address before useu回写回写u如果可能如果可能,更新基址寄存器更新基址寄存器21单寄存器传送指令LDR把一个字装入一个寄存器把一个字装入一个寄存器Rdmem32addressSTR从一个寄存器保存一个字或者一个字节从一个寄存器保存一个字或者一个字节Rdmem32addressLDRB把一个字节装入一个寄存器把一个字节装入一个寄存器Rdmem8addressSTRB从一个寄存器保存一个字节从一个寄存器保存一个字节Rdmem8addressLDRH把一个半字节装入一个寄存器把一个半字节装入一个寄存器Rdmem16addres

11、sSTRH从一个寄存器保存一个半字从一个寄存器保存一个半字Rdmem16addressLDRSB把一个有符号字节装入寄存器把一个有符号字节装入寄存器RdsignExtent(mem8address)STRSH把一个有符号半字装入寄存器把一个有符号半字装入寄存器RdsignExtent(mem16address)22寻址方式变址模式变址模式数据数据基址寄存器基址寄存器示例示例回写前变址回写前变址membase+offset基址寄存器加上偏基址寄存器加上偏移移LDR r0,r1,#4!前变址前变址membase+offset不变不变LDR r0,r1,#4后变址后变址membase基址寄存器加上偏

12、基址寄存器加上偏移移LDR r0,r1,#42324数据传送指令-2COPY:ADR r1,TABLE1;r1 points to TABLE1ADR r2,TABLE2;r2 points to TABLE2LOOP:LDR r0,r1STR r0,r2ADD r1,r1,#4ADD r2,r2,#4.TABLE1:.TABLE2:.COPY:ADR r1,TABLE1;r1 points to TABLE1ADR r2,TABLE2;r2 points to TABLE2LOOP:LDR r0,r1,#4STR r0,r2,#4.TABLE1:.TABLE2:.25多寄存器数据传送指令-L

13、DMl多数据传送指令多数据传送指令 (LDM,STM)(LDM,STM)uload(LDM)load(LDM)或或 store(STM)store(STM)当前可访问寄存器的任意子集当前可访问寄存器的任意子集u 使用使用u堆栈堆栈:maintaining full or empty stacks which can:maintaining full or empty stacks which can grow up or down memorygrow up or down memoryu上下文切换上下文切换:保存或重新存储工作寄存器保存或重新存储工作寄存器u块拷贝块拷贝:在主存储器中移动大数

14、据块在主存储器中移动大数据块26多寄存器数据传送指令的要点l多寄存器多寄存器Load/Store指令会增加中断的延迟,因为指令会增加中断的延迟,因为ARM不会打断不会打断正在执行的指令去响应中断,而必须等到指令执行完成;正在执行的指令去响应中断,而必须等到指令执行完成;l一般编译器将提供一个选项以控制一般编译器将提供一个选项以控制Load/Store指令可以传送的最指令可以传送的最大寄存器数目,以限制最大中断延迟。大寄存器数目,以限制最大中断延迟。2728例子要求:保存要求:保存r1r3到内存地址到内存地址0 x90000 x900c,并且更新基,并且更新基址寄存器址寄存器r4PRE:r1=0

15、 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 x900c29多寄存器传送寻址模式r5r1r9r0r9STMIA r9!,r0,r1,r5100016100c16101816r1r5r9STMDA r9!,r0,r1,r5r0r9100016100c16101816r5r9STMDB r9!,r

16、0,r1,r5r1r0r9100016100c16101816r5r1r0r9r9STMIB r9!,r0,r1,r5100016100c161018163031例2:完成一个存储器数据块拷贝l注:注:r9存放源数据的起始地址存放源数据的起始地址 r10存放目标起始地址存放目标起始地址 r11存放源结束地址存放源结束地址 loop LDMIA r9!,r0-r7 ;装载装载32字节并更新字节并更新r9指针指针 STMIA r10!,r0-r7 ;存储存储32字节并更新字节并更新r10指针指针 CMP r9,r11 ;是否到达结束地址是否到达结束地址 BNE loop ;不相等跳转不相等跳转目的

17、目的源源高地址低地址拷贝存储地址r9r11r1032堆栈操作lARM使用多寄存器使用多寄存器Load/Store指令来完成堆栈操作;指令来完成堆栈操作;l使用堆栈时,需要确定堆栈在存储空间中是向上生长使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的(递增的“A”)还是向下生长(递减的)还是向下生长(递减的“D”););l满堆栈(满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(使用的地址或满位置;相反,空堆栈(“E”)是指)是指SP指向堆栈的第一个没有使用的地址或空位置;指向堆栈的第一个没有使用的地址或空位置;33堆栈操作

18、寻址方式寻址方式寻址方式说明说明pop=LDMpush=STMFA递增满递增满LDMFALDMDASTMFASTMIBFD递减满递减满LDMFDLDMIASTMFDSTMDBEA递增空递增空LDMEALDMDBSTMEASTMIAED递减空递减空LDMEDLDMIBSTMEDSTMDA34LDMFD sp!,r4-r7,pcSP100FF1234AOBE80341010123484209753r41r5 14544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr803

19、4ABCD8765102E16FFFF1010123484209753存储器顶存储器顶SPSP100FF1234A0BE8034SPOld SP100FF1234A0BE8034lARM堆栈操作通过块传送指令来完成堆栈操作通过块传送指令来完成:STMFD(Push)块存储块存储-Full Descending stack STMDBLDMFD(Pop)块装载块装载-Full Descending stack LDMIASTMFD sp!,r4-r7,lr35例:把寄存器内容放入堆栈,更新sp0 x800180 x000000010 x800140 x000000020 x80010Empty0

20、 x8000cEmpty0 x800180 x000000010 x800140 x000000020 x800100 x000000030 x8000c0 x00000002PRE 地址 数据POST 地址 数据SPSPPRE:r1=0 x00000002,r4=0 x00000003,sp=0 x00080014执行指令:执行指令:STMFD sp!,r1,r4POST:r1=0 x00000002,r4=0 x00000003,sp=0 x0008000c36单数据交换指令-SWAPl单数据交换单数据交换 (SWAP)(SWAP)u在寄存器和外部存储器之间交换字节或字在寄存器和外部存储器

21、之间交换字节或字u读存储器和写存储器是是放在一起的读存储器和写存储器是是放在一起的u原子指令原子指令u执行时不能中断执行时不能中断37l在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。一个字节或字的交换。l语法:语法:l SWPB Rd,Rm,Rnl可用作信号量可用作信号量l不能由不能由armcc编译产生,必须使用汇编器。编译产生,必须使用汇编器。RmRd321temp存储器存储器RnSWP38SWAP指令的用法lPRE mem320 x9000=0 x12345678,r0=0 x

22、00000000,r1=0 x11112222,r2=0 x00009000执行操作:执行操作:SWP r0,r1,r2lPOST:mem320 x9000=0 x11112222,r0=0 x12345678,r1=0 x11112222,r2=0 x00009000l交换指令多用于实现操作系统中的信号量和互斥操作,该指令有交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符修饰符B,即有字交换和字节交换两种形式;,即有字交换和字节交换两种形式;39程序状态寄存器访问指令l程序状态寄存器访问指令程序状态寄存器访问指令(MRS,MSR)(MRS,MSR)lMRS MRS 程序状态寄存

23、器到通用寄存器的数据传送指令程序状态寄存器到通用寄存器的数据传送指令lMSR MSR 通用寄存器到程序状态寄存器的数据传送指令通用寄存器到程序状态寄存器的数据传送指令40常量的装载lARM指令不用于将一个指令不用于将一个32位的常量装入寄存器,因为位的常量装入寄存器,因为ARM本身是本身是32位的,所以指令中不可能再定义一个普通的位的,所以指令中不可能再定义一个普通的32位常量;位常量;lARM增加了增加了2条伪指令,把条伪指令,把32位常量送入寄存器:位常量送入寄存器:l例:例:LDR Rd,=constant ;LDR常量装载伪指令常量装载伪指令 ADR Rd,Label ;ADR地址装载

24、伪指令地址装载伪指令41l为允许装载大常数,汇编器提供了一条伪指令为允许装载大常数,汇编器提供了一条伪指令:lLDR rd,=constl它可能汇编成下列指令:它可能汇编成下列指令:lMOV or MVN。或或lLDR 指令,从数据池(指令,从数据池(Literal pools)读取常数。)读取常数。lFor examplelLDR r0,=0 xFF=MOV r0,#0 xFFlLDR r0,=0 x55555555=LDR r0,PC,#Imm12DCD 0 x55555555l推荐使用这种方法把常数装入寄存器推荐使用这种方法把常数装入寄存器。装载32 bit常数42015310ADDS

25、r2,r2,#1ADD r2,#132-bit ARM 指令16-bit Thumb 指令关于Thumb指令集lThumb 是是16-bit 指令集指令集l代码密度优化代码密度优化(总代码大小约为(总代码大小约为ARM指令的指令的65%)l使用窄总线存储器时可以大大提高性能。使用窄总线存储器时可以大大提高性能。l是是 ARM 指令集的一个子集。指令集的一个子集。l核存在一个执行状态核存在一个执行状态 Thumb状态状态lARM和和Thumb之间切换使用之间切换使用BX 指令指令43ARM汇编程序设计汇编程序设计44符号定义伪指令数据定义伪指令汇编控制伪指令信息报告伪指令宏指令以及其他伪指令。伪

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

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

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

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

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

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

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

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

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

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

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

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

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

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

40、前文件中,编译器从后面开始继续处理。66其他伪指令14.ROUT:名称 ROUT 说明:ROUT可以给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作用范围为当前ROUT和下一个ROUT之间。67ATPCS(arm/thumb程序调用规范)r8r9/sbr10/slr11r12r13/spr14/lrr15/pcr0r1r2r3r4r5r6r7寄存器变量寄存器变量必须保护必须保护作为函数传递的参数值作为函数传递的参数值Scratch register(corruptible)Stack PointerLink Registe

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

42、字大小的参数直接使用寄存器的开始四个字大小的参数直接使用寄存器的R0-R3来传递来传递(快速且高快速且高效的效的)l更多的信息可参看更多的信息可参看ATPCSl如果需要更多的参数,将使用堆栈。如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存需要额外的指令和慢速的存储器操作储器操作)l所以通常限制参数的个数,使它为所以通常限制参数的个数,使它为4或更少。或更少。l如果不可避免,把常用的参数前如果不可避免,把常用的参数前4个放在个放在R0-R3中中Example.69lParameter Passing(4 parameters)int func1(int a,int b,int c,i

43、nt 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 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 func1Parameter Passing(4 parameters)70Paramete

44、r Passing(6 parameters)lParameter Passing(6 parameters)func2 0 x000000:STR lr,sp,#-4!0 x000004:ADD r0,r0,r1 0 x000008:ADD r0,r0,r2 0 x00000C:ADD r0,r0,r3 0 x000010:LDMIB sp,r12,r14 0 x000014:ADD r0,r0,r12 0 x000018:ADD r0,r0,r14 0 x00001C:LDR pc,sp,#4 caller2 0 x000020:STMFD sp!,r2,r3,lr 0 x000024:M

45、OV r3,#6 0 x000028:MOV r2,#5 0 x00002C:STMIA sp,r2,r3 0 x000030:MOV r3,#4 0 x000034:MOV r2,#3 0 x000038:MOV r1,#2 0 x00003C:MOV r0,#1 0 x000040:BL func2 0 x000044:LDMFD sp!,r2,r3,pcint func2(int a,int b,intc,int,d,int e,int f)return a+b+c+d+e+f;int caller2(void)return func1(1,2,3,4,5,6);This code is

46、 compiled with“-O2-Ono_autoinline”71Parameter Passing(6 parameters)func2 0 x000000:STR lr,sp,#-4!0 x000004:ADD r0,r0,r1 0 x000008:ADD r0,r0,r2 0 x00000C:ADD r0,r0,r3 0 x000010:LDMIB sp,r12,r14 0 x000014:ADD r0,r0,r12 0 x000018:ADD r0,r0,r14 0 x00001C:LDR pc,sp,#4 caller2 0 x000020:STMFD sp!,r2,r3,lr

47、 0 x000024:MOV r3,#6 0 x000028:MOV r2,#5 0 x00002C:STMIA sp,r2,r3 0 x000030:MOV r3,#4 0 x000034:MOV r2,#3 0 x000038:MOV r1,#2 0 x00003C:MOV r0,#1 0 x000040:BL func2 0 x000044:LDMFD sp!,r2,r3,pc56SP12345672循环终止l在在for(),while()dowhile()的循环中,用减到的循环中,用减到0代替加到某个值。代替加到某个值。l比如,用下面的代替比如,用下面的代替:for(loop=1;lo

48、op=total;loop+)/(ADD,CMP)代替为:for(loop=total;loop!=0;loop-)/(SUBS)l尽量减少循环的次数尽量减少循环的次数l代码小,且使用更少的寄存器代码小,且使用更少的寄存器Example.73Loop TerminationCount upint fact1(int limit)int i;int fact=1;for(i=1;i=limit;i+)fact=fact*i;return fact;Count downint fact2(int limit)int i;int fact=1;for(i=limit;i!=0;i-)fact=fac

49、t*i;return fact;fact2 0 x000000:MOVS r1,r0 0 x000004:MOV r0,#1 0 x000008:MOVEQ pc,lr 0 x00000c:MUL r0,r1,r0 0 x000010:SUBS r1,r1,#1 0 x000014:BNE 0 x0c 0 x000018:MOV pc,lrfact1 0 x000000:MOV r2,#1 0 x000004:MOV r1,#1 0 x000008:CMP r0,#1 0 x00000c:BLT 0 x20 0 x000010:MUL r2,r1,r2 0 x000014:ADD r1,r1,

50、#1 0 x000018:CMP r1,r0 0 x00001c:BLE 0 x10 0 x000020:MOV r0,r2 0 x000024:MOV pc,lrThis code is compiled with“-O2-Otime”74在C程序中调用汇编l在汇编程序中用在汇编程序中用export name来定义来定义l在在C程序中直接调用程序中直接调用,用用EXTERN声明声明l正常链接正常链接extern void mystrcopy(char*d,const char*s);int main(void)const char*src=“Source”;char dest10;.myst

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com