第2、3章 ARM指令和汇编语言设计03_第1页
第2、3章 ARM指令和汇编语言设计03_第2页
第2、3章 ARM指令和汇编语言设计03_第3页
第2、3章 ARM指令和汇编语言设计03_第4页
第2、3章 ARM指令和汇编语言设计03_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

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

文档简介

1、主要内容n1 ARM 指令集概述 n2 ARM 汇编语言设计 ARM指令集 nARM指令集主要包括指令集主要包括6大类指令:大类指令: q数据处理指令:如数据处理指令:如ADD、SUB、AND等等q加载存储(加载存储(Load-Store)指令:如)指令:如LDR等等q分支指令:如分支指令:如B、BL等等q状态寄存器访问指令:如状态寄存器访问指令:如MRS、MSR等等q协处理器指令:如协处理器指令:如LDC、STC等等q异常处理指令:如异常处理指令:如SWI等等ARM指令集nARM指令集的特点指令集的特点q所有所有ARM指令都是指令都是32位定长的位定长的 q加载存储(加载存储(Load-St

2、ore)架构)架构 q提供功能强大的提供功能强大的一次加载和存储多个寄存器的指令一次加载和存储多个寄存器的指令 qCPU内核硬件中提供了桶型(内核硬件中提供了桶型(barrel)移位器,移)移位器,移位操作可以内嵌在其他指令中位操作可以内嵌在其他指令中 q所有的所有的ARM指令都是可以条件执行的指令都是可以条件执行的 ARM指令集:示例THUMB指令集 nThumb指令集是指令集是16位的指令集,它对位的指令集,它对C代码的密度进代码的密度进行了优化,平均达到约行了优化,平均达到约ARM代码大小的代码大小的65%。为了。为了尽量降低指令编码长度,尽量降低指令编码长度,Thumb指令集具体采用了

3、指令集具体采用了如下约束:如下约束: q不能使用条件执行,不能使用条件执行,而对于标志则一直都是根据指令结果进而对于标志则一直都是根据指令结果进行设置的行设置的q源寄存器和目标寄存器是相同的源寄存器和目标寄存器是相同的q只使用低端寄存器,即不使用寄存器只使用低端寄存器,即不使用寄存器R8-R12q对指令中出现的常量有大小的限制对指令中出现的常量有大小的限制q不能在指令中使用内嵌的桶型移位器不能在指令中使用内嵌的桶型移位器(inline barrel shifter)THUMB-2指令集 nThumb-2 指令集主要是对Thumb指令集架构的扩展,其设计目标是以Thumb的指令密度达到ARM的性

4、能。它具有如下特性 q增加了32位的指令,因而实现了几乎ARM指令集架构的所有功能q完整保留了16位的Thumb指令集q编译器可以自动地选择16位和32位指令的混合q具有ARM态的行为,包括可以直接处理异常、访问协处理器以及完成v5TE的高级数据处理功能q通过If-Then (IT) 指令,1-4条紧邻的指令可以条件执行JAZELLE nJazelle技术使得ARM核可以执行8位的Java字节码,约95%的JAVA字节码可以由硬件执行,从而使效率显著提高。 汇编指令用处n嵌入式系统的初始化代码需要用汇编指令来编写。嵌入式系统的初始化代码需要用汇编指令来编写。初始化初始化代码通常包括处理器的初始

5、化、内存初始化等,代码通常包括处理器的初始化、内存初始化等,其中涉及其中涉及一些比较特殊的操作,比如设置处理器在不同工作模式下一些比较特殊的操作,比如设置处理器在不同工作模式下的堆栈指针,需要使用特殊的访问处理器状态寄存器的指的堆栈指针,需要使用特殊的访问处理器状态寄存器的指令,强制处理器切换到不同模式下进行操作;令,强制处理器切换到不同模式下进行操作;n一些中断例程一些中断例程尤其是作为一种异常被响应的第一级中断派尤其是作为一种异常被响应的第一级中断派发程序需要用汇编指令来编写,以提高效率;发程序需要用汇编指令来编写,以提高效率;n在软件的调试过程中,熟悉汇编指令更有助于查找疑难问在软件的调

6、试过程中,熟悉汇编指令更有助于查找疑难问题;题;n某些指令本身就是不能直接由编译器产生的,而需要人工某些指令本身就是不能直接由编译器产生的,而需要人工编写。编写。n可以直接控制在可以直接控制在C语言编程时不能有效使用的语言编程时不能有效使用的3个优化工个优化工具具:q指令调整指令调整-调整一段代码中的指令序列,以避免处理调整一段代码中的指令序列,以避免处理器的暂停等待。器的暂停等待。ARM指令执行是在指令流水线中进行指令执行是在指令流水线中进行的,所以一条指令执行的时间会受其相邻指令的影响。的,所以一条指令执行的时间会受其相邻指令的影响。q寄存器分配寄存器分配-决定如何分配变量给决定如何分配变

7、量给ARM寄存器或者堆寄存器或者堆栈,以获得最好的性能。目标是要使访问存储器的次数栈,以获得最好的性能。目标是要使访问存储器的次数降到最少。降到最少。q条件执行条件执行-可以使用可以使用ARM条件代码和条件指令的全部条件代码和条件指令的全部功能。功能。 n通过在指令后加上合适的条件标志位,ARM指令可以条件执行q通过减少前向的分支数目,增强了指令的代码密度和指令性能CMP r0, r1 ADDGT r2, r2, #1 ADDLE r3, r3, #1n默认情况下,数据处理指令不会影响条件标志位,但是,可在指令后加“s”(或其它条件位)后缀,以实现标志位的置位。loop ADD r2, r2,

