收藏 分享(赏)

第四讲 ARM指令系统和汇编编程.ppt

上传人:j35w19 文档编号:8235169 上传时间:2019-06-15 格式:PPT 页数:52 大小:1.26MB
下载 相关 举报
第四讲 ARM指令系统和汇编编程.ppt_第1页
第1页 / 共52页
第四讲 ARM指令系统和汇编编程.ppt_第2页
第2页 / 共52页
第四讲 ARM指令系统和汇编编程.ppt_第3页
第3页 / 共52页
第四讲 ARM指令系统和汇编编程.ppt_第4页
第4页 / 共52页
第四讲 ARM指令系统和汇编编程.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、复习第三讲:ARM编程模型和异常处理 ARM指令系统 ARM汇编语言编程和优化,第 四 讲 ARM指令系统和汇编编程,ARM 编程模型,ARM存储器格式:零地址开始字节线型组合 ARM的七种工作模式 用户模式:USER 系统(高级用户)模式:SYSTEM 异常模式:Supervisor,Undef, About, IRQ,FIQ 不同的模式对应不同的寄存器资源和权限 ARM的寄存器组成 影子寄存器的概念 R13,R14,R15 CPSR/SPSR,Register Organization Summary,User mode r0-r7, r15, and cpsr,r8,r9,r10,r11

2、,r12,r13 (sp),r14 (lr),spsr,FIQ,User,r13 (sp),r14 (lr),spsr,IRQ,User mode r0-r12, r15, and cpsr,r13 (sp),r14 (lr),spsr,Undef,User mode r0-r12, r15, and cpsr,r13 (sp),r14 (lr),spsr,SVC,User mode r0-r12, r15, and cpsr,r13 (sp),r14 (lr),spsr,Abort,User mode r0-r12, r15, and cpsr,Thumb state Low registe

3、rs,Thumb state High registers,Note: System mode uses the User mode register set,ARM 异常总结,异常改变指令正常执行的顺序 ARM有7种异常 复位 数据中止(ABOUT) 快速中断请求 普通中断请求 预取指中止(ABOUT) 软件中断(SWI) 未定义指令中止(UNDEF) 一旦异常发生,处理器进入特定模式,跳转到向量表中的异常处理程序入口 每种异常都有一个优先级 中断是一种特殊的异常,异常处理,When an exception occurs, the ARM: Copies CPSR into SPSR_ S

4、ets appropriate CPSR bits If core currently in Thumb state then ARM state is entered. Mode field bits Interrupt disable bits (if appropriate) Stores the return address in LR_ Sets PC to vector address To return, exception handler needs to: Restore CPSR from SPSR_ Restore PC from LR_ This can only be

5、 done in ARM state.,异常返回时候PC指针的调整,SWI和未定义指令异常是由当前执行的指令产生的 ,当SWI和未定义指令异常产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令:MOV PC ,LR 当IRQ和FIQ异常产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令。SUBS PC , LR ,4 当发生指令预取中止异常时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常处理程序返回到产生该指令预取中止异常的指令处SUBS PC ,LR ,4 数据访问中止异常是由数据访问指令产生的,当数据访问中止异常产生时,程序计数器PC

6、的值已经更新,它指向当前指令后面的第3条指令。SUBS PC ,LR , 8,复习第三讲:ARM编程模型和异常处理 ARM指令系统 ARM汇编语言编程和优化,第 四 讲 ARM指令系统和汇编编程,ARM指令集的特点,所有的ARM指令都是32位宽,在存储器中以4字节的边界对齐 3地址的数据处理指令(即两个源操作数和结果寄存器都独立设定) LOAD/STORE架构,包含非常强大的多寄存器Load和Store指令 能够在单时钟周期的单条指令来完曾一项普通移位操作和一项普通的ALU操作 可以通过协处理器来扩展新的寄存器和数据类型 指令可条件执行 ARM指令的分类 数据处理指令 分支指令 数据传送指令(

7、访问存储器) 软件中断SWI指令 程序状态寄存器指令,条件执行,N,Z,C,V,Condition code,Instruction,CPSR,缺省情况下,数据处理指令不影响条件码标志,但是条件码标志可由“S”来设置,CMP不需要加“S” SUBS r1,r1,#1 r1减1并设置标志 BNE loop 如果Z标志清除则跳转 ARM指令可以通过增加条件执行码后缀来条件执行 这样可以增加代码密度,看下面的例子,条件码,条件执行举例,CMP r0, #0ADDEQ r1, r1, #1ADDNE r2, r2, #1.,数据处理指令,包括 算术运算:ADD ADC SUB SBC RSB(逆向减法

