嵌入式系统_ARM指令系统_第1页
嵌入式系统_ARM指令系统_第2页
嵌入式系统_ARM指令系统_第3页
嵌入式系统_ARM指令系统_第4页
嵌入式系统_ARM指令系统_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

1、vARM处理器指令集为加载/存储型v ARM处理器指令集分为ARM指令集(32位编码长度) 和Thumb指令集(16位编码长度)。v Thumb指令集是ARM指令集的一个子集,即所有的Thumb指令均有相对应的ARM指令。v ARM指令集包括:1) 跳转指令2) 数据处理指令3) 程序状态寄存器处理指令4) 加载/存储指令5) 协处理器指令6) 异常产生指令 vThumb指令集包括:1) 跳转指令2) 数据处理指令3) 加载/存储指令4) 异常产生指令 v 条件执行 几乎所有的ARM指令都是有条件执行,不仅包括常规的跳转指令,也包括所有其他的指令。 普通类型的指令集不同,一般情况下,只有跳转指

2、令才会有条件执行。 条件是否满足要根据CPSR和指令的条件域来确定; 大多数的Thumb指令均为无条件执行。指令的条件码(一)v 指令的条件码 ARM处理器指令的条件域为4位,ARM状态指令的条件域一般为指令编码的高4位。条件码共有16种,每种条件码用2个字符表示,2个字符的条件码可以添加在指令助记符的后面,和指令同时使用。例如,BEQ,表示“相等则跳转”。指令的条件码(二)偏移:基址寄存器的内容加(或减)偏移量形成存储器地址R1,R2,R3,R4n堆栈寻址堆栈寻址堆栈是一种按特定顺序进行存取的存储区,即堆栈是一种按特定顺序进行存取的存储区,即“后进先出后进先出”,堆栈指针指向栈顶。堆栈指针指

3、向栈顶。 递增堆栈(递增堆栈(Ascending):):向高地址方向生长的堆栈;向高地址方向生长的堆栈; 递减堆栈(递减堆栈(Descending):):向低地址方向生长的堆栈;向低地址方向生长的堆栈; 空堆栈(空堆栈(Empty):):栈指针指向下一个数据项放入的空栈指针指向下一个数据项放入的空位置;位置; 满堆栈(满堆栈(Full):):栈指针指向上一个压入堆栈的有效数栈指针指向上一个压入堆栈的有效数据项。据项。 ARM共支持共支持4种类型的堆栈:种类型的堆栈: FA(Full Ascending):):满递增堆栈;满递增堆栈; FD(Full Descending):):满递减堆栈;满递

4、减堆栈; EA(Empty Ascending):):空递增堆栈;空递增堆栈; ED(Empty Descending):):空递减堆栈;空递减堆栈;例如(详解见后面):例如(详解见后面):STMFD R13,R0-R12,LR;LRR13-4;R12R13-8;LDMFD R13,R0-R12,PC ;R13R0 ; R13+4R1 ;n块寻址块寻址类似于堆栈寻址,但堆栈寻址要配合堆栈进行,而类似于堆栈寻址,但堆栈寻址要配合堆栈进行,而块拷贝则应用于普通数据传送指令。块拷贝则应用于普通数据传送指令。ARM的块拷贝寻址支持的块拷贝寻址支持4种方式:种方式: IB(Increment Befor

5、e):):向上前变址向上前变址 IA(Increment After):):向上后变址向上后变址 DB(Decrement Before):):向下前变址向下前变址 DA(Decrement After):):向下后变址向下后变址跳转指令主要有以下几种形式:跳转指令主要有以下几种形式:格式格式1:B/BL cond label格式格式2:BX/BLX Rm格式格式3:BLX label符号含义:符号含义: B: branch(分支)分支) L:link(链接链接, ,保保存存R14R14) X: exchange(ARMARM/Thumb/Thumb状态切换)状态切换) AREA pt1, C

6、ODE, READONLYAREA pt1, CODE, READONLY ENTRY ENTRY movmov r0,#6 r0,#6cmpcmp r0, #5 r0, #5blltbllt sub1 sub1;less than;less thanblgtblgt sub2 sub2 ;great than;great than sub1sub1movmov pc,lrpc,lrsub2sub2 movmov pc,lrpc,lr END ENDCODE32CODE32;ARM;ARM代码代码blxblx TSUB TSUB; ;调用调用ThumbThumb指令子程序指令子程序TSUBTS