8、 r3 SUBS r1, r1, #0 x01 BNE loop r2=r2+r3 如果如果 Z 标志清除则分支跳转标志清除则分支跳转 r1 减减1并设置标志位并设置标志位 r0 - r1, 比较比较 r0 和和 r1 并设置标志位并设置标志位 if r2=r2+1 标志位保持不变标志位保持不变 if = r3=r3+1 标志位保持不变标志位保持不变条件执行和标志位条件执行的例子if (r0 = 0) r1 = r1 + 1;else r2 = r2 + 1;C 代码代码 5 条指令 占据 5 个字 5个或者6个时钟周期 3 条指令 占据3 个字 3 个时钟周期 CMP r0, #0 BNE

9、else ADD r1, r1, #1 B endelse ADD r2, r2, #1end .ARM 指令指令 非条件执行非条件执行 CMP r0, #0 ADDEQ r1, r1, #1 ADDNE r2, r2, #1 .条件执行条件执行指令条件码 不相等无符号高于或相同无符号低于为负相等溢出无溢出无符号高于无符号低于或相同为正或零小于大于小于或等于总是大于或等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVC后缀后缀描述描述Z=0C=1C=0Z=1被测试的标志被测试的标志N=1N=0V=1V=0C=1 & Z=0C=0 or Z=1N=VN!=VZ=0 & N

10、=VZ=1 or N=!Vn可能的指令条件码如下所示q注意: AL 是默认的,不需要被特别指出。 数据处理指令n由以下指令组成由以下指令组成 :q算术运算算术运算:ADDADCSUBSBCRSBRSCq逻辑运算逻辑运算:ANDORREORBICq比较运算比较运算:CMPCMNTSTTEQq数据传送数据传送:MOVMVNn这些指令仅对存放于寄存器的数据操作,对内存数据是无效的这些指令仅对存放于寄存器的数据操作,对内存数据是无效的.n语法语法:S Rd, Rn, Operand2n第二个操作数可以为一个寄存器或者一个立即数第二个操作数可以为一个寄存器或者一个立即数qSUB r0, r1, r2 q

11、AND r1, r4, #0 xFFn 比较指令仅仅设置了条件标志位比较指令仅仅设置了条件标志位 无需指定无需指定RdqCMP r0, r3n数据传送指令并不指定数据传送指令并不指定RdqMOV r0, r1n第二个操作数通过桶型移位器传输到第二个操作数通过桶型移位器传输到ALU寄存器方式, 可附加移位操作q移位的值可为以下的两种:n5位的无符号整数(031)n其它寄存器的最低字节q用来实现乘以一个常数nADD r0, r5, r5 LSL 1 r0 = r5 x 3 立即数q范围在 0-255的8位立即数n或者该8位立即数循环右移偶数位得到的数q允许32位的常数直接加载到寄存器中结果结果操作

12、数操作数 1桶型移位器桶型移位器操作数操作数 2ALU第二个操作数移位操作DestinationCF0DestinationCFLSL: 逻辑左移逻辑左移ASR: 算术右移算术右移相当于乘2相当于除以2, 保留符号位DestinationCF.0DestinationCFLSR: 逻辑右移逻辑右移ROR: 循环右移循环右移相当于除以2最低有效位旋转至最高有效位DestinationRRX: 扩展的循环右移扩展的循环右移寄存器数值右移一位,C标志位填补空出的位,移出的位代替C标志位CFn以下的移位操作是数据处理指令的一部分.q移位的范围为0-31位,对指令的性能不会造成太大的影响nARM 指令不

13、能包含一个指令不能包含一个 32位的立即数常数位的立即数常数qARM 指令都是指令都是32 位定长的位定长的n在数据处理指令的格式中,在数据处理指令的格式中,第二个操作数有第二个操作数有12位来对应位来对应n4 位的移位数乘以位的移位数乘以2组成了步长为组成了步长为2,范围在,范围在030的移位值的移位值 n立即数法则:立即数法则: “8 位的常数循环右移偶数位得到位的常数循环右移偶数位得到”07118immed_8ShifterRORrotx2小测试小测试: 指令:指令:0 xe3a004ffMOV r0, #?立即数常数 n为了加载更大的立即数, 汇编器提供了伪指令:qLDR rd, =c

14、onstn这将:q产生一条 MOV 或者 MVN 指令 或者q产生一条 PC相对寻址的LDR 指令将立即数从literal pool (嵌入在代码中的常数域)里读出来n举例qLDR r0, =0 xFF=MOV r0, #0 xFFqLDR r0, =0 x55555555 =LDR r0, PC, #Imm12DCD 0 x55555555n推荐用这种方式将常数加载到寄存器加载32位的常数n有两类乘法 分别产生 32位和 64位 的结果n32位的这类乘法在 ARM7TDMI 会执行 2 5 时钟周期qMUL r0, r1, r2; r0 = r1 * r2qMLA r0, r1, r2, r

