《嵌入式系统》课件-第3章-ARM指令系统及程序设计基础_第1页
《嵌入式系统》课件-第3章-ARM指令系统及程序设计基础_第2页
《嵌入式系统》课件-第3章-ARM指令系统及程序设计基础_第3页
《嵌入式系统》课件-第3章-ARM指令系统及程序设计基础_第4页
《嵌入式系统》课件-第3章-ARM指令系统及程序设计基础_第5页
已阅读5页,还剩156页未读 继续免费阅读

下载本文档

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

文档简介

1、杨词慧 ,2015.4,嵌入式系统,ARM指令系统及程序设计基础,第3章 ARM指令系统及程序设计基础,3.1 ARM寻址方式 3.2 ARM指令集 3.3 Thumb指令集 3.4 ARM程序设计基础,寻址方式 处理器根据指令中给出的地址信息寻找物理地址的方式。 寻找操作数或操作数地址的方式。,3.1 ARM寻址方式,寻址方式(续),3.1 ARM寻址方式,ARM寻址方式,立即寻址 寄存器寻址 寄存器间接寻址 基址变址寻址 多寄存器寻址 寄存器移位寻址 相对寻址 堆栈寻址,立即寻址 也叫立即数寻址,操作数本身在指令中给出,该操作数被称为立即数。 例如:ADDR0, R0, #1; R0 R0

2、+1 立即数须以“#”为前缀,对于十六进制表示的立即数,还需在“#”后加上“0 x”或“ R0 R1+R2 寄存器间接寻址 以寄存器的值作为操作数地址。例如:ADDR0, R1, R2; R0 R1+R2,3.1 ARM寻址方式,基址变址寻址 将寄存器的内容与指令中给出的地址偏移量相加,得到操作数的地址。 包括 基址加偏移量寻址方式 基址加索引寻址方式,3.1 ARM寻址方式,基址变址寻址(续) 基址加偏移量寻址方式 将寄存器内容与指令中给出的地址偏移量相加,得到操作数的有效地址。如:LDRR0, R1, #4; R0 R1+4 前变址:基址加变址作为操作数地址。后变址:基址作为操作数的地址,

3、传送后自动更新基址寄存器的值。,3.1 ARM寻址方式,基址变址寻址(续),3.1 ARM寻址方式,STR R0,R1, #12 ; R1+12R0,前变址,基址变址寻址(续),3.1 ARM寻址方式,STR R0,R1, #12; R1R0, R1R1+12,后变址,基址变址寻址(续) 基址加索引寻址方式 将基址寄存器的值与索引寄存器的值相加,形成操作数的有效地址。例如: LDRR0, R1, R2 ; R0 R1+R2,3.1 ARM寻址方式,多寄存器寻址 一次完成多个(最多16)寄存器值的传送 例如:LDMIA R0, R1, R2, R4; R1 R0; R2 R0+4; R4 R0+

4、8,3.1 ARM寻址方式,多寄存器寻址(续),3.1 ARM寻址方式,IA,r1,地址 增加,r4,r0,r1,r4,r0,r1,r4,r0,r1,r4,r0,r10,IB,DA,DB,STMxx r10, r0,r1,r4,基址寄存器 (Rn),地址递减,指针最后位置,地址递增,指针最后位置,寄存器移位寻址 操作数为寄存器中数做相应的移位而得到 例如:ADDR0, R1, R2, LSL #3; R0 R1+8R2,3.1 ARM寻址方式,寄存器移位寻址(续) ARM中的移位或循环移位操作 LSL:逻辑左移(Logical Shift Left) LSR:逻辑右移(Logical Shif

5、t Right),3.1 ARM寻址方式,0,0,寄存器移位寻址(续) ASR:算术右移(Arithmetic Shift Right)。移位过程中保持符号位不变,若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。,3.1 ARM寻址方式,寄存器移位寻址(续) ROR:循环右移(Rotate Right)。从字的最低端移出的位依次填入字的高端空出的位。,3.1 ARM寻址方式,寄存器移位寻址(续) RRX:扩展的循环右移(Rotate Right Extended )。操作数向右移一位,左侧空位由状态寄存器C位填充。 当移位的类型为RRX时,无需指定移位的位数