7、UBCODE16CODE16;Thumb;Thumb代码代码TSUBTSUBbxbx R14 R14; ;返回返回ARMARM代码代码数据处理指令包括 3类:数据运算指令、前导零计数指令、乘法指令。主要包括数据传送指令、算术逻辑运算指令和比较测试指令等。数据传送指令用于在寄存器间进行数据传送;算术逻辑运算指令完成常用的算术与逻辑运算,同时可以选择更新CPSR中的相应条件标志位;比较测试指令不保存运算结果,仅根据运算结果更新CPSR中相应的条件标志位。指令名指令含义操作ADD相加Rd=Rn+op2SUB相减Rd=Rn-op2RSB反向相减Rd=op2-RnADC带进位加Rd=Rn+op2+CSB

8、C带借位减Rd=Rn-op2+C-1RSC反向带借位减Rd=op2-Rn+C-1AND位与Rd=Rn AND op2ORR位或Rd=Rn OR op2EOR位异或Rd=Rn EOR op2BIC位清零Rd=Rn AND NOT op2MOV传送Rd=op2MVN传送非Rd=NOT op2CMP比较Rn-op2CMN负向比较Rd=op2-RnTST测试Rn AND op2TEQ测试相等Rn EOR op2该指令不影响条件标志位。0000 0010 1110 1101.0R0 =CLZ R1, R00 x6R1 =1011 1011 0100 0000.0Rm =MOV R0, R0 LSL R1

9、DestinationCF0DestinationCFLSL : Logical Left ShiftASR: Arithmetic Right Shift(无符号数)乘2除2,并保留符号位DestinationCF.0DestinationCFLSR : Logical Shift RightROR: Rotate Right(无符号数)除2位循环 DestinationRRX: Rotate Right Extended位轮换,从 CF到MSB都参与操作CFARM处理器的普通乘法指令共6条:32位的运算结果64位运算结果乘法类指令的所有操作数和结果必须为通用寄存器且不能是立即数或者寄存器的

10、移位结果结果寄存器与操作数1不能相同;r15不能作为操作数寄存器或结果寄存器。32位结果的乘法:MUL cond S Rd, Rm, RsMLA cond S Rd, Rm, Rs, Rn64位结果的长乘法:MUL cond S RdH, RdL, Rm, RsMul为下列符号之一:MUL、MLA、UMULL、UMLAL、SMULL、SMLAL。指令名指令名指令含义指令含义操作操作MUL乘法Rd=Rm*RsMLA乘加Rd=Rm*Rs+RnUMULL无符号数乘法RdH: RdL = Rm*RsUMLAL无符号数乘加RdH: RdL += Rm*RsSMULL有符号数乘RdH: RdL = Rm*

11、RsSMLAL有符号数乘加RdH: RdL += Rm*Rsv 程序状态寄存器处理指令程序状态寄存器处理指令 该指令用于在程序状态寄存器和通用寄存器之间传送数据。该指令用于在程序状态寄存器和通用寄存器之间传送数据。包括包括2条指令:条指令:MRS 程序状态寄存器到通用寄存器的数据传送;程序状态寄存器到通用寄存器的数据传送;MSR 通用寄存器到程序状态寄存器的数据传送。通用寄存器到程序状态寄存器的数据传送。 指令格式:指令格式:MRS cond Rd,CPSR | SPSRMSR cond CPSR_field | SPSR_field, 操作数操作数n加载加载/ /存储指令存储指令( (loa

12、d/store)load/store) 加载加载/存储指令完成寄存器与存储器之间的数据传送存储指令完成寄存器与存储器之间的数据传送; ; 加载指令将存储器中的数据传送到寄存器;加载指令将存储器中的数据传送到寄存器; 存储指令则将寄存器中的数据传送到存储器。存储指令则将寄存器中的数据传送到存储器。 存储器地址由存储器地址由基址寄存器的内容基址寄存器的内容和和偏移量来偏移量来确定,确定,不支持不支持绝对地址寻址绝对地址寻址方式。方式。例如:例如:LDRR1,R0;R0R1 STRR1,R0, #-4;R1R0-4偏移量具有如下偏移量具有如下3种形式:种形式:无符号立即数无符号立即数通用寄存器内容通