15、3; r0 = (r1 * r2) + r3n64位的乘法提供了两种乘法指令:无符号和有符号乘q这类指令有两个目标寄存器qU|SMULL r4, r5, r2, r3; r5:r4 = r2 * r3qU|SMLAL r4, r5, r2, r3; r5:r4 = (r2 * r3) + r5:r4n大多数的 ARM 核不提供整数除法指令q除法操作由c的库函数例程或者移位操作实现乘法和除法分支指令n分支跳转指令有如下的格式:qBL labelq子函数调用可加上 L实现实现q在指令编码中,存在一个 24 位的地址域 q在执行时它被左移两位 (因为 ARM 指令是字对齐的),产生一个26位的偏移地

16、址,由此可知跳转的范围大体在-32MB+32MB之间q引起了流水线清空 B start . .start PC 相对寻址的标号相对寻址的标号 “start”跳转到此处继续执行跳转到此处继续执行:BL func2:BX lrfunc1func2void func1 (void):func2();:子程序n实现一个传统的子程序调用需要两个步骤:q保存返回地址 q跳转到子程序的首地址n这些步骤可以由一条指令完成, BLq返回地址被保存在链接寄存器 (lr/r14)q分支跳转到 +/- 32MB 范围内的任何地址n重新加载链接寄存器的内容至PC寄存器即可实现返回转移类型返回指令(推荐)返回指令(推荐)

17、注BLMOV PC,R14此时PC具有BL/SWI/und/ Pabt指令的地址undMOVS PC,R14_undSWIMOVS PC,R14_svcPabtSUBS PC,R14_abt,#4IRQSUBS PC,R14_irq,#4此时PC从IRQ或FIQ处取得断点地址FIQSUBS PC,R14_fiq,#4DabtSUBS PC,R14_abt,#8PC是产生Dabt指令(预取)的地址Reset-R14的内容未知各种子程序的返回指令单寄存器数据传输(加载 / 存储指令) LDRSTR字 LDRBSTRB字节 LDRHSTRH半字 LDRSB有符号的字节加载 LDRSH有符号的半字加载

18、n存储系统必须支持所有的访问尺寸n语法:qLDR Rd, qSTR Rd, 举例 LDREQB 地址寻址方式n被LDR/STR指令访问的地址通过一个基址寄存器和一个偏移量来指定 n对于字和无符号的字节访问, 偏移量可以为:q一个无符号的12位立即数 (i.e. 0 - 4095 bytes)LDR r0, r1, #8q寄存器, 可附加的对其进行移位LDR r0, r1, r2LDR r0, r1, r2, LSL#2n对于半字和有符号的字节访问, 偏移量可以为:q一个8位的立即数 (i.e. 0 - 255 bytes)q一个寄存器 (不可以被移位)n基址寄存器的地址可加也可减:LDR r0

19、, r1, #-8LDR r0, r1, -r2, LSL#2n是前序还是后序寻址n是否更新基址寄存器 (仅限于前序寻址)LDR r0, r1, #-8!0 x7r10 x300基址基址寄存器寄存器0 x300r00 x7源寄存器源寄存器偏移量偏移量80 x308r10 x300初始的基初始的基址寄存器址寄存器0 x300r00 x7源寄存器源寄存器偏移量偏移量80 x308r10 x308更新后的基更新后的基址寄存器址寄存器更新基址寄存器形式更新基址寄存器形式: STR r0,r1,#8! ;计算地址并传送,计算地址并传送,地址寄存器也更新地址寄存器也更新前序前序(前索引前索引)寻址和后序寻

20、址和后序(后索引后索引)寻址寻址n前序寻址前序寻址: STR r0, r1, #8 ; 计算地址并传送,计算地址并传送,地址寄存器不更新地址寄存器不更新n后序寻址后序寻址: STR r0, r1, #8 ;先直接传送数据,先直接传送数据,后更新地址寄存器后更新地址寄存器0 x780 x7n基址寄存器的更新使编写简单的块拷贝例程成为可能基址寄存器的更新使编写简单的块拷贝例程成为可能q举例举例: 后序寻址可用来拷贝一个内存块后序寻址可用来拷贝一个内存块; r5 源数据块的起始指针源数据块的起始指针; r6 源数据块的结束指针源数据块的结束指针; r8 目的数据块的起始指针目的数据块的起始指针loo

21、pLDRr0, r5, #4; 加载加载4个字节个字节STRr0, r8, #4; 存储至目标地址存储至目标地址CMPr5, r6; 检查是否完毕检查是否完毕BLTloop; 循环循环n在这个例子中每次循环拷贝一个字在这个例子中每次循环拷贝一个字内存块的拷贝 (1) 内存增长方内存增长方向向r6r5r8批量加载 / 存储指令 n语法:q Rb!, n4 种地址模式:q LDMIA / STMIA ;increment after,地址后加q LDMIB / STMIB ; increment before,地址先加q LDMDA / STMDA ;decrement after ,地址后减q

22、LDMDB / STMDB ;decrement before ,地址先减IAr2地址增长地址增长方向方向r3r1r2r3r1r2r3r1r2r3r1r0IBDADBLDMxx r0, r1,r2,r3STMxx r0, r1,r2,r3基址寄存器基址寄存器 (Rb)nSTM / LDM不仅可用于堆栈操作,它们也可以用来进行内存块拷贝不仅可用于堆栈操作,它们也可以用来进行内存块拷贝n举例举例; r5 源数据块的起始指针源数据块的起始指针; r6 源数据块的结束指针源数据块的结束指针; r8 目的数据块的起始指针目的数据块的起始指针loopLDMIAr5!, r0-r3; 加载加载 16 个字节