6、,其它的则须指定移位的位数。,3.1 ARM寻址方式,相对寻址 以PC当前值作为基地址,指令中的地址标号作为位移量,两者相加后得到操作数的有效地址。例如:BLNEXT ; 跳转至子程序 NEXTNEXTMOVPC, LR ; 从子程序返回,3.1 ARM寻址方式,堆栈寻址 堆栈:按先进后出(FILO)的方式工作,使用堆栈指针(Stack Pointer, SP) 指示当前操作位置。 根据栈指针的指向位置可将堆栈分为 满堆栈:SP指向最后压入堆栈的数据。 空堆栈:SP指向下个将放入数据空位置,3.1 ARM寻址方式,堆栈寻址,3.1 ARM寻址方式,来源:王亮的PPT,堆栈寻址(续) 根据堆栈的

7、生成方式可将堆栈分为 递增堆栈(Ascending Stack):堆栈由低地址向高地址生成。 递减堆栈(Descending Stack) :由高地址向低地址生成。,3.1 ARM寻址方式,堆栈寻址(续),3.1 ARM寻址方式,来源:王亮的PPT,3.1 ARM寻址方式,堆栈寻址(续) ARM支持四种类型堆栈工作方式 满递增堆栈:SP指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈:SP指向最后压入的数据,且由高地址向低地址生产。,3.1 ARM寻址方式,堆栈寻址(续),3.1 ARM寻址方式,来源:王亮的PPT,堆栈寻址(续) 堆栈工作方式 空递增堆栈:SP指向下个将放入数据的空位

8、置,且由低地址向高地址生成。 空递减堆栈:SP指向下个将要放入数据的空位置,且由高地址向低地址生成。,3.1 ARM寻址方式,堆栈寻址(续),3.1 ARM寻址方式,来源:王亮的PPT,ARM指令集分类 加载/存储指令 数据处理指令 分支指令 状态寄存器访问指令 异常/中断指令 协处理器指令,3.2 ARM指令集,ARM指令的特点 所有指令都是32bit; 大多数指令都在单周期内完成; 所有指令都可以条件执行; load/store体系结构; 指令集可以通过协处理器扩展。,3.2 ARM指令集,ARM指令的格式,3.2 ARM指令集,s , , ,Cond,xxx,Opcode,S,Rn,Rd

9、,Operand2,0,11,12,15,16,19,20,21,24,25,27,28,31,7,8,条件码,指令操作码,操作是否影响CPSR,第1操作数,目标寄存器,第2操作数,3.2 ARM指令集,ARM指令集1, Datasheet P39,3.2 ARM指令集,ARM指令集2,ARM指令的条件执行 所有ARM指令都可包含一个可选的条件码,只有当CPSR中条件标志位满足指定条件时,指令才会被执行。否则以NOP指令通过流水线。,3.2 ARM指令集,3.2 ARM指令集,3.2 ARM指令集,加载/存储指令 Load:将内存中数据装载到寄存器Store:将寄存器中的数据存入内存,3.2

10、ARM指令集,内存,寄存器,Load,Store,加载/存储指令(续) 单寄存器传输指令 B Rd, addressing1 SB | H | SHRd, addressing2 B Rd, LABEL,3.2 ARM指令集,加载/存储指令(续) 单寄存器传输指令(续),3.2 ARM指令集,加载/存储指令(续) 单寄存器传输指令 LDR B|SB|H|SH 目的寄存器, STR B|SB|H|SH 源寄存器, ,3.2 ARM指令集,加载/存储指令(续) 单寄存器传输指令(续) LDR/STR:读/写一个32bit字到/从一个32位寄存器,要求读/写地址字对齐。 LDRB:内存8bit字节3

11、2bit寄存器;不要求地址对齐,寄存器高24位清零。 STRB:寄存器低8位内存的某个地址;不要求地址对齐。,3.2 ARM指令集,加载/存储指令(续) 单寄存器传输指令 LDRH:16bit半字 32bit寄存器;要求地址半字对齐,寄存器的高16bit清零。 STRH:寄存器低16bit内存;要求地址半字对齐。,3.2 ARM指令集,加载/存储指令(续) 单寄存器传输指令 LDRSH:有符号16bit半字32bit寄存器中;要求地址半字对齐,寄存器高16bit根据符号位扩展。 LDRSB:有符号8bit字节32bit寄存器中;不要求地址对齐,寄存器高24bit根据符号位扩展。,3.2 ARM