13、用寄存器内容通用寄存器的移位结果通用寄存器的移位结果例如:例如:STRR1,R0, #-4;R1R0-4LDR R0,R1,R2;R1+R2R0LDR R0, R5,R7,LSR #2;R5+R7逻辑右移逻辑右移2R0存储器寻址支持3种方式:1.寄存器间接寻址,如寄存器间接寻址,如LDR R1, R02.前变址偏移寻址前变址偏移寻址STR R1,R0,#0 x100;R1R0+0 x100STR R0,R1,R2;R0R1+R2LDR R0, R5,R7,LSR #2;R7/4 +R5R0LDR R1,R0,#4 !;R0+4-R1,R0=R0+4STR R1,R0,#0 x100 ! ;R1

14、R0+0 x100,R0=R0+0 x1003, 后变址偏移索引后变址偏移索引LDR R1,R0,#-4 ;R0-R1,R0=R0-4STR R0,R1,-R2 ;R0-R1,R1=R1-R2LDR R0, R5,R7,LSL #2 ;R5R0,R7*4+R5R50 x50 x5r10 x200基址基址寄存器寄存器0 x200r00 x5源寄存器源寄存器for STR偏移量偏移量120 x20cr10 x200原基址原基址寄存器寄存器0 x200r00 x5源寄存器源寄存器for STR偏移量偏移量120 x20cr10 x20c更新基址寄存器通过通过 STR r0,r1,#12!来自动更新基

15、址寄存器来自动更新基址寄存器n Post-indexed: STR r0,r1,#12单字/无符号字节加载/存储指令(略)格式:格式:LDR|STR LDR|STR condcond B T B TRd,Rd,寻址方式寻址方式 B B:指无符号字节数据传送,仅传送最低有效位;指无符号字节数据传送,仅传送最低有效位; T T:强制处理器为用户模式,用于特权模式下使用用户强制处理器为用户模式,用于特权模式下使用用户寄存器;不能与前变址偏移同时寄存器;不能与前变址偏移同时 例如例如LDRB R5,R9LDRB R5,R9;传送最低有效字节,其他清零传送最低有效字节,其他清零( (大端和大端和小端不同