23、个字节STMIAr8!, r0-r3; 存储至目标地址存储至目标地址CMPr5, r6; 检查拷贝是否完毕检查拷贝是否完毕BLTloop; 循环循环n在这个例子中每次循环拷贝在这个例子中每次循环拷贝8个字个字内存块的拷贝 (2)内存增长方内存增长方向向r6r5r81、r5!与与r5不同,不同, r5!自动更新地址自动更新地址2、rx列表列表中的寄存器编码序号大小,决定了对应的存储器地址高低。中的寄存器编码序号大小,决定了对应的存储器地址高低。堆栈操作LDMFD sp!, r4-r7, pcSP100FF1234AOBE80341010123484209753r41r5 14544r60r712

24、lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753Top of MemorySPSP100FF1234A0BE8034SPOld SP100FF1234A0BE8034nARM 堆栈操作由块数据传输指令堆栈操作由块数据传输指令:qSTMFD(Push) 批存储批存储 满递减堆栈满递减堆栈 STMDBqLDMFD(Pop)批加载批加载 满递减堆栈满递减堆栈 LDMIAn注意注意: 寄存器在压栈时的顺序始终是寄存器在

25、压栈时的顺序始终是最低编号寄存器的内容压入最低编号寄存器的内容压入最低地址的堆栈空间最低地址的堆栈空间,被指定的寄存器顺序是无效的,被指定的寄存器顺序是无效的.STMFD sp!, r4-r7, lr软中断指令(SWI) n引起了一个异常自陷,引起了一个异常自陷, 跳转到软中断异常向量跳转到软中断异常向量n软中断处理例程检查软中断号以决定如何处理该号中断软中断处理例程检查软中断号以决定如何处理该号中断n通过软中断这种机制通过软中断这种机制, 操作系统可以实现一个优先操作集合,它们操作系统可以实现一个优先操作集合,它们可被用户模式下的应用代码调用可被用户模式下的应用代码调用.n语法语法:q SW

26、I 283124270 Cond 1 1 1 1SWI 号号 (被处理器忽略被处理器忽略)23条件域条件域类型含义入口地址优先级复位Reset引脚复位0 x001数据中止Data Abort(Dabt)数据地址不存在,或该地址不许当前指令访问,发生此异常0 x102快速中断请求Fast Interrupt Request (FIQ)快速中断引脚nFIQ请求中断低电平有效(且CPSR的F位=0时)产生。0 x1c3外部中断请求Interrupt Request(IRQ)系统外设通过外部中断引脚nIRQ请求中断(CPSR的I位=0时)产生。0 x184指令预取中止Prefech Abort(Pab

27、t)指令预取失败,存储器发出Abort信号,CPU仍然执行此失效指令时,发生此异常0 x0c5软中断Software Interrupt(SWI)用户执行SWI指令,以实现调用系统的特权指令和功能0 x086未定义指令Undefined Instruction(und)CPU遇到不认得的指令,利用此异常机制进行软件仿真调试0 x046程序状态寄存器访问指令 nMRS / MSR指令指令用于在用于在 CPSR / SPSR寄存器与通用寄存器之间传输数据寄存器与通用寄存器之间传输数据qMSR 指令允许全部或部分的寄存器内容被更新指令允许全部或部分的寄存器内容被更新n通过写通过写CPSR寄存器,可以

28、开关中断、改变处理器模式寄存器,可以开关中断、改变处理器模式q典型的是使用一个读典型的是使用一个读/修改修改/写的操作序列:写的操作序列:MRS r0,CPSR; 将将 CPSR 的内容读至的内容读至 r0BIC r0,r0,#0 x80 ; 将第将第7位清零以允许位清零以允许IRQ中断中断MSR CPSR_c,r0; 将修改后的值仅写入将修改后的值仅写入c字节字节n在用户模式下在用户模式下, 所有的位都可以被读出来,但是仅有条件标志位(所有的位都可以被读出来,但是仅有条件标志位(f)可以)可以被改变被改变fsxc2731N Z C V Q2867I F T mode1623 15 54024

29、J1089 19GE3:0 E A IT cond_abcde协处理器指令 nARM 体系支持体系支持16个协处理器个协处理器n每个协处理器的指令集都占据了每个协处理器的指令集都占据了 ARM指令集的固定部分指令集的固定部分 q如果系统中没有某个协处理器如果系统中没有某个协处理器, 那么就会触发未定义指令异常那么就会触发未定义指令异常n有三种协处理器指令有三种协处理器指令q协处理器数据操作指令协处理器数据操作指令nCDP : 初始化协处理器的数据处理操作初始化协处理器的数据处理操作q协处理器寄存器与协处理器寄存器与ARM处理器寄存器数据传输指令处理器寄存器数据传输指令nMRC : 协处理器寄存