12、指令集,加载/存储指令(续),3.2 ARM指令集,单寄存器传输指令助词符,加载/存储指令(续),3.2 ARM指令集,LDR/STR指令的变址模式,3.2 ARM指令集,Rn, # +-,0 0 0 0 0 0 0 0 0 0,Rm,0,3,4,11,方式2:Rm 例子:LDR R0, R1, R2,0,11,#immed_12,方式1:#immed_12(取值范围0 0 xfff) 例子:LDR R0, R1, #+0 xfff,shift,Rm,0,3,4,11,#immed_5,6,7,方式3:Rm LSL #immed_5(取值范围0-31) 例子:LDR R0, R1, R2 LS

13、L #41,0,5,0/1 : STR/LDR,0/1 : 无/有(!),0/1 : 后变址/前变址,0/1 : 字/无符号字节,cond,Rn,Rd,第 2 操作数,0,7,8,11,12,15,16,19,20,22,01,27,28,31,23,24,U,B,W,L,21,26,P,I,25,0/1 : 减/加(第2操作数),0/1 : 立即数(方式1)/寄存器(方式2,3), Datasheet P193,加载/存储指令(续) 多寄存器传输指令 Rn!, LDM / STM:从由基址寄存器指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据。,3.2 ARM指令集, 对于LD

14、M操作,如恢复的寄存器中含有PC(R15)寄存器,则指令执行的同时CPU自动将SPSR拷贝到CPSR中,例:LDMFD R0-R12, LR, PC 数据的传送发生在User用户模式下的寄存器,而非当前模式寄存器,例如:LDMDB SP, R0 - LR,3.2 ARM指令集,加载/存储指令(续) 多寄存器传输指令 例如:STMIA R0!, R1-R5;以R0为地址指针,将R1-R5保存到内存,指针向上移动,3.2 ARM指令集,加载/存储指令(续),3.2 ARM指令集,IA 每次传送后地址加1 IB 每次传送前地址加1 DA 每次传送后地址减1 DB 每次传送前地址减1 FA 满递增堆栈

15、 FD 满递减堆栈 EA 空递增堆栈 ED 空递减堆栈,寻址模式,加载/存储指令(续),3.2 ARM指令集,多寄存器传输指令的寻址模式,加载/存储指令(续),3.2 ARM指令集,栈操作寻址方式,加载/存储指令(续) 交换指令 SWP B Rd, Rm, Rn SWP:字交换;SWPB:字节交换 Temp Rn, Rn Rm, Rd Temp, 例如:SWP R1, R2, R3; R1R3,R3 R2SWP R1, R1, R2; R1与R2内容互换,3.2 ARM指令集,数据处理指令,3.2 ARM指令集,3.2 ARM指令集,ADD R0, R1, #0 xff,ADD R0, R1,

16、 R2, LSL R3,cond,S,Rn,Rd,Operand2,0,7,8,11,12,15,16,19,20,opcode,21,24,00X,25,27,28,31,#immed_8,#rot,0,7,8,11,方式1:#immed,方式2:Rm,方式3:Rm LSL Rs,方式4:Rm LSL #immed_5 (#immed_5取值范围0-31),ADD R0, R1, R1, LSL #41,ADD R0, R1, R2, Datasheet P156,数据处理指令(续) 数据传送指令 数据传送指令MOV cond SRd, Operand例如:MOVR1, R0MOVEQ PC

17、, R14 ; 将R14值传到PC,3.2 ARM指令集,数据处理指令(续) 数据传送指令(续) 数据取反传送指令MVN cond SRd, Operand例如:MVN R1, #2; 将立即数2取反送至R1为什么有MVN?,3.2 ARM指令集,数据处理指令(续) 算术运算指令 ADD、ADCADD|ADC cond S Rd, Oper1, Oper2,3.2 ARM指令集,数据处理指令(续) 例如:ADDSR0, R4, R8; 加低端的字ADCSR1, R5, R9; 带进位加第二字ADCSR2, R6, R10; 带进位加第三字ADCR3, R7, R11; 带进位加第四字,3.2