16、结果)小端不同结果)STRT R0,R1,R2半字/有符号字节加载/存储指令(略)LDR|STR LDR|STR condcond H|SH|SB Rd, H|SH|SB Rd, 寻址方式;寻址方式;H: H: 无符号半字;无符号半字;SH: SH: 有符号半字;(仅有符号半字;(仅LDRLDR) SBSB:有符号字节;(仅有符号字节;(仅LDRLDR)例如例如LDRH R8,R3,#2LDRH R8,R3,#2; R3+2-R8,R3+2-R8,读取低读取低1616位,其他清零位,其他清零LDRSBLDRSB R4,R10,#0 xC1 ;R10+0 xC1-R4,读取字节,有符号读取字节,

17、有符号扩展到扩展到32位(用符号填充)位(用符号填充)LDRSHLDRSH R1,R0,#2!; R0+2-R1,R0=R0+2;读取半字,有读取半字,有符号扩展到符号扩展到32位位其中:其中:偏移量不支持通用寄存器的移位的格式;偏移量不支持通用寄存器的移位的格式;半字传送的地址必须是偶数;半字传送的地址必须是偶数;不能将半字或字节读取到不能将半字或字节读取到R15;R15;双字加载/存储指令(略)该指令完成相邻寄存器与相邻存储单元之间的该指令完成相邻寄存器与相邻存储单元之间的6464位数据传送。位数据传送。LDR|STR LDR|STR condcond D Rd, D Rd,寻址方式;寻址

18、方式;例如例如LDRD R6, R11, #8 ;R11+8-R6,R11+8+4-R7STRD R4, R10, #-24 ;R4-R10,R5-R10+4,R10=R10-24寄存器为寄存器为RdRd和和R(d+1)R(d+1);双字数据传送要求地址必须为双字数据传送要求地址必须为8 8的倍数;的倍数;这里无符号立即数的范围在这里无符号立即数的范围在256256以内;以内;偏移量不支持通用寄存器的移位的格式;偏移量不支持通用寄存器的移位的格式;多寄存器加载/存储指令(一)该指令完成多个通用寄存器与存储单元之间的数据传送。 LDM|STM cond 寻址方式 Rn !,通用寄存器组 符号的含

19、义:寻址方式为:IA、IB、DA、DB、FD、ED、FA、EA;Rn: 基址寄存器,不允许为R15 (PC);!:指令执行后,刷新基址寄存器Rn“ ”:当寄存器列表包含PC且为LDM指令时,同时将SPSR拷贝到CPSR,用于异常返回;当寄存器列表不包含PC,指示指令中所有的寄存器为用户模式下的寄存器IAr1地址地址增加增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxx r10, r0,r1,r4STMxx r10, r0,r1,r4基址寄存器基址寄存器 (Rb)存储器增加存储器增加r13r14r12多寄存器加载/存储指令(二)例如:例如:STMFD R13!, R0,

20、 R4-R7, LR STMFD R13!, R0, R4-R7, LR ;寄存器进栈寄存器进栈LDMFD R13!, R0, R4-R7, PC LDMFD R13!, R0, R4-R7, PC ;寄存器返回寄存器返回注:注:基址寄存器可以出现在寄存器列表中,但要避基址寄存器可以出现在寄存器列表中,但要避免和写回操作免和写回操作“!”同时使用。同时使用。R15R15可以出现在可以出现在LDMLDM指令的寄存器列表中;但要指令的寄存器列表中;但要避免出现在避免出现在STMSTM指令的寄存器列表中,此时,可指令的寄存器列表中,此时,可以使用以使用R14(R14(用以保存返回地址用以保存返回地址

21、) )。 LDMFD sp!,r4-r7,pc100FF1234AOBE80341010123484209753r41r5 14544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存储器顶存储器顶SPSP100FF1234A0BE8034SPOld SP100FF1234A0BE8034STMFD sp!,r4-r7,lrSWAP指令(一)(略)该指令在寄存器和存储器之间进行单字或无符号字节数据的该指令在寄

22、存器和存储器之间进行单字或无符号字节数据的交换交换 SWP SWP condcond B Rd, B Rd, RmRm, , RnRn 符号的含义:符号的含义:Rd:存储器的值加载到该寄存器;存储器的值加载到该寄存器;Rm:该寄存器的值存储到存储器;该寄存器的值存储到存储器;Rn:指向存储器地址的存储器;指向存储器地址的存储器;例如例如 SWP R1, R2, R3 ; R3-R1 且且R2-R3; R15 不能用于该指令的任何寄存器不能用于该指令的任何寄存器 SWAP指令(二)(略)例如:信号量的应用例如:信号量的应用I2C_SEM EQU 0 x08000000I2C_SEM EQU 0

23、x08000000;定义信号量定义信号量I2C_SEM_WAITI2C_SEM_WAITLDR R0,= I2C_SEMLDR R0,= I2C_SEM;SWP R1,R1,R0SWP R1,R1,R0;读信号量读信号量CMP R1,#0CMP R1,#0;判断是否有信号判断是否有信号BEQ I2C_SEM_WAITBEQ I2C_SEM_WAIT;没有则等待没有则等待PLD指令(Cache 预加载)(略)该指令指示存储系统从指定的存储器地址预先加载到该指令指示存储系统从指定的存储器地址预先加载到CacheCache,从而加速存储器的访问。从而加速存储器的访问。 PLD PLD RnRn of

24、fset offset RnRn:基址寄存器,基址寄存器,offsetoffset:偏移量。偏移量。例如例如PLD R2PLD R2PLD R15, #280PLD R15, #280PLD R4, R8, LSL #2 PLD R4, R8, LSL #2 协处理器指令(一)(略)协处理器指令的功能协处理器指令的功能协处理器内部寄存器的数据处理;协处理器内部寄存器的数据处理;协处理器寄存器与协处理器寄存器与ARMARM寄存器间的数据传送;寄存器间的数据传送;协处理器寄存器与存储器间的数据传送;协处理器寄存器与存储器间的数据传送;协处理器编号分配15用于系统控制14测试控制器13:8保留7:4

25、用户3:0保留协处理器指令(二)(略)指令格式指令格式协处理器内部寄存器的数据处理;协处理器内部寄存器的数据处理;CDP CDP condcond cp, opcode_1,CRd, cp, opcode_1,CRd, CRn,CRmCRn,CRm, opcode_2 , opcode_2 CDP2 cp, opcode_1,CRd, CDP2 cp, opcode_1,CRd, CRn,CRmCRn,CRm, opcode_2 , opcode_2 例如:例如:CDPEQ p2,5,C1,C2,C3,2CDPEQ p2,5,C1,C2,C3,2;完成操作完成操作5 5协处理器寄存器与协处理器

26、寄存器与ARMARM寄存器间的数据传送;寄存器间的数据传送;MRC/MCR MRC/MCR condcond cp,opcode_1,Rd,CRn,CRm,opcode_2 cp,opcode_1,Rd,CRn,CRm,opcode_2 MRC2/MCR2 cp,opcode_1,Rd, MRC2/MCR2 cp,opcode_1,Rd, CRnCRn, , CRmCRm , opcode_2 , opcode_2 MRRC/MCRR MRRC/MCRR condcond cp, opcode_1, Rd, cp, opcode_1, Rd, RnRn, , CRmCRm协处理器指令(三)(略

27、)协处理器寄存器与存储器间的数据传送协处理器寄存器与存储器间的数据传送LDC|STC LDC|STC condcond L cp, L cp, CRdCRd, , RnRn, #offset !, #offset !LDC|STC LDC|STC condcond L cp, L cp, CRdCRd, , RnRn, #offset , #offset LDC2|STC2 cp, LDC2|STC2 cp, CRdCRd, , RnRn, #offset !, #offset !LDC2|STC2 cp, LDC2|STC2 cp, CRdCRd, , RnRn, #offset , #of

28、fset L L:指明长整数;指明长整数; 异常产生指令SWI SWI condcond 24 24位数位数SWISWI产生软件中断异常,操作系统在异常处理程产生软件中断异常,操作系统在异常处理程序中提供相应的系统调用序中提供相应的系统调用( (向量地址向量地址0 x08)0 x08),2424位数指明系统调用的类型。位数指明系统调用的类型。 BKPT BKPT condcond 16 16位数位数BKPTBKPT产生预取中止异常,可用于程序的调试。产生预取中止异常,可用于程序的调试。 例如:例如:SWI 0 x123456;SWI 0 x123456; BKPT 0BKPT 0Thumb指令

29、集(一)v ThumbThumb指令集的特点指令集的特点a) 16位指令长度(适于位指令长度(适于16位的存储器,成本低)位的存储器,成本低)b) ARM指令集的一个子集指令集的一个子集c)c) 数据处理指令的操作数和指令寻址地址仍是数据处理指令的操作数和指令寻址地址仍是3232位的位的d)d) 较高的代码密度和较低的功耗较高的代码密度和较低的功耗 e)e) 执行效率相对执行效率相对ARMARM较低较低f)f) 除条件跳转指令外均为无条件执行除条件跳转指令外均为无条件执行Thumb指令集(二)v ThumbThumb指令集包括:指令集包括:跳转指令;跳转指令;数据处理指令;数据处理指令;单寄存