8、) RSC(带进位逆向) 逻辑运算:AND ORR EOR(逻辑异或) BIC(逻辑位清除) 比较: CMP CMN(取负比较Rn+N) TST(等值测试(RnN) TEQ(位测试Rn&N)(不需要S标志位影响CPSR) 数据移动:MOV MVN(把一个数的非送到寄存器) 这些指令只作用于寄存器,不是存储器 语法:S Rd,Rn,Operand2 第一个操作数为寄存器, 寄存器方式,操作数即为寄存器的值 SUB R1, R1, R2 寄存器移位方式,将寄存器的移位结果作为操作数 使用桶型移位器对寄存器的数值作相应的移位 例:MOV R0, R1, ASR#2 第二个操作数可以是在0255之间的

9、8位立即数,寄存器, 可以选择移位 移位的值:5 bit 整数 另外一个寄存器的值 常量乘除一个常数立即数 8位立即数, 范围是 0-255. 一个8位的常数循环右移偶数位 32位常数载入寄存器以后使用,第二个操作数,立即数常量,ARM指令不能包含32位的立即数常量 所有的ARM指令都固定为32位长 数据处理指令中有12位可以用作第二个操作数,位7:0是8位立即数,位11:8是移位的位数 规则是“每个立即数是由一个8位的常数循环右移偶数位得到” 汇编器把立即数转换为移位的方式 MOV r0,4096; 0x40循环右移26位 ADD r1,r2,#0xFF0000; 0xFF循环右移16位 不

10、能够按照规则生成的立即数会导致错误,桶型移位器,Destination,CF,0,Destination,CF,LSL : 逻辑左移,ASR: 算术右移,Multiplication by a power of 2,Division by a power of 2, preserving the sign bit,Destination,CF,.0,Destination,CF,LSR : 逻辑右移,ROR: 循环右移,Division by a power of 2,Bit rotate with wrap around from LSB to MSB,Destination,RRX: 带扩

11、展的循环右移,Single bit rotate with wrap around from CF to MSB,CF,ADD r5,r5,r3,LSL r2; r5:=r5+r3 2r2,乘法,MUL条件S 目的寄存器,操作数1,操作数2 例:MULS R0,R1,R2 ;R0 = R1 R2,同时设置CPSR中的相关条件标志位 MLA条件S 目的寄存器,操作数1,操作数2,操作数3 MLAS R0,R1,R2,R3 ;R0 = R1 R2 + R3,同时设置CPSR中的相关条件标志位 SMULL、SMLAL、UMULL、UMLAL等 乘法指令的执行周期 ARM7TDMI约为25个时钟周期

12、StrongARM/XScale约为13个时钟周期 ARM9E/ARM102xE约为2个时钟周期,跳转的实现,相对跳转指令 Branch Instructions B BL Range is +/- 32 MB Destination is relative to PC Optional L causes lr (r14) to be set to return address,绝对跳转 Absolute branches LDR pc,=DEST MOV pc, SUBS pc, Range is unrestricted within 4Gb address space Destinati

13、on address is absolute,分支指令,分支指令的格式 B label 24位偏移量 由于ARM是4字节对齐,所以实际上是26位的寻址空间, 即 32 MBB start. start,perform PC relative branch to label “start”,continue execution from here,: BL func2 :,: MOV pc,lr,func1,func2,void func1 (void) :func2();: ,BL 跳转,完成一次常规的调用子程序,一般需要2步 保存返回地址 跳转到子程序地址 BL指令 the return a

14、ddress is stored in the link register (lr/r14) branch to an address anywhere within a +/- 32MB range Returning is performed by restoring the program counter (pc) from lr,使用伪指令装载一个32位的常量 LDR rd, =const 汇编编译以后两种结果: 直接 MOV or MVN 指令产生一个立即数or 在数据区内存放常量 使用LDR指令 把PC偏移量的地址上的数据载入寄存器 举例 LDR r0,=0xFF = MOV r0

15、,#0xFF LDR r0,=0x55555555 = LDR r0,PC,#Imm12 DCD 0x55555555,32位常数的生成,Generating Branches with LDR,The ARMs branch instruction is limited to a range of 32MB However branches can also be performed by loading address values directly into the PC (r15),Assembler CodeLDR pc,=label ;load address of label i

16、nto PC,ARMASM,Object CodeLDR pc,pc,#n.-DCD 0x12345678,Literal pool address data,Branches anywhere within the 4GB address space are possible using this method,数据传送指令,单寄存器的Load和Store指令这些指令在ARM寄存器和存储器之间提供单数据项传送,数据可以是字节、字、半字; 多寄存器的Load和Store指令这些指令的灵活性比单寄存器传送质量差,但是可以使得大量数据有效传递,用于保存上下文或者搬运数据 单寄存器交换指令一条指令实

17、现寄存器和存储器中的数据交换,使用比较少 ARM的数据传送指令:都是寄存器间接寻址,基址偏移和基址变址(在寄存器地址的基础上增加立即数或者寄存器偏移量)LDR r0,r1,初始化地址指针,在寻址之前,必须初始化地址指针 ARM汇编伪指令 ADR存取的数据地址靠近被执行的代码,可以利用数据处理指令通过R15计算偏移量,ARM提供了ARR伪指令来计算:COPY ADR r1,TABLE1 ;r1 指向 TABLE1ADR r2,TABLE2 ; r2 指向 TABLE2TABLE1 ;TABLE2 ;,数据传送指令地址访问,LDR/STR指令所访问的地址是由一个基址寄存器加上偏移量的形式,对于字和

18、无符号的字节的访问,偏移量可以是: 一个无符号12位立即数(04095字节)LDR r0, r1,#8 一个寄存器,或者寄存器移位后的值LDR r0, r1, r2LDR r0, r1, r2, LSL#2 也可以由基址寄存器加或减得到LDR r0, r1, #-8LDR r0, r1, -r2LDR r0, r1, -r2, LSL#2,0x5,0x5,r1,0x200,Base Register,0x200,r0,0x5,Source Register for STR,Offset,12,0x20c,r1,0x200,Original Base Register,0x200,r0,0x5,

19、Source Register for STR,Offset,12,0x20c,r1,0x20c,Updated Base Register,Auto-update form: STR r0,r1,#12!,前变址和后变址寻址,Pre-indexed: STR r0,r1,#12,Post-indexed: STR r0,r1,#12,带自动变址的前变址,块数据传送,批量加载和存储指令(LDM/STM)允许在存储器和16个寄存器之间传送数据 寄存器的传送顺序不能任意指定 低地址的内容总是传送到低寄存器 例:LDMIA r10!, r0,r1,r4 基址寄存器指定了访问存储器的地址 这些指令有效

20、的用于: 在存储器中传送数据块 在堆栈中保存和恢复上下文,r1,r4,r0,r10,Increasing Address,LDM/STM操作,LDM(或STM)条件类型 基址寄存器! ,例: LDMIA r12!, r0-r11; 由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据 IA 每次传送后地址加1; IB 每次传送前地址加1; DA 每次传送后地址减1; DB 每次传送前地址减1; 比较大的中断延迟,内存块拷贝,可以使得STM/LDM指令自动更新基址寄存器 对于IA、IB,寄存器的内容加4 对于DA、DB,寄存器的内容减4 例: ;r12指向源数据的起始地址

21、 ;r14指向源数据的结束地址 ;r13指向目标数据的起始地址 Loop LDMIA r12!, r0-r11; STMIA r13!, r0-r11;CMP r12, r14BNE loop,IncreasingMemory,r13,r14,r12,堆栈操作,ARM的堆栈操作由块传送指令来实现 STMFD (Push) 批量存储满递减堆栈 LDMFD (Pop)批量加载满递减堆栈 例:STMFD sp!, r4-r7, lr;现场保存,将r4r7、lr入栈 例:LDMFD sp!, r4-r7, pc;恢复现场,异常处理返回 FA :满递增 FD:满递减 (ARM ATPCS 过程调用标准规

22、定) EA:空递增 ED:空递减,100,FF,1234,A0BE,8034,STMFD sp!,r4-r7,lr,数据交换指令(SWP),指令格式 SWP条件 目的寄存器,源寄存器1,源寄存器2 例: SWP R0,R1,R2 ; 将R2所指向的存储器中的字数据传送到R0,同时将R1中的字数据传送到R2所指向的存储单元。 SWP R0,R0,R1 ; 该指令完成将R1所指向的存储器中的字数据与R0中的字数据交换。,Software Interrupt (SWI),28,31,24,27,0,Cond 1 1 1 1,SWI number (ignored by processor),23,C

23、ondition Field,产生一个软件中断异常 SWI异常处理需要检查SWI号,以确定进行何种所请求的操作 通过使用SWI机制,应用程序可以在用户模式下通过系统调用执行一系列特权操作。 例:SWI 0x02 ;调用操作系统编号为02的系统调用例程。,SWI异常,通过SWI异常,用户模式的应用程序可以调用系统模式下的代码。 在实时操作系统(RTOS)中,通常使用SWI异常为用户应用程序提供系统功能调用。 在SWI指令中包括一个24位的立即数,该立即数指示了用户请求的特定的SWI功能。 第1级SWI异常处理程序为汇编程序,用于确定SWI指令中的24位立即数。 第2级SWI异常处理程序具体实现S

24、WI的各个功能,可以是汇编程序,也可以是C程序,SWI号,ARM内核没有提供直接给SWI传递SWI号的机制 Swi号必须在SWI指令中指定 从swi指令中提取出swi号 这样的话,SWI异常处理必须确定调用SWI时处理器处于何种状态(ARM状态还是Thumb状态) 检查SPSR中的T位 SWI指令在ARM状态下位于LR4处,在Thumb状态下位于LR2处 为了传递参数给C程序,一般将参数压入堆栈中 给C语言实现的swi异常处理程序传递一个指向这些参数的指针 也可以把值写回到堆栈的合适位置,这样可以传回参数,Software Interrupts,SWI 0x01,Vector table,Us

25、er program (C/ASM),SWI handler (ASM),SWI handler (C),(Optional),User program invokes SWISWI handler contain Assembler part and optional C part,第1级SWI异常处理程序,T_bit EQU 0x20 EXPORT SWI_HANDER SWI_HanderSTMFD sp!, r0-r12, lrTST r0, #T_bitLDRNEH r0, lr, #-2BICNE r0, r0, #0xff00LDREQ r0, lr, #-4 BICEQ r0,

26、 r0, #0xff000000BL C_SWI_HandlerLDMFD sp!, r0-r12,pcEND,保存用到的寄存器; 判断是ARM、THUMB指令? 计算SWI的指令地址,并读取到R0 取24位立即数到R0 跳转,第2级SWI异常处理程序,/memory mapped registers Volatile unsigned parallel_output, parallel_input; Void C_SWI_Handler (unsigned number, int *param) /r0 = SWI number /r1 = pointer ro SWI parameters

27、 in memory Switch (number) Case 0: parallel_output = param0; break; Case1: param0 = parallel_input; break; Default: break; ,PSR传送指令,MRS和MSR指令允许传送CPSR/SPSR的值到一个通用寄存器,或反之 例:MRS R0,SPSR;传送SPSR的内容到R0 在用户模式下,所有的位均可读,但是只有条件标志可写。,MRS r0,CPSR ; read CPSR into r0 BIC r0,r0,#0x80 ; clear bit 7 MSR CPSR_c,r0 ;

28、 write modified value back,协处理器指令,ARM的体系结构支持16个协处理器 每一个协处理器指令都占用ARM指令集的固定部分 如果指令中的协处理器在系统中并不存在,会产生一个未定义指令异常 有三种类型的协处理器指令 协处理器数据处理 CDP:初始化协处理器数据处理操作 协处理器寄存器传送 MRC:从协处理器寄存器传送到ARM寄存器 MCR:从ARM寄存器传送到协处理器寄存器 协处理器存储器传送指令 LDC:从存储器中加载协处理器寄存器 STC:把协处理器寄存器的值存到存储器中,ARM指令集总结,跳转指令 数据处理指令 乘法指令 状态寄存器访问指令 Load/Store

29、内存访问指令 批量Load/Store内存访问指令 信号量操作指令 SWI系统调用指令 ARM协处理器指令,ARM 汇编程序语句,ARM汇编程序语句构成 伪操作 :derective 宏指令 :pseudo-instruction 指令 伪擦作: 不是可执行的机器指令,它是汇编器对程序进行汇编时候由汇编程序进行处理 符号定义(Symbol definition) 数据定义(Data definition) 汇编控制(Assembly control) 框架描述 (Frame description) 信息报告(Reporting) 其他 宏指令:一段独立的程序代码,在程序被汇编时,汇编器将对每

30、个宏调用作展开,符号定义伪操作,符合定义伪指令:定义ARM汇编中的变量、并赋值以及定义寄存器名称 用于定义全局变量的GBLA、GBLL和GBLS 用于定义局部变量的LCLA、LCLL和LCLS 用于对变量赋值的SETA、SETL、SETS A代表算术变量,L代表逻辑变量,S代表串变量 RLIST 为一个通用寄存器列表定义名称,GBLA object object SETA 0XFFGBLL status Status SETL trueLCLS err err SETS “error no:”,数据定义伪操作,LTORG :声明一个数据缓冲池(literal pool)的开始 SPACE: 分

31、配一块内存单元,并用0初始化 DCB/DCD:分配一段字节/字的内存单元,并用指定的数据初始化 MAP:定义一个结构化的内存表 FIELD: 用于定义一个结构化内存表中的数据域,AREA Example,code,readonly Start BL func1 func1LDR r1,=0x55555555 MOV pc , lr LTORG Data SPACE 4200 END,MAP 4096 Consta FIELD 4 Constb FIELD 4 X FIELD 8 Y FIELD 8 String FIELD 256,Nullstring DCB “null string” Da

32、ta1 DCD 1,5,20 DATA2 DCD MENADDR+4,汇编控制伪操作,汇编控制伪操作 IF ,ELSE和ENDIF (条件语句) WHILE,WEND (循环语句) MACRO,MEND (宏定义语句) MEXIT(从宏中跳转出去),Count SETA 1 WHILE count =4 Count SETA count+1 WEND,MACRO $label xmac $p1,$p2 MEND ;宏的调用Abc xmac subr1,de,其他常用伪操作,EQU:数字常量、基于寄存器的值和程序中的标号定义一个字符名称。相当于C语言中的define Abcd EQU 2 Abc

33、d EQU label+16 AREA: 定义一个代码段或者数据段,一个汇编程序至少包含一个代码段 AREA example,CODE,READONLY ENRTY END ENTRY:标识程序的入口点,一个有多个源文件的程序至少要有一个入口,一个源文件中最多只有一个入口 END:标识源程序的结束 ALIGN:通过添加补丁字节使得当前位置满足一定的对齐方式,AREA cacheable,CODE, ALIGN=3 Rout1 ;code MOV pc,lr ALIGN 8 Rout2 ;code,AREA example,CODE, READONLY Start LDR r6,=label M

34、OV pc,lr Label1 DCB 1 ALIGN subroutin1,其他常用的伪操作,EXPORT(或GLOBAL):声明一个符号可以被其他文件引用。相当于声明了一个全局变量。 IMPORT:告诉编译器当前的符号不是在本源文件中定义的。 GET(或INCLUDE):将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。 INCBIN:被包含的文件不进行汇编处理。 RN:为一个特定的寄存器定义名称。,AREA example, CODE ,READONLY EXPORT Doadd Doadd ADD r0,r0,r1,AREA example, CODE ,REA

35、DONLY GET file.s GET c:projectfile2.s,ARM汇编语言伪指令,ARM汇编语言伪指令: 不是真正的ARM汇编指令,进行汇编处理的时候被替换成为对应的ARM指令 ADR(小范围地址读取伪指令):通常编译为1条指令,用ADD或者SUB来实现,否则报错(寻址范围1020) ADRL(中等范围地址读取伪指令):编译为2条指令,寻址范围扩展到256KB) LDR,(大范围的地址读取伪指令):将一个32位常数或者地址值读到寄存器中 NOP,Start MOV r0,#10 ADR r4,start 汇编为:SUB r4,pc,#0xc,Start MOV r0,#10 A

