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

下载本文档

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

文档简介

第三讲ARM指令系统电信学院本讲主要内容ARM指令系统寻址方式指令简介汇编实例本讲目的概要介绍ARM、Thumb指令集,能够达到通过查找工具书可以编写简单汇编程序的目的。ARM处理器指令集概述(-)ARM处理器指令集为加载/存储型

ARM处理器指令集分为ARM指令集(32位编码长度)和Thumb指令集(16位编码长度)。

Thumb指令集是ARM指令集的一个子集,即所有的Thumb指令均有相对应的ARM指令。

ARM指令集包括:跳转指令数据处理指令程序状态寄存器处理指令ARM处理器指令集概述(二)加载/存储指令协处理器指令异常产生指令Thumb指令集包括:跳转指令数据处理指令加载/存储指令异常产生指令指令语法格式<opcode> 指令助记符,如ADD{<cond>} 指令执行的条件{S} 决定指令的操作是否影响CPSR<Rd> 目标寄存器<Rn> 包含第一个操作数的寄存器<shifter_operand>第二个操作数<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>ARM指令编码格式指令的条件执行条件执行几乎所有的ARM指令都是有条件执行,不仅包括常规的跳转指令,也包括所有其他的指令。普通类型的指令集不同,一般情况下,只有跳转指令才会有条件执行。条件是否满足要根据CPSR和指令的条件域来确定;大多数的Thumb指令均为无条件执行。指令的条件码(一)指令的条件码ARM处理器指令的条件域为4位,ARM状态指令的条件域一般为指令编码的高4位。条件码共有16种,每种条件码用2个字符表示,2个字符的条件码可以添加在指令助记符的后面,和指令同时使用。例如,BEQ,表示“相等则跳转”。指令的条件码(二)基本寻址方式(一)寄存器寻址例:ADDR0,R1,R2;R1+R2R0立即数寻址例:ADDR3,R3,#2;R3+2R3寄存器间接寻址例:LDRR0,[R3];[R3]R0寄存器移位寻址ADDR3,R2,R1,LSL#3;R1*8+R2R3基本寻址方式(二)寄存器变址寻址,前索引偏移:基址寄存器的内容加(或减)偏移量形成存储器地址立即数偏移:LDRR0,[R1,#4];[R1+4]R0LDRR0,[R1,#4]!;[R1+4]R0,R1+4R1!表明数据传送后更新基址寄存器寄存器偏移:

LDRR0,[R1,-R2] ;[R1-R2]R0移位寄存器偏移:LDRR0,[R1,R2,LSL#2];[R2*4+R1]R0基本寻址方式(三)寄存器变址寻址,后索引立即数偏移:LDRR0,[R1],

#4;[R1]R0,R1+4R1寄存器偏移:

LDRR0,[R3],-R8;[R3]R0,R3-R8R3移位寄存器偏移:LDRR0,[R3],R2,LSL#2;[R3]R0,[R2*4+R3]R3基本寻址方式(四)相对寻址例:BLabel;(PC)+LabelPC多寄存器寻址,一条指令传递多个寄存器值,例STMIAR1,{R2,R3,R4}

;R2[R1]

;R3[R1+4]

;R4[R1+8]基本寻址方式(五)堆栈寻址堆栈是一种按特定顺序进行存取的存储区,即“后进先出”,堆栈指针指向栈顶。递增堆栈(Ascending):向高地址方向生长的堆栈;递减堆栈(Descending):向低地址方向生长的堆栈;空堆栈(Empty):栈指针指向下一个数据项放入的空位置;满堆栈(Full):栈指针指向上一个压入堆栈的有效数据项。

基本寻址方式(五)ARM共支持4种类型的堆栈:

FA(FullAscending):满递增堆栈;

FD(FullDescending):满递减堆栈;

EA(EmptyAscending):空递增堆栈;

ED(EmptyDescending):空递减堆栈;例如(详解见后面):

STMFDR13, {R0-R12, LR} ;LR[R13-4]

;R12[R13-8]

;……

LDMFDR13, {R0-R12, PC} ;[R13]R0

;[R13+4]R1;……基本寻址方式(六)块寻址类似于堆栈寻址,但堆栈寻址要配合堆栈进行,而块拷贝则应用于普通数据传送指令。ARM的块拷贝寻址支持4种方式:

IB(IncrementBefore):向上前变址

IA(IncrementAfter):向上后变址

DB(DecrementBefore):向下前变址

DA(DecrementAfter):向下后变址跳转指令(一)跳转指令主要有以下几种形式:格式1:B/BL{cond}label格式2:BX/BLXRm格式3:BLXlabel符号含义:

B:branch(分支)

L:link(链接,保存R14)

X:exchange(ARM/Thumb状态切换)

跳转指令(二)

AREApt1,CODE,READONLYENTRY movr0,#6 cmpr0,#5

blltsub1

;lessthan

blgtsub2;greatthan

sub1

movpc,lrsub2

movpc,lrEND跳转指令(三)CODE32 ;ARM代码

blxTSUB ;调用Thumb指令子程序TSUB

… CODE16 ;Thumb代码TSUB

… bxR14 ;返回ARM代码数据处理指令(总述)数据处理指令包括

3类:

数据运算指令、 前导零计数指令、 乘法指令。数据运算指令(一)主要包括数据传送指令、算术逻辑运算指令和比较测试指令等。数据传送指令用于在寄存器间进行数据传送;算术逻辑运算指令完成常用的算术与逻辑运算,同时可以选择更新CPSR中的相应条件标志位;比较测试指令不保存运算结果,仅根据运算结果更新CPSR中相应的条件标志位。指令名指令含义操作ADD相加Rd=Rn+op2SUB相减Rd=Rn-op2RSB反向相减Rd=op2-RnADC带进位加Rd=Rn+op2+CSBC带借位减Rd=Rn-op2+C-1RSC反向带借位减Rd=op2-Rn+C-1AND位与Rd=RnANDop2ORR位或Rd=RnORop2EOR位异或Rd=RnEORop2BIC位清零Rd=RnANDNOTop2MOV传送Rd=op2MVN传送非Rd=NOTop2CMP比较Rn-op2CMN负向比较Rd=op2-RnTST测试RnANDop2TEQ测试相等RnEORop2前导零计数CLZ(CountLeadingZeros)CLZ{cond}Rd,Rm计算寄存器中的前导0(第一个1以前的0)

源寄存器从最高位开始计算。1个周期完成 (ARM9E-S/ARM102x)如果没有任何一位是1,结果是32;如果bit31是1,结果为0。该指令不影响条件标志位。0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1第2操作数移位操作ASRn 算术右移,最高位补符号LSLn 逻辑左移,右补0LSRn 逻辑右移,左补0RORn 循环右移RRX 带进位的循环右移1位移位操作DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(无符号数)乘2除2,并保留符号位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(无符号数)除2位循环

DestinationRRX:RotateRightExtended位轮换,从CF到MSB都参与操作CF乘法指令ARM处理器的普通乘法指令共6条:32位的运算结果64位运算结果乘法类指令的所有操作数和结果必须为通用寄存器且不能是立即数或者寄存器的移位结果结果寄存器与操作数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*RsSMLAL有符号数乘加RdH:RdL+=Rm*Rs程序状态寄存器处理指令程序状态寄存器处理指令

该指令用于在程序状态寄存器和通用寄存器之间传送数据。包括2条指令:MRS程序状态寄存器到通用寄存器的数据传送;MSR通用寄存器到程序状态寄存器的数据传送。

指令格式:MRS{cond} Rd, CPSR|SPSRMSR{cond} CPSR_field|SPSR_field,操作数加载/存储指令(一)加载/存储指令(load/store)加载/存储指令完成寄存器与存储器之间的数据传送;加载指令将存储器中的数据传送到寄存器;存储指令则将寄存器中的数据传送到存储器。存储器地址由基址寄存器的内容和偏移量来确定,不支持绝对地址寻址方式。例如:LDR R1, [R0] ;[R0]R1 STR R1, [R0,#-4] ;R1[R0-4]加载/存储指令(二)偏移量具有如下3种形式:无符号立即数通用寄存器内容通用寄存器的移位结果例如:STR R1, [R0,#-4] ;R1[R0-4] LDRR0,[R1,R2] ;[R1+R2]R0 LDRR0,[R5,R7,LSR#2] ;[R5+R7逻辑右移2]R0加载/存储指令(三)存储器寻址支持3种方式:寄存器间接寻址,如 LDRR1,[R0]前变址偏移寻址STRR1,[R0,#0x100] ;R1[R0+0x100]STRR0,[R1,R2] ;R0[R1+R2]LDRR0,[R5,R7,LSR#2] ;[R7/4+R5]R0LDRR1,[R0,#4]

!

;[R0+4]->R1,R0=R0+4STRR1,[R0,#0x100]!

;R1[R0+0x100],R0=R0+0x100

加载/存储指令(四)3,后变址偏移索引LDRR1,[R0],#-4 ;[R0]->R1,R0=R0-4STRR0,[R1],-R2 ;R0->[R1],R1=R1-R2LDRR0,[R5],R7,LSL#2 ;[R5]R0,R7*4+R5R50x50x5r10x200基址

寄存器0x200r00x5源寄存器

forSTR偏移量120x20cr10x200原基址

寄存器0x200r00x5源寄存器

forSTR偏移量120x20cr10x20c更新

基址寄存器通过

STRr0,[r1,#12]!来自动更新基址寄存器PreorPostIndexed寻址

Pre-indexed:STRr0,[r1,#12]

Post-indexed:STRr0,[r1],#12单字/无符号字节加载/存储指令(略)格式:LDR|STR{cond}{B}{T} Rd, 寻址方式 B:指无符号字节数据传送,仅传送最低有效位; T:强制处理器为用户模式,用于特权模式下使用用户寄存器;不能与前变址偏移同时

例如

LDRBR5,[R9];传送最低有效字节,其他清零(大端和小端不同结果) STRTR0,[R1,R2]半字/有符号字节加载/存储指令(略)LDR|STR{cond}H|SH|SBRd, 寻址方式;H:无符号半字;SH:有符号半字;(仅LDR)

SB:有符号字节;(仅LDR)例如 LDRHR8,[R3,#2] ;[R3+2]->R8,读取低16位,其他清零 LDRSBR4,[R10,#0xC1] ;[R10+0xC1]->R4,读取字节,有符号扩展到32位(用符号填充) LDRSHR1,[R0,#2]! ;[R0+2]->R1,R0=R0+2;读取半字,有符号扩展到32位 其中:偏移量不支持通用寄存器的移位的格式;半字传送的地址必须是偶数;不能将半字或字节读取到R15;双字加载/存储指令(略)该指令完成相邻寄存器与相邻存储单元之间的64位数据传送。

LDR|STR{cond}DRd, 寻址方式;例如 LDRDR6,[R11,#8] ;[R11+8]->R6,[R11+8+4]->R7 STRDR4,[R10],#-24; R4->[R10],R5->[R10+4],R10=R10-24寄存器为Rd和R(d+1);双字数据传送要求地址必须为8的倍数;这里无符号立即数的范围在256以内;偏移量不支持通用寄存器的移位的格式;多寄存器加载/存储指令(一)该指令完成多个通用寄存器与存储单元之间的数据传送。LDM|STM{cond}寻址方式Rn{!},通用寄存器组{^}符号的含义:寻址方式为:IA、IB、DA、DB、FD、ED、FA、EA;Rn:基址寄存器,不允许为R15(PC);!:指令执行后,刷新基址寄存器Rn“^”:当寄存器列表包含PC且为LDM指令时,同时将SPSR拷贝到CPSR,用于异常返回;当寄存器列表不包含PC,指示指令中所有的寄存器为用户模式下的寄存器LDM/STM操作语法:<LDM|STM>{<cond>}<addressing_mode>Rb{!},<寄存器list>四

种寻址操作:

LDMIA/STMIA IncrementAfter(先操作,后增加)

LDMIB/STMIB IncrementBefore(先增加,后操作)

LDMDA/STMDA DecrementAfter(先操作,后递减)

LDMDB/STMDB DecrementBefore(先递减,后操作)IAr1地址增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxxr10,{r0,r1,r4}STMxxr10,{r0,r1,r4}基址寄存器(Rb)存储器块拷贝可选项“!

”将导致LDM/STM

指令去自动更新基址寄存器后缀为IA,IB时,加上4乘以用于传送的寄存器的数目的值后缀为DA,DB时,减去4乘以用于传送的寄存器的数目的值示例:;r12指向源数据起始地址;r14指向源数据尾地址;r13指向目的数据起始地址loop LDMIA r12!,{r0-r11} ;装载48bytes STMIA r13!,{r0-r11} ;存储them CMP r12,r14 ;checkfortheend BNE loop ;loopuntildone此循环传送48bytes占用了31周期时钟为33MHz时传输速率超过50Mbytes/sec存储器增加r13r14r12多寄存器加载/存储指令(二)例如:STMFDR13!,{R0,R4-R7,LR};寄存器进栈LDMFDR13!,{R0,R4-R7,PC};寄存器返回注:基址寄存器可以出现在寄存器列表中,但要避免和写回操作“!”同时使用。R15可以出现在LDM指令的寄存器列表中;但要避免出现在STM指令的寄存器列表中,此时,可以使用R14(用以保存返回地址)。

LDMFDsp!,{r4-r7,pc}100FF1234AOBE80341010123484209753r41r514544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存储器顶SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆栈操作通过块传送指令来完成:STMFD (Push) 块存储-FullDescendingstack[STMDB]LDMFD

(Pop) 块装载-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}SWAP指令(一)(略)该指令在寄存器和存储器之间进行单字或无符号字节数据的交换

SWP{cond}{B}Rd,Rm,[Rn]符号的含义:Rd:存储器的值加载到该寄存器;Rm:该寄存器的值存储到存储器;Rn:指向存储器地址的存储器;例如SWPR1,R2,[R3];[R3]->R1且R2->[R3];R15不能用于该指令的任何寄存器

SWAP指令(二)(略)例如:信号量的应用

I2C_SEMEQU0x08000000 ;定义信号量

…I2C_SEM_WAIT LDRR0,=I2C_SEM ; SWPR1,R1,[R0] ;读信号量

CMPR1,#0 ;判断是否有信号

BEQI2C_SEM_WAIT ;没有则等待

…PLD指令(Cache预加载)(略)该指令指示存储系统从指定的存储器地址预先加载到Cache,从而加速存储器的访问。

PLD[Rn{offset}] Rn:基址寄存器,offset:偏移量。例如

PLD[R2] PLD[R15,#280] PLD[R4,R8,LSL#2]协处理器指令(一)(略)协处理器指令的功能协处理器内部寄存器的数据处理;协处理器寄存器与ARM寄存器间的数据传送;协处理器寄存器与存储器间的数据传送;协处理器编号分配15用于系统控制14测试控制器13:8保留7:4用户3:0保留协处理器指令(二)(略)指令格式协处理器内部寄存器的数据处理;CDP{cond}cp,opcode_1,CRd,CRn,CRm{,opcode_2}CDP2cp,opcode_1,CRd,CRn,CRm{,opcode_2}例如:CDPEQp2,5,C1,C2,C3,2 ;完成操作5协处理器寄存器与ARM寄存器间的数据传送;MRC/MCR{cond}cp,opcode_1,Rd,CRn,CRm{,opcode_2}MRC2/MCR2cp,opcode_1,Rd,CRn,CRm{,opcode_2}MRRC/MCRR{cond}cp,opcode_1,Rd,Rn,CRm协处理器指令(三)(略)协处理器寄存器与存储器间的数据传送LDC|STC{cond}{L}cp,CRd,[Rn,#offset]{!}LDC|STC{cond}{L}cp,CRd,[Rn],#offset

LDC2|STC2cp,CRd,[Rn,#offset]{!}LDC2|STC2cp,CRd,[Rn],#offsetL:指明长整数;异常产生指令SWI{cond}24位数

SWI产生软件中断异常,操作系统在异常处理程序中提供相应的系统调用(向量地址0x08),24位数指明系统调用的类型。BKPT{cond}16位数

BKPT产生预取中止异常,可用于程序的调试。例如:SWI0x123456; BKPT0Thumb指令集(一)Thumb指令集的特点16位指令长度(适于16位的存储器,成本低)

ARM指令集的一个子集数据处理指令的操作数和指令寻址地址仍是32位的较高的代码密度和较低的功耗

执行效率相对ARM较低除条件跳转指令外均为无条件执行Thumb指令集(二)Thumb指令集包括:跳转指令;数据处理指令;单寄存器加载/存储指令;多寄存器加载/存储指令;异常产生指令。Thumb指令集(三)Thumb指令访问的寄存器通用寄存器R0~R7R13(SP)、R14(LR)、R15(PC)。可以有限制地访问R8~R12、CPSR。ARM到Thumb的状态切换途径:执行带状态切换(X)的跳转指令;异常返回,使用特殊的数据处理(MOVS,SUBS)和多寄存器加载(LDM)指令。Thumb指令集(四)Thumb到ARM的状态切换途径:带状态切换(X)的跳转指令;进入异常;注:Thumb指令系统需要含有ARM代码,例如从ARM到Thumb的状态切换指令。

Thumb指令集(五)AREAHelloW,CODE,READONLYSWI_WriteC EQU&0 SWI_Exit EQU&11 ENTRY

CODE32

ADRR0,START

BXR0

CODE16START ADRr1,TEXTLOOP LDRBr0,[r1] ADDr1,r1,#1 AREAHelloW,CODE,READONLYSWI_WriteC EQU&0 ;假定参数0表示显示输出 SWI_Exit EQU&11 ;参数11表示从SWI返回 ENTRYSTART ADRr1,TEXTLOOP LDRBr0,[r1],#1Thumb指令集(六)

CMPr0,#0 BEQDONE SWISWI_WriteC BLOOPDONE SWISWI_Exit

ALIGN

TEXT DATA ;在代码段使用数据 DCB “HelloWorld”,&0a,&0d,&00 END

CMPr0,#0

SWINESWI_WriteC BNELOOP SWI SWI_Exit

TEXT DCB “HelloWorld”,&0a,&0d,0; END子程序调用…BLfunction…Function ;子程序….….MOVPC,LR ;子程序返回条件执行Function ;子程序,求最大公约CMPR0,R1 ;比较a和bSUBGTR0,R0,R1 ;if(a>b)a=a-bSUBLTR1,R1,R0 ;if(a<b)b=b-aBNEfunction ;if(a!=b)返回MOVPC,LR ;返回条件判断条件判断:CMPR0,#0 ;判断R0是否等于0CMPNER1,#1 ;如果R0!=0,判断R1?1ADDEQR2,R3,R4;R0=0或R1=1时,R2=R3+R4循环MOVR0,#loopcountLoop….SUBSR0,R0,#1BNEloop饱和运算(一)0x7FFFFFFF+1将导致正数变为负数0x80000000–1将导致负数变为正数饱和运算指令将识别上述事件,从而调整其结果为最大正数或最小负数。(补码:原码取反加1)0x00x7FFFFFFF0x80000000-ve+ve-最大正数-最小负数饱和运算(二)对于无符号饱和运算,如果整个结果将是负值,那么返回的结果是0ARM宏汇编与编程基础ARM宏汇编伪操作对源程序进行汇编期间处理,而不是直接由计算机执行的指令伪指令(宏指令)并非真正的指令,而是一段独立的程序代码;在源程序被汇编时,每个宏被展开,用宏定义体取代宏指令。也是通过伪操作定义的。ARM宏汇编-寄存器定义ARM宏汇编-状态、浮点、协处理器定义定义的程序状态寄存器名cpsr和CPSRspsr和SPSR定义的浮点寄存器名f0-f7F0-F7定义的协处理器名p0-p15c0-c15ARM宏汇编-内置变量定义ARM宏汇编-内置变量举例内置变量不能用SETA、SETL、SETS等指示词来设置,只能用字符或条件表达式来设置,例IF{ARCHITECTURE}=“4T”……ARM宏汇编-符号定义伪操作ARM宏汇编-全局变量定义(一)GBLA-声明一个全局算术变量,并初始化为0GBLL-声明一个全局逻辑变量,并初始化为{FALSE}GBLS-声明一个全局串变量,并初始化为空串“”ARM宏汇编-全局变量定义(二)全局变量,例:GBLAobjectsize ;声明一个全局算术变量objectsizeSETA0xff ;赋值SPACEobjectsize ;引用该变量GBLLstatusB ;声明一个全局逻辑变量statusBSETL{TRUE} ;赋值ARM宏汇编-局部变量定义定义类似全局变量作用范围为包含该局部变量的宏代码的一个实例。例:LCLSerrerrSETS“errorno:”ARM宏汇编-变量赋值伪操作SETA伪操作给一个算术变量赋值SETL伪操作给一个逻辑变量赋值SETS伪操作给一个串变量赋值ARM宏汇编-数据定义伪操作ARM宏汇编-MAP及FIELD类似C中结构体:MAP 8,R9 ;内存表首地址=8+R9Consta FIELD 4 ;consta长为4字节,相对位置为0Constb FIELD 4 ;constb长为4字节,相对位置为4X FIELD 8 ;X长为8字节,相对位置为8Y FIELD 8 ;Y长为8字节,相对位置为16String FIELD 256 ;string长256字节,相对位置为24ARM宏汇编-SPACEDatastruct SPACE 200 ;分配200字节的内存单元,并将内存单元内容初始化为0ARM宏汇编-DCBNullstring DCB “Nullstring”,0 ;构造一个以NULL结尾的字符串ARM宏汇编-汇编控制伪操作IF,ELSE及ENDIFWHILE及WENDMACRO及MENDMEXITARM宏汇编-IF,ELSE及ENDIF例:IFVersion=“4.0”… ;指令及伪指令ELSE… ;指令及伪指令ENDIFARM宏汇编-WHILE及WEND例:CountSETA1 ;循环计数变量,初识1WHILEcount<=4 ;由count控制循环次数CountSETAcount+1 ;count+=1……WENDARM宏汇编-MACRO,MEND及MEXIT(一)语法MACRO{$label}macroname{$p1…}…MENDARM宏汇编-MACRO,MEND及MEXIT(二)例MACRO$labelmac1 $p1,$p2IFcondition1BL$p1MEXITELSEBL$p2ENDIFWENDARM宏汇编-其他伪操作1.AREA:AREA段名属性,…… AREA用于定义一个代码段、数据段或者特定属性的段。属性部分表示该代码段/数据段的相关属性,多个属性可以用“,”分隔。其他伪指令Ⅰ常见属性如下:

DATA:定义数据段。

CODE:定义代码段。READONLY:表示本段为只读。READWRITE:表示本段可读写。一个汇编程序至少应该包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。例如:AREA test,CODE,READONLYAREA||.text||,CODE,READONLY2.

CODE16、CODE32:CODE16/CODE32CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。如果在汇编源代码中同时包含Thumb和ARM指令时,可以用“CODE32”通知编译器其后的指令序列为32位的ARM指令,用“CODE16”伪指令通知编译器其后的指令序列为16位的Thumb指令。在使用ARM指令和Thumb指令混合编程的代码里,这两条伪指令后面的代码类型是不同的,但它们并不能对处理器进行状态的切换。例如:CODE32 ;32位的ARM指令AREA ||.text||,CODE,READONLY……LDR R0,=0x8500 ;BX R0 ;程序跳转,并将处理器切换到Thumb状态……CODE16 ;16位的Thumb指令ADD R3,R3,1

END ;源文件结束3.

ENTRY:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个。下面的代码使用了ENTRY:AREAsubrout,CODE,READONLYENTRY;markfirstinstructionstartMOVr0,#10MOVr1,#3BLdoadd

stopMOVr0,#0x18LDRr1,=0x20026SWI0x123456;ARMsemihostingSWI

doaddADDr0,r0,r1;SubroutinecodeMOVpc,lr;Returnfromsubroutine.END;Markendoffile4.

END:说明:“END”告诉编译器已经到了源程序的结尾。例如:AREA constdata,DATA,READONLY……END ;结尾5.

EQU:名称EQU 表达式[,类型]EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的#define,可用“*”代替EQU。如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:CODE16/CODE32/DATA例如:num1 EQU 1234 ;定义num1为1234addr5 EQU str1+0x50 ;d1 EQU 0x2400,CODE32;定义d1的值为0x2400,且该处为32位的ARM指令。6.EXPORT:EXPORT标号[,WEAK]EXPORT在程序中声明一个全局标号,其他文件中的代码可以引用该标号。用户也可以用GLOBAL代替EXPORT。[,WEAK]可选项声明其他文件有同名的标号,则该同名标号优先于该标号被引用。例如:AREA ||.text||,CODE,READONLYmain PROC …… ENDP EXPORTmain ;声明一个可全局引用的函数mainEND 7.

IMPORT:IMPORT标号[,WEAK]IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。[,WEAK]选项表示如果所有的源文件都没有找到这个标号的定义,编译器也不会提示错误信息。编译器在多数情况下将该标号置为0,如果这个标号被B或BL指令引用,则将B或BL指令替换为NOP操作。例如:AREA mycode,CODE,READONLYIMPORT _printf END8.

EXTERN:EXTERN标号[,WEAK]说明:EXTERN告诉编译器所使用的标号要在当前源文件中引用,但该标号是在其他的源文件中定义的。与IMPORT不同的是,如果当前源文件实际上没有引用该标号,该标号就不会被加入到当前文件的符号表中。[,WEAK]选项意义同IMPORT。例如:AREA ||.text||,CODE,READONLYEXTERN_printf;告诉编译器当前文件要引用标号 ;如果找不到,则不提示错误END 9.

RN:

名称 RN表达式

说明:RN用于给一个寄存器定义一个别名,以便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。10.

GET/INCLUDE:GET 文件名

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

ARM宏汇编-伪指令(二)四条伪指令ADR-小范围地址读取ADRL-中等范围地址读取LDR-大范围地址读取NOP-空操作ARM宏汇编-伪指令-ADRADR将基于PC的地址值或基于寄存器的地址值读取到寄存器中。地址值不是字对齐时,取值范围-255~255;是字对齐时,取值范围-1020~1020例start MOVR0,#10ADR r4,start ;将start地址赋给r4,此时start地址为PC-0xC,故相当于SUBr4,PC,#12ARM宏汇编-伪指令-ADRL当地址值不是字对齐时,其取值范围为-64KB~64KB;当地址值是字对齐时,其取值范围为-256KB~256KB例Start MOVR0,#10ADRL R4,start+60000 ;将start+60000地址赋给R4ARM宏汇编-伪指令-LDR将一个32位常数或一个地址值读取到寄存器中。例LDR R1, =0XFF0 ;MOVR1,0XFF0LDR R1, =0xFFE ;LDR R1, =ADDR1 ;注意等号LDR伪指令如果可用立即数表达:如:LDRR0,=0X400,则直接翻译成LDRR0,#0X400如果是大常数,不可用立即数表达:如:LDRR0,=0X55555555,则翻译成LDRR0,[PC,#Imm_12]…DCD0X55555555定义此常数,然后从此地址中读取数据ARM宏汇编-Thumb伪指令Thumb伪指令

ADRregister, expr

LDRregister, =[expr|label-expr]NOP:空操作ARM与C语言的混和编程(一)ARM汇编语言与C/C++的混合编程ARM汇编与C/C++的混合编程要遵循ATPCS规则(ARM-ThumbProcedureCallStandard)混合编程方式嵌入汇编格式:__asm{…}在汇编程序与C/C++的程序间进行变量的互访;汇编程序与与C/C++程序间的相互调用。

ARM与C语言的混和编程(二)

IMPORTmainAREAInit,CODE,READONLY ENTRYSTART LDRR1,=0x08000000 STRB,R0,[R1],#1 … BLmainENDvoidmain(){ do_task(); … return;}从汇编跳转到c程序 程序的初始化部分(如外设等)用汇编语言编写,然后,执行跳转指令,转移到c程序的入口进行执行ARM与C语言的混和编程(三)externvoidmystrcpy(char*d,char*r)

温馨提示

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

评论

0/150

提交评论