30、器到协处理器寄存器到ARM 处理器寄存器的数据传输指令处理器寄存器的数据传输指令nMCR : ARM 处理器寄存器到协处理器寄存器的数据传输指令处理器寄存器到协处理器寄存器的数据传输指令q协处理器寄存器和内存的数据传输指令协处理器寄存器和内存的数据传输指令 nLDC : 协处理器数据加载指令协处理器数据加载指令nSTC : 协处理器数据存储指令协处理器数据存储指令TRmRsBTBW 选项16161616321632/6432/64Rd(RdHi,RdLo)Rn(RdHi,RdLo)符号乘法操作指令 nSMULxycond Rd, Rm, RsnSMULWycond Rd, Rm, RsnSML

31、Axycond Rd, Rm, Rs, RnnSMLAWycond Rd, Rm, Rs, RnnSMLALxycond RdLo, RdHi, Rm, RsnSMLA 指令会影响Q标志位nx, y 代表高半字(Top)或者低半字(Bottom)nW 代表选择48位乘积的高32位n不要去影响 NZCV标志位 (指令后加S后缀是不允许的)饱和运算指令 n饱和运算q向0 x7FFFFFFF加1导致了正值向负值的转变q从0 x80000000 减1导致负值向正值的转变n在电信领域中,一些DSP算法要求饱和度可以保证qG.723.1 VoIP(IP语音技术)qAMR - Adaptive MultiR

32、ate(自适应多码率 )QSUBcond Rd, Rm, Rn;Rd = saturate(Rm - Rn)QADDcond Rd, Rm, Rn;Rd = saturate(Rm + Rn)QDSUBcond Rd, Rm, Rn ;Rd = saturate(Rm - saturate(Rn2)QDADDcond Rd, Rm, Rn ;Rd = saturate(Rm + saturate(Rn2)n在这些指令的执行中,如果饱和发生,那么Q 标志位就会被置位0 x00 x7FFFFFFF0 x80000000-ve+ve断点指令 n断点指令断点指令 - BKPT q执行该指令或将引起一个

33、预取指令异常,或者使执行该指令或将引起一个预取指令异常,或者使处理器进入调试状态处理器进入调试状态q若有调试软件,它将该指令处理为断点若有调试软件,它将该指令处理为断点q若有调试硬件,那么将被直接作为一个断点处理若有调试硬件,那么将被直接作为一个断点处理q立即数的值将被处理器忽略立即数的值将被处理器忽略V6的新特性nARM 的的 V6 版本版本 包含了包含了 81 条新的指令条新的指令n几类附加的指令几类附加的指令q打包数据打包数据qSIMD (单指令多数据处理单指令多数据处理)q绝对差值求和操作绝对差值求和操作q饱和运算饱和运算q对混合端(大对混合端(大/小端)的支持小端)的支持q异常入口与

34、返回指令异常入口与返回指令n不同于以前对原指令集的扩充不同于以前对原指令集的扩充 (例如例如 BLX offset), V6 扩充的指令几乎都是条件执行的扩充的指令几乎都是条件执行的SIMD 加法 & 减法(1)qRd, Rn, RmqADD16 & SUB16n从第一个操作数中的每个半字上加上或减去第二个操作数对应的半字 qADD8 & SUB8n从第一个操作数中的每个字节上加上或减去第二个操作数对应的字节前缀:nS 有符号nSH有符号平分(减半)nU无符号nUH 无符号平分nUQ无符号饱和nQ饱和 (有符号)+RmRd+RnGE3GE2GE1GE0UADD8 Rd, Rn, RmSIMD

35、加法 & 减法(2)nADDSUBX & SUBADDXq结合的16 位加法和减法GE3:2GE1:0Rd-+RbRaUADDSUBX Rd, Ra, Rbn根据加法是否产生进位或减法是否产生借位的情况设置GE3:0SIMD 乘法nSMUADX Rd, Rm, Rsq双重乘加(有符号)nSMUSDX Rd, Rm, Rsq双重乘减(有符号)nSMLALDX Rd, Rm, Rs, Rnq双重乘加累加(有符号)nSMLSLDX Rd, Rm, Rs, Rnq双重乘减累加(有符号)nX 表示在计算前Rs中的两个半字互换nL 表示64位的累加n如果发生累加溢出,Q 标志位置位xRdRsxRmSMUA

36、D Rd, Rm, Rs+绝对差值求和指令 n在许多多媒体数字信号编码算法,尤其是视频运动估计(video motion estimation) 算法中,绝对差值求和运算是主要操作n对象素数组数据的运算 (通常是8位)ABSDIFFABSDIFFABSDIFFABSDIFF+可选择累加可选择累加思考题(一)1. 用一条ARM指令分别实现下面的语句:a) r0 = 16b) r0 = r1 / 16(带符号的数带符号的数)c) r1 = r2 * 3d) r0 = -r02.BIC指令的作用是什么?3. 哪些数据处理指令总是设置条件标志位?思考题(二)1. 哪些指令可用于子程序调用的返回?2.

37、要打开或者屏蔽IRQ中断该使用哪些指令?3. 为了克服 ARM 分支指令只有32MB范围的局限,应该使用哪些指令?思考题(三)1. CLZ 指令的用途是什么?2. 以下指令的结果是什么?r1 = 0 x7FFFFF00r2 = 0 x00001000QADD r0, r1, r23. 以下的指令有效吗?LDRD r7, r2, 0 x1004. 以下指令的效果是什么?SMULBT r0, r1, r25. 如果 r1 = 0 x12406700, 那么在执行这条语句后 r0 的值是什么:REV r0, r16. 以下指令的意义是什么SUB16 r1, r2, r0思考题(四)1. 下面这条 T