36、DRLr4,start+60000汇编为:ADD r4,pc,#0xe800ADD r4,r4,#0x254,汇编语言的程序结构,ARM汇编语言以段(section)为单位组织源文件; 段是相对独立,具有特定名称,不可分割的指令或数据序列; 段分为代码段和数据段(至少要有代码段); ARM汇编器汇编生成可执行文件 一个或者几个代码段,只读的RO 零个或者多个包含初始值的数据段(可读写RW) 零个或者多个不包含初始值的数据段,被初始化为零,可读写的 ZI段 ARM汇编源程序基本结构:AREA EXAMPLE1,CODE READONLY ENTRYstartMOV r0, 10MOV r1,3A

37、DD r0,r0,r1END,ATPCS介绍寄存器的使用规则,定义: ATPCS(arm-thumb procedure call standard)是 子程序之间的调用设定一定的规则,ATPCS就是ARM 程序中的子程序调用的基本规则 PCS: 规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起 定义了一套有关过程(函数)调用者与被调用者之间的协议。 PCS规范强制实现如下约定:调用函数如何传参(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。 基本的ATPCS包含的内容 各个寄存器的使用规则和相应的名称 数据栈的使用规则 参数传递的规

38、则,ATPCS介绍 寄存器使用规则,R0R3 参数寄存器子程序间通过寄存器R0R3来传递参数。这时,寄存器R0R3可以计作A1A4。被调用的子程序在返回前无需恢复寄存器R0R3的内容。R4R11 通用变量寄存器在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存器R4R11可以计作V1V8。如果在子程序中使用到了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。寄存器R12用作子程序间的scratch寄存器,记作ip。用于保存SP,在函数返回时使用该寄存器出栈(临时过渡寄存器),函数调用时候会被破坏。寄存器R13用作数据栈指针,记作sp。在

39、子程序中寄存器R13不能用作其他用途,寄存器sp在进入子程序的值和退出子程序的值必须相等。寄存器R14称为连接寄存器,记作lr。它用作保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。寄存器R15是程序计数器,记作PC。它不能用作其他的用途。,数据栈使用规则,ATPCS规定: 数据栈是FD(满递减堆栈):堆栈指针指向最后压入的数据,且由高地址向低地址生成。ATPCS规定使用这种堆栈类型 数据栈栈指针:最后一个写入栈的数据的内存地址 数据栈的基地址: 是指数据栈的最高地址。,参数传递规则,子程序参数传递规则 对于参数个数可变的子程序,但参数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。 子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器返回。 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推,本讲总结,常用的ARM指令集 常用的汇编语言伪指令和格式 ATPCS调用规则,下一节课:ARM汇编举例ARM 调试原理,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报