18、ARM指令集,数据处理指令(续) 算术运算指令(续) SUB:减法指令SUB cond SRd, Oper1, Oper2 SBC:带借位减法指令SBC cond SRd, Oper1, Oper2例:SBCS R0, R1, R2 ; R0=R1R2C,3.2 ARM指令集,数据处理指令(续) 算术运算指令(续) RSB:反向减法指令RSB cond SRd, Oper1, Oper2操作数2减去操作数1,例如:RSBR0, R1, R2; R0 = R2 R1 RSC:带借位的逆向减法指令RSC cond SRd, Oper1, Oper2,3.2 ARM指令集,数据处理指令(续) 逻辑运

19、算指令 AND:与AND cond SRd, Oper1, Oper2 ORR:或ORR cond SRd, Oper1, Oper2 EOR:异或EOR cond SRd, Oper1, Oper2,3.2 ARM指令集,数据处理指令(续) 比较指令 CMPCMP condOperand1, Operand2,3.2 ARM指令集,数据处理指令(续) 比较指令(续) CMN:反值比较CMN condOperand1, Operand2将第一个数与第二个数的反值进行比较,相当于完成两个数相加。例如:CMNR1, R0 ; R1+R0,并设置CPSR,3.2 ARM指令集,数据处理指令(续) 测

20、试指令 TSTTST condOperand1, Operand2 把两个操作数按位进行与运算,根据结果更新CPSR。,3.2 ARM指令集,数据处理指令(续) 测试指令(续) TEQTEQ condOperand1, Operand2把两个操作数按位进行异或运算,根据结果更新CPSR,3.2 ARM指令集,数据处理指令(续) 乘法指令 MULMUL cond SRd, Oper1, Oper2RdOperand1Operand2。例如:MUL R0, R1, R2; R0 =R1R2,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) MLAMLA cond S Rd,Oper1,Op

21、er2,Oper3 RdOperand1Operand2+Operand3例如:MLA R0, R1, R2, R3; R0 = R1R2+R3,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) UMULL:64位无符号数乘法指令UMULL cond SRd_L, Rd_H, Operand1, Operand2Rd_H:Rd_L Operand1Operand2,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) 例如:UMULLR0, R1, R2, R3; R0 = (R2R3) 的低32位; R1 = (R2R3) 的高32位,3.2 ARM指令集,数据处理指令(续) 乘

22、法指令(续) UMLAL: 64位无符号数乘加指令UMLAL cond SRd_L, Rd_H, Operand1, Operand2Rd_H:Rd_L+= Operand1Operand2,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) 例如:UMLAL R0, R1, R2, R3; R0 = (R2R3)的低32位+R0; R1 = (R2R3)的高32位+R1,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) SMULL:64位有符号数乘法指令SMULL cond SRn_L, Rn_H, Operand1, Operand2Rd_H:Rd_L Operand1Ope

23、rand2,3.2 ARM指令集,数据处理指令(续) 乘法指令(续) SMLAL: 64位有符号数乘加指令SMLAL cond SRn_L, Rn_H, Operand1, Operand2Rd_H:Rd_L+= Operand1Operand2,3.2 ARM指令集,分支指令 B (分支指令)和 BL (带链接分支指令) B cond LABEL BL cond LABEL 允许向前或向后跳转最高32MB。 BL:带返回的分支指令,用于调用一个将其返回地址存入链接寄存器的函数。,3.2 ARM指令集,分支指令,3.2 ARM指令集,B 和 BL的指令编码,分支指令(续) B 和 BL (续)

24、,3.2 ARM指令集,例如: BLSUBPRG SUBPRG ; MOVPC, LR; 返回,分支指令(续) BX (分支并可选地交换指令集) BLX(带链接分支并可选地交换指令集) BX cond Rm BLX cond LABEL | Rm Rm:转移地址,bit0为0时,目标地址处为ARM指令,否则为Thumb指令。,3.2 ARM指令集,分支指令(续) BX 和 BLX指令执行与B和BL指令相同的分支操作,并可从ARM指令集切换到THUMB指令集。,3.2 ARM指令集,分支指令(续) 长跳转 通过向PC寄存器中写目标地址值,可实现在4GB地址空间中进行任意跳转。 例如:MOVLR,