38、humb 指令的效果是什么?ADD r1, r22. 这是一条有效的Thumb指令吗?MSR CPSR_S, r03. Thumb中 BL 指令的跳转范围是多少?汇编语言源程序格式汇编语言程序的结构汇编语言程序的结构1汇编语言的行构成汇编语言的行构成2伪指令伪指令3461.汇编语言程序的结构汇编源程序示例第一部分 (test0源程序) CODE32 ;32位的位的ARM指令段指令段 AREA codesec, CODE, READONLY ;代码段,名称代码段,名称codesec,属性为属性为 ;只读只读main PROC ;函数函数main STMFD sp!,lr ;保存必要的寄存器和返回

39、地址保存必要的寄存器和返回地址 ;到数据栈到数据栈 ADR r0,strhello ;取标签取标签strhello代表的地址值代表的地址值 BL _printf ;调用调用C运行时库的运行时库的_printf函数函数 ;打印打印“Hello world!”字符串字符串 BL welcomefun ;调用子函数调用子函数welcomfun LDMFD sp!,pc ;恢复寄存器值恢复寄存器值strhello ;strhello代表本地字符串的地址代表本地字符串的地址 DCB Hello world!n0 ;定义一段字节空间定义一段字节空间 ENDP ;函数函数main结束结束 ARM ARM的汇

40、编语言程序的汇编语言程序 一般由几个段组成,一般由几个段组成, 每个段均由每个段均由AREAAREA伪操伪操 作定义。作定义。段可以分为多种,如代码段、段可以分为多种,如代码段、数据段、通用段,每个段又有数据段、通用段,每个段又有不同的属性,象代码段的默认不同的属性,象代码段的默认属性为属性为READONLYREADONLY,数据段的默数据段的默认属性为认属性为READWRITEREADWRITE。本程序定义了两个段,本程序定义了两个段,第一个段为代码段第一个段为代码段codeseccodesec;第二个段为数据段第二个段为数据段constdatasecconstdatasec47汇编源程序示

41、例第二部分welcomefun ;子函数子函数welcomfunSTMFD sp!,lr ;保存必要的寄存器和返回地保存必要的寄存器和返回地 ;址到数据栈址到数据栈 ADR r0,adrstrarm ;取取adrstrarm的地址放到寄存器的地址放到寄存器r0中中 LDR r0,r0,#0 ;将将strarm的值放到的值放到r0中中 BL _printf ;调用调用C运行时库的运行时库的_printf函数打印函数打印 ; “Welcom to ARM world!”字符串字符串 LDMFD sp!,pc ;恢复寄存器值恢复寄存器值adrstrarm ;adrstrarm标签标签DCD stra

42、rm ;保存保存strarm的地址的地址 AREA constdatasec, DATA, READONLY,ALIGN=0 ;数据段,名称为数据段,名称为constdatasec, 属性属性 ;为只读为只读本程序定义了两个段,本程序定义了两个段,第一个段为代码段第一个段为代码段codeseccodesec第二个段为数据段第二个段为数据段constdatasecconstdatasec48汇编源程序示例第三部分strarm DCB Welcome to ARM world!n0 ;存放存放“Welcome to ARM ; world!”字符串字符串 EXPORT main ;导出导出main

43、函数供外部调用函数供外部调用 ;引入三个引入三个C运行时库函数和运行时库函数和ARM库库 IMPORT _main IMPORT _main IMPORT _printf IMPORT |Lib$Request$armlib|, WEAK END ;程序结束程序结束程序如何结束程序如何结束?(loop源程序源程序)汇编语言源程序格式汇编语言程序的结构汇编语言程序的结构1汇编语言的行构成汇编语言的行构成2伪指令伪指令3502.汇编语言的行构成n格式: 标签 指令/伪操作 操作数 ;语句的注释q所有的标签必须在一行的开头顶格写,前面不能留空格,后面也不能跟C语言中的标签一样加上“:”;q ARM汇

44、编器对标识符的大小写敏感,书写标号及指令时字母的大小写要一致;q注释使用“;”符号,注释的内容从“;”开始到该行的结尾结束。n例:qLabeladd add r0,r0,r1 ;加法指令qStr1SETS “This is a string.”;给字符串Str1赋值512.汇编语言的行构成3.常量:l数字常量十进制数,如1、2、123十六进制数,如 0 x123,0 xabcl字符常量由单引号及中间的字符组成,包括C语言中的转义字符,如a,nl字符串常量由一对双引号及中间的字符串表示,中间也可以使用C语言中的转义字符,比如:“abcdef0 xarn”l逻辑常量TRUE,FALSE,注意带大括

45、号523.伪指令n没有相对应的操作码或者机器码,通常称为伪指令,它们所完成的操作称为伪操作。n作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。n有如下几种伪指令:1.符号定义伪指令符号定义伪指令2.数据定义伪指令数据定义伪指令3.汇编控制伪指令汇编控制伪指令533.伪指令1.符号定义伪指令l用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。l符号定义有如下几种伪指令: 用于定义局部变量的LCLA、LCLL、LCLS; 用于定义全局变量的GBLA、GBLL、GBLS ;用于对变量赋值的SETA、SETL、SETS ; 543.伪指