30、器加载单寄存器加载/存储指令;存储指令;多寄存器加载多寄存器加载/存储指令;存储指令;异常产生指令。异常产生指令。Thumb指令集(三)v ThumbThumb指令访问的寄存器指令访问的寄存器通用寄存器通用寄存器R0R7R13(SP)、)、R14(LR)、)、R15(PC)。)。可以有限制地访问可以有限制地访问R8R12、CPSR。v ARM到到Thumb的状态切换途径:的状态切换途径:执行带状态切换(执行带状态切换(X)的跳转指令;的跳转指令;异常返回,使用特殊的数据处理(异常返回,使用特殊的数据处理(MOVS,SUBS)和和多寄存器加载(多寄存器加载(LDM)指令。指令。Thumb指令集(

31、四)v ThumbThumb到到ARMARM的状态切换途径:的状态切换途径:带状态切换(带状态切换(X X)的跳转指令;的跳转指令;进入异常;进入异常;注:注:Thumb指令系统需要含有指令系统需要含有ARM代码代码,例如从,例如从ARM到到Thumb的状态切换指令。的状态切换指令。 Thumb指令集(五)AREA HelloW,CODE,READONLYSWI_WriteCEQU &0SWI_ExitEQU &11ENTRYCODE32ADR R0, STARTBX R0CODE16STARTADR r1, TEXTLOOPLDRB r0, r1ADD r1,r1,#1ARE

32、A HelloW,CODE,READONLYSWI_WriteCEQU &0;假定参数0表示显示输出SWI_ExitEQU &11;参数11表示从SWI返回ENTRYSTARTADR r1, TEXTLOOPLDRB r0, r1, #1 Thumb指令集(六)CMP r0, #0BEQ DONESWI SWI_WriteCB LOOPDONE SWI SWI_ExitALIGN TEXTDATA;在代码段使用数据在代码段使用数据DCB“Hello World”, &0a, &0d, &00END CMP r0, #0SWINE SWI_WriteCBN

33、E LOOPSWI SWI_ExitTEXTDCB“Hello World”, &0a, &0d, 0;END子程序调用条件执行条件判断循环0 x00 x7FFFFFFF0 x80000000-ve+ve- 最大正数最大正数- 最小负数最小负数对于无符号饱和运算,如果整个结果将是负对于无符号饱和运算,如果整个结果将是负值,那么返回的结果是值,那么返回的结果是 0ARM宏汇编ARM宏汇编寄存器定义寄存器特殊定义 其他定义 含义R15PC程序计数器R14LR链接寄存器R13SP堆栈指针R12IP程序调用暂存寄存器R11v8FP变量寄存器8/帧指针(ARM状态)R10v7SL变量寄存

34、器7/堆栈上限指针(ARM状态)R9v6SB变量寄存器6/基址寄存器(进程ID/重入/共享库中)R8v5变量寄存器5R7v4WR变量寄存器4R6v3变量寄存器3R5v2变量寄存器2R4v1变量寄存器1R3a4参数/结果/暂存寄存器4R2a3参数/结果/暂存寄存器3R1a2参数/结果/暂存寄存器2R0a1参数/结果/暂存寄存器1ARM宏汇编状态、浮点、协处理器定义ARM宏汇编内置变量定义PC或者.当前指令的地址VAR或者存储区计数器的当前值TRUE逻辑常量为真FALSE逻辑常量为假OPT当前设置列表选项值CONFIG在ARM状态等于32;THUMB等于16ENDIANbig or littleC

35、ODESIZE如果汇编Thumb代码为16,否则为32CPU选定的CPU符号,未指定则为generic ARMARCHITECTURE选定ARM结构的值,4/4T/5ET等PCSTOREOFFSETSTR pc,或STM Rb,PC的地址和PC的存储值之间的偏移量ARM宏汇编内置变量举例ARM宏汇编符号定义伪操作GBLA,GBLL,GBLS声明全局变量LCLA,LCLL,LCLS声明局部变量SETA,SETL,SETS给变量赋值RLIST为通用寄存器列表定义名称CN为协处理器的寄存器定义名称CP为协处理器定义名称DN,SN为VFP的寄存器定义名称FN为FPA的浮点寄存器定义名称ARM宏汇编全局

36、变量定义(一)ARM宏汇编全局变量定义(二)ARM宏汇编局部变量定义ARM宏汇编变量赋值伪操作ARM宏汇编数据定义伪操作LTORG声明一个数据缓冲池(literal pool)的开始MAP定义一个结构化的内存表(storage map)的首地址FIELD定义结构化的内存表中的一个数据域(field)SPACE/%分配一块内存单元,并用0初始化DCB分配一段字节的内存单元,并用指定的数据初始化DCD/DCDU分配一段字的内存单元,并用指定的数据初始化DCDO分配一段字的内存单元,并将各单元的内容初始化成该但愿相对于静态基址寄存器的偏移量DCFD/DCFDU 分配一段双字的内存单元,并用双精度的浮

37、点数据初始化DCFS/DCFSU分配一段字的内存单元,并用单精度的浮点数据初始化DCI分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码而非数据DCQ/DCQU分配一段双字的内存单元,并用64位的整数数据初始化DCW/DCWU分配一段半字的内存单元,并用指定的数据初始化DATA在代码段中使用数据。已停用,仅用于保持前向兼容ARM宏汇编MAP及FIELDARM宏汇编SPACEARM宏汇编DCBARM宏汇编汇编控制伪操作ARM宏汇编IF,ELSE及ENDIFARM宏汇编WHILE及WENDARM宏汇编MACRO,MEND及MEXIT(一)ARM宏汇编MACRO,MEND及MEX

38、IT(二)ARM宏汇编其他伪操作ALIGN通过添加补丁字节使当前位置满足一定的对齐方式AREA定义一个代码段或数据段CODE16/CODE32指示后面的指令为Thumb/ARM指令END源程序结尾ENTRY程序入口点EQU为数据常量、基于寄存器的值和程序标号定义一个字符名称EXPORT/GLOBAL声明一个可被其他文件引用的符号,相当于声明一个全局变量EXTERN当前符号不是在本源文件定义的,如不使用不引入本源文件的符号列表IMPORT当前符号不是在本源文件定义的,引入本源文件的符号列表GET/INCLUDE将一个源文件包含到当前源文件中,并进行汇编处理INCBIN将一个源文件包含到当前源文件

39、中,但被包含文件不进行汇编处理KEEP将局部符号包含在目标文件的符号表中NOFP禁止源程序中包含浮点运算指令REQUIRE指定段之间的相互依赖关系REQUIRE8/PRESERVE8指示当前代码中要求/是数据栈8字节对齐RN为一个特定的寄存器定义名城ROUT定义局部变量的有效范围1. AREA:AREA 段名 属性,AREA用于定义一个代码段、数据段或者特定属性的段。属性部分表示该代码段/数据段的相关属性,多个属性可以用“,”分隔。n其他伪指令常见属性如下:常见属性如下: DATA:定义数据段。 CODE:定义代码段。READONLY:表示本段为只读。READWRITE:表示本段可读写。一个汇

40、编程序至少应该包含一个段,当程序太一个汇编程序至少应该包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段长时,也可以将程序分为多个代码段和数据段。例如:例如:AREAtest,CODE,READONLYAREA |.text|, CODE, READONLY2. CODE16、CODE32:CODE16/CODE32CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。如果在汇编源代码中同时包含Thumb和ARM指令时,可以用“CODE32”通知编译器其后的指令序列为32位的ARM指令,用“CODE16”伪指令通知

41、编译器其后的指令序列为16位的Thumb指令。在使用ARM指令和Thumb指令混合编程的代码里,这两条伪指令后面的代码类型是不同的,但它们并不能对处理器进行状态的切换。 例如:CODE32; 32位的ARM指令AREA|.text|,CODE,READONLY LDR R0,0 x8500; BXR0 ;程序跳转,并将处理器切换到Thumb状态CODE16 ;16位的Thumb指令 ADD R3,R3,1 END ;源文件结束3. ENTRY:ENTRY用于指定汇编程序的入口。在一个完整用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个的汇编程序中至少要有一个ENTRY,程序中也程序中

42、也可以有多个可以有多个。下面的代码使用了下面的代码使用了ENTRY:AREA subrout, CODE, READONLYENTRY ; mark first instructionstartMOV r0, #10 MOV r1, #3BL doadd stop MOV r0, #0 x18LDR r1, =0 x20026 SWI 0 x123456 ; ARM semihosting SWI doadd ADD r0, r0, r1 ; Subroutine codeMOV pc, lr ; Return from subroutine.END ; Mark end of file4.

43、END:说明:说明:“END”告诉编译器已经到了源程序的结告诉编译器已经到了源程序的结尾。尾。例如:例如:AREAconstdata,DATA,READONLYEND;结尾结尾5. EQU:名称名称 EQU 表达式表达式,类型,类型EQU用于将程序中的数字常量、标号、基于寄用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于存器的值赋予一个等效的名称,这一点类似于C语言中的语言中的define,可用可用“*”代替代替EQU。如果表达式为如果表达式为32位的常量,我们可以指定表达位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:式的数据类型,类型域可以有以下三

44、种:CODE16/CODE32/DATA例如:例如:num1EQU1234;定义定义num1为为1234addr5EQUstr1+0 x50;d1EQU0 x2400,CODE32 ;定义定义d1的值为的值为0 x2400,且该处为且该处为32位的位的ARM指令。指令。6. EXPORT:EXPORT 标号标号,WEAKEXPORT 在程序中声明一个全局标号,其他文在程序中声明一个全局标号,其他文件中的代码可以引用该标号。用户也可以用件中的代码可以引用该标号。用户也可以用GLOBAL代替代替EXPORT。,WEAK可选项声明其他文件有同名的标号,则可选项声明其他文件有同名的标号,则该同名标号优

45、先于该标号被引用。该同名标号优先于该标号被引用。例如:例如:AREA|.text|,CODE,READONLYmain PROC ENDPEXPORT main;声明一个可全局引用的函数声明一个可全局引用的函数mainEND 7. IMPORT:IMPORT 标号标号 ,WEAKIMPORT告诉编译器这个标号要在当前源文件中告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。会加入到当前源文件的符号表中。 ,WEAK选项表示

46、如果所有的源文件都没有找选项表示如果所有的源文件都没有找到这个标号的定义,编译器也不会提示错误信到这个标号的定义,编译器也不会提示错误信息。编译器在多数情况下将该标号置为息。编译器在多数情况下将该标号置为0,如果,如果这个标号被这个标号被B或或BL指令引用,则将指令引用,则将B或或BL指令指令替换为替换为NOP操作。操作。例如:例如:AREAmycode,CODE,READONLY IMPORT_printfEND 8. EXTERN: EXTERN 标号标号 ,WEAK说明:说明:EXTERN告诉编译器所使用的标号要在当告诉编译器所使用的标号要在当前源文件中引用前源文件中引用,但该标号是在其

47、他的源文件中但该标号是在其他的源文件中定义的。与定义的。与IMPORT不同的是,如果当前源文件不同的是,如果当前源文件实际上没有引用该标号,该标号就不会被加入到实际上没有引用该标号,该标号就不会被加入到当前文件的符号表中。当前文件的符号表中。,WEAK选项意义同选项意义同IMPORT。例如:例如:AREA|.text|,CODE,READONLYEXTERN _printf ;告诉编译器当前文件要引用标告诉编译器当前文件要引用标号号 ;如果找不到,则不提示错误;如果找不到,则不提示错误END 9. RN: 名称RN 表达式 说明:说明:RN用于给一个寄存器定义一个别名用于给一个寄存器定义一个别

48、名,以便程序员以便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。名,表达式为寄存器的编码。10.GET/INCLUDE:GET文件名文件名 说明:说明:GET将一个源文件包含到当前的源文件中,并将被将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置展开进行汇编处理。包含的源文件在当前位置展开进行汇编处理。INCLUDE和和GET作用等效的。我们通常这样使用这个伪指令:在某作用等效的。我们通常这样使用这个伪指令:在某源文件中定义一些宏指令,用源文件中定义一些宏指令,用MAP和和FIELD定义结构化的定义

49、结构化的数据类型,用数据类型,用EQU定义常量的符号名称,然后用定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他的源文件中。将这个源文件包含到其他的源文件中。11. INCBIN 文件名文件名INCBIN将一个数据文件或者目标文件包含到当前的将一个数据文件或者目标文件包含到当前的源文件中,编译时被包含的文件不作任何变动的存源文件中,编译时被包含的文件不作任何变动的存放在当前文件中,编译器从后面开始继续处理。放在当前文件中,编译器从后面开始继续处理。例如:例如:AREAconstdata,DATA,READONLYINCBINdata1.datINCBIN E:DATAda

50、ta2.binEND ARM宏汇编伪指令(二)ARM宏汇编伪指令ADRARM宏汇编伪指令ADRLARM宏汇编伪指令LDRARM宏汇编Thumb伪指令v ThumbThumb伪指令伪指令 ADR register,expr LDR register,LDR register, =expr|label-exprexpr|label-expr NOPNOP:空操作空操作ARM与C语言的混和编程(一)ARMARM汇编语言与汇编语言与C/C+C/C+的混合编程的混合编程ARMARM汇编与汇编与C/C+C/C+的混合编程要遵循的混合编程要遵循ATPCSATPCS规则规则(ARM-ARM-Thumb Pro

51、cedure Call StandardThumb Procedure Call Standard)混合编程方式混合编程方式嵌入汇编嵌入汇编格式:格式:_ _ _asmasm 在汇编程序与在汇编程序与C/C+C/C+的程序间进行变量的互访;的程序间进行变量的互访;汇编程序与与汇编程序与与C/C+C/C+程序间的相互调用。程序间的相互调用。ARM与C语言的混和编程(二)IMPORT mainAREA Init,CODE, READONLYENTRYSTART LDR R1, =0 x08000000STRB, R0,R1, #1BL main ENDvoid main()do_task();re

52、turn;从汇编跳转到从汇编跳转到c c程序程序 程序的初始化部分(如外设等)用汇编语言编写,然后,程序的初始化部分(如外设等)用汇编语言编写,然后,执行跳转指令,转移到执行跳转指令,转移到c c程序的入口进行执行程序的入口进行执行 ARM与C语言的混和编程(三)extern void mystrcpy(char *d,char *r);void main()char *s=source;char *r=destionation;mystrcpy(r,s)return ;c c程序调用汇编程程序调用汇编程EXPORT mystrcpyAREA mystrcpy,CODE,READONLYloopldrb r3, r1,#1 strb r3, r0,#1 cmp r3,#0 bne loop mov pc,lr END ARM与C语言的混和编程(四)参数的传递规则参

温馨提示

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

评论

0/150

提交评论