25、 PC; 保存返回地址MOVR15, #0 x00110000 ; 无条件转向0 x110000,3.2 ARM指令集,状态寄存器访问指令 MRS MRS Rd, 将状态寄存器的内容传送到通用寄存器中。例如:MRSR3, CPSR; CPSRR3,3.2 ARM指令集,状态寄存器访问指令(续) MSR MSR _, Rm MSR _,#,3.2 ARM指令集,状态寄存器访问指令(续) 表示下列情况之一:c:控制域,即PSR7:0 x:扩展域,即PSR15:8 s:状态域,即PSR23:16 f:标志域,即PSR32:24 CPSR|SPSR 通用寄存器。例如:MSR CPSR_F, #设置所有

26、标志位,3.2 ARM指令集,异常/中断指令(续) SWI SWI 产生SWI异常中断,以实现在用户模式下调用操作系统的监控功能程序 。它将处理器置于管理 (SVC) 模式。例如:SWI 0 x01 ;调用编号为01的系统例程,3.2 ARM指令集,异常/中断指令(续) BKPT BKPT 产生软件断点中断,可用于程序调试。 例如BKPT0 xF010,3.2 ARM指令集,协处理器指令 CDP CDP , , CRd, CRn, CRm , 编号为CP#的协处理器接受指令并执行。具体操作由Cop1和Cop2定义,CRn和CRm为源操作数,结果CRd,3.2 ARM指令集,协处理器指令(续)

27、CDP (续) 例如:CDP P6, 2, C5, C10, C3, 16; 激活协处理器P6的操作,操作码1和操作码2值分别为2和16,目标寄存器为C5,源操作数寄存器为C10和C3,3.2 ARM指令集,协处理器指令(续) MRC和MCR MRC | MCR , , CRd, CRn, CRm , 在ARM与协处理器寄存器间传数据。 MRC:ARM寄存器协处理器寄存器MCR:协处理器寄存器ARM寄存器,3.2 ARM指令集,协处理器指令(续) MRC和MCR 例如:MCRP3, 3, R0, C4, C5, 6; ARM处理器R0协处理器P3的寄存器C4和C5,3.2 ARM指令集,协处理

28、器指令(续) LDC和STC 在协处理器寄存器与存储器间传送数据 LDC:协处理器寄存器存储器 STC:存储器协处理器寄存器,3.2 ARM指令集,协处理器指令(续) LDC和STC 前变址格式LDC | STC L , CRd, Rn, ! 后变址格式LDC | STC L , CRd, Rn, ,3.2 ARM指令集,协处理器指令(续) LDC和STC LDCP3, C4, R0;将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中 STC P3, C4, R0 ;将P3的C4 中的字数据传至ARM的R0所指向的存储器,3.2 ARM指令集,Thumb指令集的

29、特点 是ARM指令集压缩形式的子集,所有Thumb指令均有对应的ARM指令。 采用16位二进制编码,代码密度小。 执行Thumb指令时,先动态解压缩,然后作为标准的ARM指令执行。 如何区分指令流取决于CPSR的位T。,3.3 Thumb指令集,Thumb指令集的特点(续) 大多Thumb数据处理指令采用2地址格式。 移位操作变成单独指令。 没有协处理器指令、单寄存器交换指令、乘加指令、64位乘法指令及程序寄存器处理指令。 仅分支指令B有条件执行功能。,3.3 Thumb指令集,Thumb指令集的特点(续),3.3 Thumb指令集,0,15,31,0,ADDS r2,r2,#1,ADD r2

30、,#1,32-bit ARM 指令,16-bit Thumb 指令,Thumb状态切换 ARM状态进入Thumb状态 执行带状态切换的转移指令BX。例如:BX R0 ; 若R0最低位为1,则转Thumb状态,3.3 Thumb指令集,Thumb状态切换 ARM状态进入Thumb状态(续) 异常返回。通常用于返回到进入异常前所执行的指令流,而不是特地用于切换到Thumb模式。适用于异常前执行的是Thumb指令。,3.3 Thumb指令集,Thumb状态切换(续) Thumb 状态进入ARM状态 执行BX指令。 利用异常进入ARM指令流。,3.3 Thumb指令集,Thumb指令寄存器的使用 对R