46、令I.LCLA、LCLL、LCLS 伪指令用于定义一个汇编程序中的局部变量,并初始化 格式: LCLA/LCLL/LCLS局部变量名定 义 一 个 局定 义 一 个 局部 的 数 字 变部 的 数 字 变量 , 初 始 化量 , 初 始 化为为0定义一个局定义一个局部的逻辑变部的逻辑变量,初始化量,初始化为为F定义一个局定义一个局部的字符串部的字符串变量,初始变量,初始化为空串化为空串这三条伪指令用于声明局部变量,在其局部这三条伪指令用于声明局部变量,在其局部作用范围内变量名必须唯一。作用范围内变量名必须唯一。 553.伪指令II.GBLA、GBLL、GBLS 伪操作定义一个汇编程序中的全局变

47、量,并初始化 格式:GBLA/GBLL/GBLS 变量名定义一个全定义一个全局的数字变局的数字变量,并初始量,并初始化为化为0定义一个全定义一个全局的逻辑变局的逻辑变量,并初始量,并初始化为化为F定义一个全定义一个全局字符串变局字符串变量,并初始量,并初始化为空串化为空串这三条伪指令用于定义全局变量,因此在整这三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。个程序范围内变量名必须唯一。 563.伪指令III.SETA、SETL、SETS格式:变量名 SETA/SETL/SETS表达式给 一 个 数给 一 个 数字 变 量 赋字 变 量 赋值值给 一 个 逻给 一 个 逻辑 变

48、量 赋辑 变 量 赋值值给 一 个 字给 一 个 字符 串 变 量符 串 变 量赋值赋值格式中的变量名必须为已经定义过的全局或格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。局部变量,表达式为将要赋给变量的值。 57汇编程序的变量代换 AREA |.text|, CODE, READONLY ;代码段代码段,名称为名称为|.text|,属性为只读属性为只读 GBLS str1 ;声明声明str1为全局字符串为全局字符串 GBLS str2 ;声明声明str2为全局字符串为全局字符串 GBLL l1 ;声明声明l1为全局逻辑变量为全局逻辑变量 GBLA num1 ;声明

49、声明num1为全局数字变量为全局数字变量l1 SETL TRUEnum1 SETA 0 x4fstr1 SETS bbbstr2 SETS aaa str1:$str1. l1:$l1,a1:$num1.ccc ;str2包含了多个变量包含了多个变量main PROC ;函数函数main STMFD sp!,lr ;保存必要的寄存器和返回地址到数据栈保存必要的寄存器和返回地址到数据栈 ADR r0,strhello BL _printf ;调用调用C运行时库的运行时库的_printf函数打印字符串函数打印字符串 LDMFD sp!,pc ;恢复寄存器值恢复寄存器值strhello ;strhe

50、llo代表本地字符串的地址代表本地字符串的地址 DCB $str2n0 ;定义一段字节空间定义一段字节空间 ENDP ;函数函数main结束结束运行后结果:运行后结果:aaa str1:bbb l1:T,a1:0000004Fccc 58汇编程序的变量代换(续) EXPORT main;导出main函数供外部调用 ;引入三个C运行时库函数和ARM库 IMPORT _main IMPORT _main IMPORT _printf IMPORT |Lib$Request$armlib|, WEAK END593.伪指令2.数据定义伪指令l用于为数据分配存储单元,同时也可完成已分配存储单元的初始化

51、。 l数据定义有如下几种伪指令: DCBDCW/DCWUDCD/DCDU SPACE MAPFIELD 603.伪指令I.DCB DCB用于分配一块字节单元并用伪指令中指定的表达式进行初始化。 格式:标号/变量 DCB 表达式 D C B 可 用可 用“=”代替代替表达式可以为表达式可以为使用双引号的使用双引号的字 符 串 或字 符 串 或 0 -255的数字的数字例:例: Array1 DCB 1,2,3,4,5 ;数组数组 str1 DCB “Your are welcome!” ;构造字符串构造字符串 ;并分配空间并分配空间 613.伪指令II.DCW/DCWU 格式:标号/变量 DCW

52、/DCWU 表达式 DCW分配一段半字存分配一段半字存储单元并用表达式值储单元并用表达式值初始化,它定义的存初始化,它定义的存储空间是半字对齐的储空间是半字对齐的DCWU功能跟功能跟DCW类似,只是分配的类似,只是分配的字存储单元不严格字存储单元不严格半字对齐半字对齐例:例:Arrayw1 DCW 0 xa,-0 xb,0 xc,-0 xd ;构造固定数组并分构造固定数组并分 ; 配半字存储单元配半字存储单元 623.伪指令III.DCD/DCDU 格式:标号/变量 DCD/DCDU 表达式 DCD用于分配一块字存用于分配一块字存储单元并用伪指令中指定储单元并用伪指令中指定的表达式初始化,它定