31、0R7具有全部访问权限。 R8R12的访问受到限制,只能通过MOV、ADD和CMP访问。 在每一种特权模式下都有一组SP、LR和SPSR,分别对应ARM状态的R13、R14和R15。,3.3 Thumb指令集,Thumb指令与ARM指令的相似点 Load/Store结构。 支持8位字节、16位半字和32位字数据类型 半字以2字节边界对准,字以4字节边界对准。,3.3 Thumb指令集,Thumb指令集与ARM指令集差异点 跳转指令:条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。 数据处理指令:对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器。 单寄存器加载和存储指令:只能访

32、问R0R7。,3.3 Thumb指令集,Thumb指令集与ARM指令集差异点(续) PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0R7外,PUSH指令还可存储R14,POP指令可加载程序指令PC。 大多数Thumb指令是无条件执行的,所有ARM指令都是可条件执行的。 由于采用高密度编码,Thumb指令格式没有ARM指令格式规则。,3.3 Thumb指令集,存储器访问指令 单寄存器读取和存储指令 LDR | STR ARM单寄存器传送指令的一个子集,和ARM有相同的指令格式。 多寄存器读取和存储指令。和ARM有相同的指令格式。,3.3 Thumb指令集,堆栈指令 POP ,

33、 PC PUSH , LR Reglist:寄存器列表,用逗号隔开 Thumb堆栈是满递减堆栈,寄存器以数字顺序存储在堆栈中,最低数字的寄存器其地址最低。,3.3 Thumb指令集,Thumb分支指令 B 指令目标为Thumb代码 B 偏移量左移1位,3.3 Thumb指令集,Thumb分支指令(续) B 指令 B ,3.3 Thumb指令集,Thumb分支指令(续) BL 指令目标为Thumb代码BL ,3.3 Thumb指令集,Thumb分支指令(续) BL 指令 (H=0) LR PC+(偏移量左移12位后符号扩展至32位); (H=1) PC LR+(偏移量左移1),同时把下一条指令的

34、地址写入LR中。,3.3 Thumb指令集,Thumb分支指令(续) BX 指令目标为Thumb代码或ARM代码BX Rm,3.3 Thumb指令集,Thumb分支指令(续) BLX 指令 格式1:BLX 目标为ARM代码,3.3 Thumb指令集,Thumb分支指令(续) BLX 指令 格式2:BLX Rm标为ARM或Thumb代码 如果Rm的位0清0,或使用格式1,则切换到ARM状态。,3.3 Thumb指令集,移位和循环移位操作指令 ASR,LSL,LSR和ROR和运算 格式1: Rd, Rn, Rd:目的寄存器,须在R0R7范围内; Rn:源寄存器,须在R0R7范围内。,3.3 Thu

35、mb指令集,移位和循环移位操作指令(续) 格式2: Rd, Rs Rd:须在R0R7范围内; Rs:包含移位量的寄存器,R0R7范围,3.3 Thumb指令集,数据处理指令 对通用寄存器进行操作。 多数情况下,操作结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。 例如:ADC , ADD , , #ADD , #,3.3 Thumb指令集,ARM汇编的语句格式 symbol instruction|directive|pseudo-instruction ;comment 例如:_Vectors DCD _initial_sp ; Top of Stack,3.4 ARM程序设计基础,

36、ARM汇编的语句格式(续) 符号命名规则 由大小写字母、数字及下划线组成,不能以数字开头,符号区分大小写 符号在其作用范围内必须唯一 自定义符号名不能与系统的保留字、指令或伪指令相同,3.4 ARM程序设计基础,ARM汇编的语句格式(续) ARM汇编语言伪操作 汇编程序中特殊的指令助记符 为完成汇编程序做各种准备工作,对源程序进行汇编程序处理,3.4 ARM程序设计基础,ARM汇编常用伪操作列表,示例: AREA EXAMPLE, CODE, EADONLY ENTRY Start MOVR0, #10 MOVR1, #3 ADDR0, R0, R1 END LED实例演示,ARM汇编的语句格