53、义的表达式初始化,它定义的存储空间是字对齐的。的存储空间是字对齐的。也可用也可用“&”代替代替DCDU只是只是分配的存储分配的存储单元不严格单元不严格字对齐字对齐例:例:Arrayd1 DCD 1334,234,345435 ;构造固定数组并分配构造固定数组并分配 ;字为单元的存储单元字为单元的存储单元Label DCD str1 ;该字单元存放该字单元存放str1的地址的地址 633.伪指令IV.SPACE 格式: 标号 SPACE表达式 SPACE用于分配一片用于分配一片连续的存储区域并初连续的存储区域并初始 化 为始 化 为 0 , 也 可 用, 也 可 用“”代替代替表达式为要表达式为

54、要分配的字节分配的字节数数例:例:Freespace SPACE1000 ;分配分配1000字节的存储空间字节的存储空间643.伪指令V.MAP 格式:MAP 表达式 ,基址寄存器MAP定义一个定义一个结构化的内存表结构化的内存表的首地址,的首地址, 可可以用以用“”来代来代替替表达式可以表达式可以为程序中的为程序中的标号或数学标号或数学表达式表达式基址寄存器为可选项,当基址寄基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值存器选项不存在时,表达式的值即为内存表的首地址,当该选项即为内存表的首地址,当该选项存在时,内存表的首地址为表达存在时,内存表的首地址为表达式的值与基址寄存器的和式

55、的值与基址寄存器的和MAP可以与可以与FIELD伪操作配合使用来定义结构伪操作配合使用来定义结构化的内存表。化的内存表。例:例: MAP 0 x130,R2;内存表首地址为内存表首地址为0 x130R2653.伪指令VI.FILED 格式:标号 FIELD字节数 FIELD用于定义一个用于定义一个结构化内存表中的数结构化内存表中的数据域,据域, 可用可用“#”来来代替代替FILEDFIELD常与常与MAP配合使用来定义结构化的内存表配合使用来定义结构化的内存表:FIELD伪伪指令定义内存表中的各个数据域,指令定义内存表中的各个数据域,MAP则定义内存表的首地则定义内存表的首地址,并为每个数据域

56、指定一个标号以供其他的指令引用。址,并为每个数据域指定一个标号以供其他的指令引用。注意注意:MAP和和FIELD伪指令仅用于定义数据结构,并不分配伪指令仅用于定义数据结构,并不分配存储单元。存储单元。663.伪指令3.汇编控制伪指令l汇编控制伪操作用于指引汇编程序的执行流程。l有如下几种伪指令: IF、ELSE、ENDIFWHILE、WEND67其他伪指令1.AREA 格式: AREA 段名 属性, AREA用于定义一个用于定义一个代码段、数据段或者代码段、数据段或者特定属性的段特定属性的段属性部分表示该代码段属性部分表示该代码段/数数据段的相关属性,多个属据段的相关属性,多个属性可以用性可以

57、用“,”分隔。分隔。l常见属性如下:常见属性如下:DATA:定义数据段。定义数据段。 CODE:定义代码段定义代码段。READONLY:表示本段为只读。表示本段为只读。READWRITE:表示本段可读写。表示本段可读写。其他伪指令n一个汇编程序至少应该包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。n例:qAREA test,CODE,READONLYqAREA |.text|, CODE, READONLY6869其他伪指令2.CODE16、CODE32 格式: CODE16/CODE32 CODE16伪操作指示伪操作指示编译器后面的代码为编译器后面的代码为16位的位的Thum

58、b指令指令CODE32伪操作指示伪操作指示编译器后面的代码为编译器后面的代码为32位的位的ARM指令指令如果在汇编源代码中同时包含如果在汇编源代码中同时包含Thumb和和ARM指令时,可以指令时,可以用用“CODE32”通知编译器其后的指令序列为通知编译器其后的指令序列为32位的位的ARM指指令令,用用“CODE16”伪指令通知编译器其后的指令序列为伪指令通知编译器其后的指令序列为16位位的的Thumb指令。指令。在使用在使用ARM指令和指令和Thumb指令混合编程的代码里,这两条指令混合编程的代码里,这两条伪指令后面的代码类型是不同的,但它们并不能对处理器进伪指令后面的代码类型是不同的,但它

59、们并不能对处理器进行状态的切换。行状态的切换。 其他伪指令例:CODE32 ;32位的ARM指令AREA|.text|,CODE,READONLYLDRR0,0 x8500BX R0 ;程序跳转,并将处理 ;器切换到Thumb状态CODE16 ;16位的Thumb指令ADD R3,R3,1 END ;源文件结束7071其他伪指令3.ENTRY 格式: ENTRY ENTRY用于指定汇编程序的入口。用于指定汇编程序的入口。在一个完整的汇编程序中至少要有在一个完整的汇编程序中至少要有一个一个ENTRY,也可以有多个也可以有多个。下面的代码使用了下面的代码使用了ENTRY: AREA subrout

60、, CODE, READONLY ENTRY ;指定程序入口指定程序入口 start MOV r0, #10 ;设置参数设置参数 MOV r1, #3 BL doadd ;调用子函数调用子函数 其他伪指令stop MOV r0, #0 x18 LDR r1, =0 x20026 SWI 0 x123456 ;调用ARM 半主机机制 doadd ADD r0, r0, r1 ;子函数代码 MOV pc, lr ;子函数返回 END ; 源文件结束7273其他伪指令4.END 格式: END END告诉编译器告诉编译器已经到了源程序已经到了源程序的结尾的结尾例:例:AREAconstdata,DA

温馨提示

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

评论

0/150

提交评论