37、式(续) ARM汇编语言伪指令 汇编程序中特殊的指令助记符 在汇编时将被合适的机器指令代替成ARM或Thumb指令,3.4 ARM程序设计基础,ARM汇编伪指令列表,示例: LOOPMOVR0, #10 ADRR4, LOOP; 将LOOP地址放入R4 ; 由于PC值为当前指令地址值加8字节(流 ; 水线),因此ADR指令被编译为 ; SUBR4, PC, #0 xC LDRR0, =0 x1122EF ; 汇编后将得到 ; LDRR1, PC, offset_to_add ; addDCD0 x1122EF,ARM汇编的程序结构 以程序段为单位组织代码 代码段:1个汇编程序至少有1个代码段

38、数据段:存放代码运行时需用到的数据 每个段都以AREA为段的开始,以碰到下一个AREA作为段的结束。代码段以ENTRY和END来标识开始和结束。,3.4 ARM程序设计基础,示例: AREA EXAMPLE, CODE, READONLY ENTRY Start MOVR0, #10 MOVR1, #3 ADDR0, R0, R1 END,ARM汇编的程序结构 顺序程序设计 分支程序设计:B、BL 循环程序设计:B、BL 子程序:BL,3.4 ARM程序设计基础,示例: CMPR1, #3 BHIEND ADDR0, R0, #3 END LOOPADDR0, R0, R1 CMPR0, #3

39、 BLSLOOP END,示例: BLPRINT_TEXT PRINT_TEXT MOVPC, LR END,ARM C语言基础及混合编程 ATPCS ARM-Thumb Procedure Call Standard,过程调用规范,规定了一些子程序之间调用的基本规则 包括子程序调用过程中寄存器的使用规则、数据栈的使用规则、参数传递规则,3.4 ARM程序设计基础,ARM C语言基础及混合编程 (续) 基本ATPCS 寄存器的使用规则:寄存器对应的名称 数据栈的使用规则 参数的传递规则,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 寄存器的使用规则 R0R3:用于传参,R0用

40、于返回值 R4R11:保存局部变量 R12:子程序间临时过渡寄存器,IP R13:数据栈指针SP R14:LR;R15:PC,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 数据栈的使用规则 ATPCS规定数据栈为FD类型 SP:指向最后入栈数据的内存地址 数据栈的基地址:数据栈的最高地址 数据栈界限:可使用的基本低的内存单元地址,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 参数的传递规则 参数个数可变:不超过4个时,可使用R0R3;超过4个时,可使用数据栈 参数个数固定:各浮点参数按顺序处理;为每个浮点参数分配FP寄存器 子程序结果返回规则,3.4 ARM

41、程序设计基础,3.4 ARM程序设计基础,子程序结果返回规则 结果为1个32位的整数,可通过R0返回 如结果为1个64位的整数,可通过R0和R1返回,依次类推 结果为1个浮点数时,可通过浮点运算部件的寄存器f0、d0或s0返回 结果为1个复合浮点数时,可通过f0fN或d0dN来返回 对于位数更多的结果,需通过调用内存来传递,ARM C语言基础及混合编程(续) 支持ARM和Thumb混合使用的ATPCS 使用/interwork:目标代码支持ARM程序和Thumb程序混合使用 使用/nointerwork:程序不包含Thumb程序;用户自己进行ARM和Thumb程序切换,3.4 ARM程序设计基

42、础,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 为什么要使用汇编语言 开机时硬件系统的初始化 中断处理 对性能非常敏感的代码块,手工汇编可优化代码 对于底层的了解,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 在C语言中内嵌汇编 不能直接向PC赋值,跳转需用B或BL 避免使用R0R3、R12R14 一般不直接使用物理寄存器,最好是声明C局部变量,并在内嵌语句中使用,3.4 ARM程序设计基础, Datasheet P61,ARM C语言基础及混合编程(续) 在C语言中内嵌汇编 可以使用C跳转到C/C+标签 使用内嵌汇编有很多其它限制,详见Datasheet “ARM Developer Suite” P66 变量、函数名都是地址,混合编程就不难理解了,3.4 ARM程序设计基础,ARM C语言基础及混合编程(续) 在C语言中内嵌汇编 _asm指令 ; 指令指令,3.4 ARM程序设计基础,ARM C语言基础及混

温馨提示

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

评论

0/150

提交评论