收藏 分享(赏)

3.ARM寻址方式与指令系统.ppt

上传人:ysd1539 文档编号:7206913 上传时间:2019-05-10 格式:PPT 页数:183 大小:4.96MB
下载 相关 举报
3.ARM寻址方式与指令系统.ppt_第1页
第1页 / 共183页
3.ARM寻址方式与指令系统.ppt_第2页
第2页 / 共183页
3.ARM寻址方式与指令系统.ppt_第3页
第3页 / 共183页
3.ARM寻址方式与指令系统.ppt_第4页
第4页 / 共183页
3.ARM寻址方式与指令系统.ppt_第5页
第5页 / 共183页
点击查看更多>>
资源描述

1、第三章 ARM寻址方式与指令系统,本章提要,ARM指令的编码格式,3.1.1 指令特点,所有指令都是32bit;大多数指令都在单周期内完成;大多数指令都可以条件执行;load/store体系结构;指令集可以通过协处理器扩展。,3.1.2 ARM指令的格式,Cond:指令的条件码。 Opcode:指令操作码。 S:操作是否影响cpsr。 Rn:包含第一个操作数的寄存器编码。 Rd:目标寄存器编码。 Operand2:第2操作数。,1.典型的ARM指令编码格式如下:,2.典型的ARM指令助记符格式如下:,opcodecondsRd,Rn,operand2 opcode 指令的助记符; cond 指

2、令执行的条件;,3.1.3 条件域(cond),大多数的ARM指令可包含一个可选的条件码,只有在cpsr中的条件标志位满足指定的条件时,指令才会被执行。不符合条件的代码依然占用一个时钟周期(相当于一个NOP指令)。在ARM V5之前的版本,所有的指令都是条件执行,V5版开始引入了一些指令必须无条件执行。几乎所的ARM数据处理指令均可以根据执行结果来选择是否需要更新条件标志。若要更新条件标志,则指令中必须含有后缀“S”.,ARM指令的条件域,EQ/NE: 等于/不等于(equal / not equal)HS/LO: 无符号数高于或等于/无符号数小于(higher or same/lower)H

3、I/LS: 无符号数高于/无符号数低于或等于(higher/lower or same)GE/LT: 有符号数大于或等于/有符号数小于(greater or equal / less than)GT/LE: 有符号数大于/有符号数小于或等于(greater than / less or equal)MI/PL: 负/非负VS/VC: 溢出/不溢出(overflow set / overflow clear)CS/CC: 进位/无进位(carry set / carry clear),ARM指令的条件码,本章提要,ARM指令的编码格式,3.2 寻址方式,寻址方式是根据指令中给出的地址码字段来实现

4、寻找真实操作数地址的方式。 ARM指令寻址方式可分为四大类: 数据处理指令寻址 Load/Store指令的寻址 批量Load/Store指令的寻址 协处理指令寻址。,3.2.1 数据处理指令寻址方式,一、数据处理指令第2操作数的构成方式 1. 立即数方式(立即寻址)每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即: =immed_8进行32位循环右移(2*rotate_4)位,合法的立即数: MOV R0, #0x0000F200 MOV R1, #0x00110000 MOV R2, #0x00012800 非法的立即数: 0x1010

5、 0x00102 0xFF1008位立即数不需要经过移位间接表示,而可以直接表示。,2. 寄存器方式 (寄存器寻址)操作数即为寄存器的数值如: MOV R3,R2ADD R0,R1,R2,3. 寄存器移位方式 (寄存器移位寻址)寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。 操作数为寄存器的数值做相应的移位而得到。在ARM指令中移位操作包括逻辑左移、逻辑右移、算术左移、算术右移、循环右移和带扩展的循环右移,移位方式,硬件支持,二、具体寻址类型,1第二操作数为立即数汇编语法格式:#如: MOV R0,#

6、0xFC0,2第二操作数为寄存器汇编语法格式:如: MOV R0,R1ADD R0,R1,R2,3第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数汇编语法格式:, # 如: MOV R0,R0,LSL #nMOV R0, R2, LSL #3,4第二操作数为寄存器移位方式,且移位数值放在寄存器中汇编语法格式:, 如: ANDS R1,R1,R2,LSL R3,5第二操作数为寄存器进行RRX移位得到汇编语法格式:,RRX,如果移位的位数由立即数给出,立即数只能取5bit位,取值范围031。如果移位的位数由寄存器Rs给出,移位的位数由Rs的低5位决定。注意: 指令中的任意一个寄存器(Rn

7、,Rd,Rm 和 Rs)都不能使用pc,使用了pc将会产生不可预知的结果。 额外代价(overhead):需更多的周期才能完成指令,因为ARM没有能力一次读取3个寄存器。,移位的位数,3.2.2 Load/Store指令寻址,Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为字、无符号字节的Load/Store指令寻址和半字、有符号字节Load/Store指令寻址两大类。,一、地址计算方法,1寄存器间接寻址 操作数保存在寄存器所指定地址的存储单元中,即 寄存器为操作数的地址指针。寄存器间接寻址指令举 例如下: STR R0,R1 ;将寄

8、存器R0的值传送到R1指定的存储单元 LDR R2,R1 ;将R1指向的存储单元的数据读出保存在R2中 SWP R1,R1,R2 ;将寄存器R1的值和R2指定的存储单元的内容交换,STR R0,R1; LDR R2,R1;,2. 基址加变址寻址 将基址寄存器的内容与指令给出的位移量相加,形成操作数的有效地址。有两种形式: 前变址法:基地址寄存器中的值和地址偏移量先作加减运算,生成的操作数作为内存访问的地址。 后变址法:将基地址寄存器中的值直接作为内存访问的地址进行操作,内存访问完毕后基地址寄存器中的值和地址偏移量作加减运算,并更新基地址寄存器。,二、字、无符号字节寻址,汇编指令语法格式为: L

9、DR BT, STR BT,1Addressing_mode中的偏移量为立即数前变址不回写形式: ,#+/-前变址回写形式: ,#+/-!后变址回写形式: ,#+/-,前变址寻址(前索引) STR R0,R1,#12!; Mem32R1+12=r0;R1=R1+12;,“!”表示指令在完成数据传送后应该更新基址寄存器,加了“!”可称为带自动索引的前变址寻址,这种索引不消耗额外时间。归纳:“先运算后访问”,后变址寻址(后索引) STR R0, Rl, #12 mem32R1=R0; R1=R1+12;,没有“!”,只使用立即数作为基址寄存器的修改量。归纳:“先传送,后改变地址”,偏移量为立即数的

10、指令编码类型W P 汇编语法格式 0 1 ,#+/- 1 0 ,#+/- 1 1 ,#+/-!,2Addressing_mode中的偏移量为寄存器的值 前变址不回写形式: ,+/- 前变址回写形式: ,+/-! 后变址回写形式: ,+/-,偏移量为寄存器的指令编码类型对应关系W P 汇编语法格式 0 1 ,+/- 1 0 ,+/- 1 1 ,+/-!,3Addressing_mode中的偏移量通过寄存器移位得到前变址不回写形式: ,+/-,#shift_amount 前变址回写形式: ,+/-,#shift_amount! 后变址回写形式: ,+/-,#shift_amount,偏移量为移位寄

11、存器的指令编码类型对应关系W P 汇编语法格式 0 1 ,+/-,#shift_amount 1 0 ,+/-,#shift_amount 1 1 ,+/-,#shift_amount!,三、半字、有符号字节寻址,这类指令可用来加载有符号字节、加载有符号半字、加载/存储无符号半字。Load/Store指令对半字、有符号字节操作指令编码格式如下:,加载有符号字节到寄存器: LDR SB , 加载有符号半字到寄存器: LDR SH , 加载无符号半字到寄存器: LDR H , 存储无符号半字到内存: STR H ,1Addressing_mode中的偏移量为立即数 前变址不回写形式: ,#+/-

12、前变址回写形式: ,#+/-! 后变址回写形式: ,#+/-,偏移量为立即数的指令编码类型W P 汇编语法格式 0 1 ,#+/- 1 0 ,#+/- 1 1 ,#+/-!,2Addressing_mode中的偏移量为寄存器的值 前变址不回写形式: ,+/- 前变址回写形式: ,+/-! 后变址回写形式: ,+/-,偏移量为寄存器值的指令编码类型对应关系W P 汇编语法格式 0 1 ,+/- 1 0 ,+/- 1 1 ,+/-!,3.2.3 批量Load/Store指令寻址方式,ARM指令系统提供了批量Load/Store指令寻址方式,即通常所说的多寄存器寻址,也就是一次可以传送几个寄存器的值

13、,允许一条指令最多传送16个寄存器。 多寄存器寻址:多寄存器寻址方式中,一条指令可实现一组寄存器值的传送,允许一条指令传送16个寄存器的任何子集或所有寄存器。,编码格式,批量加载: LDM !, 批量存储: STM !, ,LDMIA R1!,R2-R7,R12 ;将R1指向的单元中的数据读出;到R2R7、R12中(R1自动加4) STMIA R0!,R2-R7,R12 ;将寄存器R2R7、R12的值保;存到R0指向的存储单元中;(R0自动加4),register_list表示要加载或存储的寄存器列表,bit15:0可以表示16个寄存器,如果某位为1,则该位的位置作为寄存器的编号,此寄存器参预

14、加载或存储。 S用于恢复CPSR和强制用户位。当程序计数器PC包含在LDM指令的register_list中,且S为1时,则当前模式的SPSR被拷贝到CPSR中,使处理器的程序返回和状态的恢复成为一个原子操作。如果register_list中不包含程序计数器PC,S为1则加载或存储的是用户模式下的寄存器组。,注意事项:指令中寄存器和连续内存地址单元的对应关系: 编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元。,内存操作,块拷贝寻址实现把一块数据从存储器的某个位置拷贝到另一个位置。后增IA (Increment After) :每次数据传送后地址加4; 先增IB (Incre

15、ment Before) :每次数据传送前地址加4 ; 后减DA (Decrement After) :每次数据传送后地址减4 ; 先减DB (Decrement Before) :每次数据传送前地址减4 ;,它们与指令编码中P、U的对应关如下表所示 LDM/STM的地址变化方式 addr_mode P U D A 0 0 I A 0 1 D B 1 0 I B 1 1,堆栈操作,栈的分类 按栈指针分类 栈指针指向最后压入堆栈的有效数据项,称为满堆栈(full stack)。在push前先修改栈指针。栈指针指向下一个数据项放入的空位置,称为空堆栈(empty stack)。在push后修改栈指

16、针。,按生长方向分类向高地址方向生长,称递增堆栈(Ascending stack)。向低地址方向增长,称递减堆栈(Decending stack)。,ARM处理器支持的堆栈类型,满递增(FA):栈地址向上增长,栈指针指向内含有效数据项的最高地址。空递增(EA):栈地址向上增长,栈指针指向栈顶的 空位置。,满递减(FD):栈地址向下增长,栈指针指向内含有 效数据项的最低地址。空递减(ED):栈地址向下增长,栈指针指向堆栈下 的第一个空位置。,栈操作图示,块拷贝与栈操作的对应关系,3.2.4 协处理器指令寻址方式,协处理器加载/存储指令的寻址方式 协处理器数据处理指令的寻址方式,协处理器加载/存储

17、指令的寻址方式,L ,, addressing_mode 其中: opcode为指令操作码; coproc为协处理器名称; addressing_mode为指令寻址模式。,1. 内存地址索引格式前变址不回写形式: ,#+/-*4 前变址回写形式: ,#+/-*4! 后变址回写形式: ,#+/-*4,2内存地址非索引格式这种指令寻址汇编语法格式为,,协处理器数据处理指令的寻址方式,协处理器数据处理指令的寻址方式主要通过寄存器寻址,根据寄存器编码来查找相应的寄存器,这部分内容在指令系统中进行详细介绍。,本章提要,ARM指令的编码格式,3.3.1 指令分类,数据处理指令程序状态访问指令跳转指令访存指

18、令异常中断产生指令协处理器指令,3.3.2 数据处理指令,数据传输指令:mov、mvn算术指令:add、adc、sub、sbc,rsb和rsc逻辑指令:and、orr、eor和bic比较指令:cmp、cmn、tst和teq乘法指令:mla、mul,1.数据处理指令的特点,所有的操作数来自寄存器或立即数,不会来自内存。 运算结果一定是为32位宽,且放在一个寄存器中,不会写入内存。(有一个例外:长乘法指令产生64位结果)。 每一个操作数寄存器和结果寄存器都在指令中独立指出。,2.采用的寻址方式和S后缀,立即数寻址寄存器寻址寄存器移位寻址,寻址方式,除数据传送指令外,寻址方式是第2操作数的寻 址方式

19、。,后缀S,数据处理指令可以选择s后缀,以影响状态标志。但是比较指令(cmp、cmn、tst和teq)不需要后缀s,它们总会直接影响cpsr中的状态标志。在数据操作指令中,除了比较指令以外,其它的指令如果带有s后缀,同时又以pc为目标寄存器进行操作,则操作的同时从spsr恢复cpsr。如果在user或者system模式下使用带有s后缀的数据操作指令,同时以pc为目标寄存器,那么会产生不可预料的结果。因为user和system模式下没有spsr。,3.数据传输指令,指令的助记符格式语法 s,# s, s,LSL# s,LSL, MOV 数据传送指令MVN 数据取反传送指令,伪代码if condi

20、tionPassed(cond) thenRd = 第二操作数if s = 1 and Rd = pc thencpsr = spsrelse if s = 1 thenset NZCV flags in cpsr,举例 Mov r0, r1 /* r0 = r1,不修改cpsr*/ Mov r0, #0x0 /* r0 = 0,不修改cpsr*/ Movs r0, #0x0 /* r0 = 0,同时设置cpsr的Z位*/ Movs r0, #-10 /* r0 = 0xfffffff6,同时设置cpsr的N位*/ Mvn r0, r2 /* r0 = NOT r2,不修改cpsr*/ Mvn

21、 r0, 0xffffffff /* r0 = 0x0,不修改cpsr*/ Mvns r0, 0xffffffff /* r0 = 0x0,同时设置cpsr的Z位*/ Mov r0, r1, LSL #1 /* r0 = r1 r2 */,说明movs和mvns指令对pc寄存器赋值时有特殊含义,表示要求在赋值的同时从spsr中恢复cpsr。 对于mov和mvn指令,编译器会进行智能的转化。,4.算术指令,指令的助记符格式语法 s,# s, s,LSL# s,LSL, ADD、ADC;SUB、SBC;RSB、RSB 反向(带借位)减法指令,伪代码(以加法为例)if conditionPassed

22、(cond) thenRd = Rn + 第二操作数if s = 1 and Rd = pc thencpsr = spsrelse if s = 1 thenset NZCV flags in cpsr,举例 Add r0, r1, r2 /* r0 = r1 + r2 */ Adc r0, r1, r2 /* r0 = r1 + r2 + carry */ Sub r0, r1, r2 /* r0 = r1 r2 */ Sbc r0, r1, r2 /* r0 = r1 r2 + carry -1 */ Rsb r0, r1, r2 /* r0 = r2 r1 */ Rsc r0, r1,

23、 r2 /* r0 = r2 r1 + carry 1 */ Add r0, r1, r1, LSL #31 /* r0 = r1 + r1 31 */ Add r0, r1, r1, LSL r2 /* r0 = r1 + r1 r2 */说明adds和adcs在进位时将cpsr的C标志置1;否则置0。subs和sbcs在产生借位时将cpsr的C标志置0;否则置1,5.逻辑指令,指令的助记符格式语法 s,# s, s,LSL# s,LSL, AND;ORR;EOR;BIC 位清除指令,伪代码(以and为例)if conditionPassed(cond) thenRd = Rn AND 第二

24、操作数if s = 1 and Rd = pc thencpsr = spsrelse if s = 1 thenset NZCV flags in cpsr,举例 And r0, r1, r2 /* r0 = r1 AND r2*/ And r1, r1,#0xffffff00 /* r1 = r1 AND 0xffffff00*/ Orr r0, r1, r2 /* r0 = r1 OR r2 */ Eor r0, r1, r2 /* r0 = r1 XOR r2 */ Bic r0, r1, r2 /* r0 = r1 AND NOT r2 */ Bic r1, r1, #0x0f /*

25、 清空r1的低4位*/ And r0, r1, r1, LSL #31 /* r0 = r1 AND (r1 r2) */,注意:若指定s,则指令将,根据结果更新N和Z;计算Operand2时更新标志c;不影响标志V。,6.比较指令,指令的助记符格式语法 ,# , ,LSL# ,LSL, CMP 比较指令CMN 反值比较指令TST 位测试指令TEQ 相等测试指令,伪代码(以cmp为例) if ConditionPassed(cond) thenalu_out = Rn - 第二操作数set NZCV flags in cpsr,举例: Cmp r1, r2 /*根据r1r2的结果设置cpsr,

26、结果不写回*/ Cmn r1, r2 /*根据r1+r2的结果设置cpsr,结果不写回*/ Tst r1, r2 /*根据r1 AND r2的结果设置cpsr,结果不写回*/ Teq r1, r2 /*根据r1 XOR r2的结果设置cpsr,结果不写回*/ Cmp r2, #5 /*根据r2 5的结果设置cpsr,结果不写回*/ Cmp r1, r2, LSL #5 /* 根据r1 (r2 5)设置cpsr*/ Cmp r1, r2, LSL r3 /* 根据r1 (r2 r3)设置cpsr*/说明: 如果不考虑结果的写回,cmp、cmn、tst和teq分别等价于subs、adds、ands

27、和eors。,MLAconds Rd,Rm,Rs,Rn;乘累加 Rd = (Rm Rs) + RnMULconds Rd,Rm,Rs;乘法 Rd = Rm Rs,指令的助记符格式:,MLA r0,r1,r2,r3 /* r0=r1r2+r3 /* MUL r0,r1,r2 /* r0=r1r2 /*,7.乘法指令,32位乘法指令,Operationconds RdLo,RdHi,Rm,Rs,UMLAL r1,r2,r3,r4 /*r2 r1=r3r4+r2 r1/* UMULL r0,r1,r2,r3 /*r1,r0 = r2r3 /*,64位乘法指令,3.3.3 程序状态访问指令,cpsr/

28、spsr不是通用寄存器,不能使用mov指令来读写。在ARM处理器中,只有mrs指令可以读取cpsr/spsr;只有msr可以写cpsr/spsr。程序不能直接修改cpsr/spsr的内容,通常是通过”读取-修改-写回”的操作序列来实现的。,1.读指令mrs,指令的助记符格式:语法 mrs,cpsr/spsr伪代码 if ConditionPassed(cond) thenif R = 1 thenRd = spsrelse Rd = cpsr,举例Mrs r0, cpsr /* 读取cpsr到r0 */Mrs r3, spsr /* 读取spsr到r3 */说明 user和system模式没有

29、spsr,因此这些模式下不能读取spsr。,2.写指令msr,写指令msr的二进制格式:,写指令msr的助记符格式:,msr _, #msr _, 表示合法的立即数:8bit循环右移偶数位; 代表cpsr或spsr; 指定传送的区域,可进一步细分(只能小写) c 控制域字节(psr7:0) x 扩展域字节(psr15:8) s 状态域字节(psr23:16) f 标志域字节(psr31:24),写指令msr的伪代码:,举例Msr cpsr_c, #0xd3 /* 切换到SVC模式*/Msr cpsr_cxsf, r3 /* cpsr = r3 */,说明 user和system模式没有spsr

30、,因此这些模式下不能对spsr操作。 由于权限问题,在user模式下对cpsr23:0修改无效。 如果使用立即数,要使用合法的立即数。 程序不能通过“msr修改cpsr的T位”来完成ARM/Thumb态的切换。必须使用bx指令,因为bx属于分支指令,它会打断流水线,实现处理器状态切换。 如果要修改读出的值,仅修改必要的位,其它位保持不变,这样保持了最大兼容性。,3.3.4 跳转指令,指令的助记符格式:语法:B lableBL lable说明:寻址范围32MB,1.跳转指令,当转移指令执行时,处理器将指令中的offset(24bit)左移2bit,变成26bit,表示32M的范围。 pc从新的地

31、址执行,流水线重新填充。 如果是“bl”指令,将返回地址写入lr寄存器。子程序返回时只需要用lr恢复pc既可。 “b”指令不影响lr寄存器。,2。状态切换的跳转指令,指令的助记符格式:,BX , 目标地址寄存器。 Rm的位0不用来为地址的一部分。若Rm的位0为1,则将CPSR中的标志T置1,程序状态从ARM态切换为Thumb态。若Rm的位0为0,则Rm的位1就不能为1 。,BLX BLX lable,用法: 将下一条指令的地址拷贝到R14中; 转移到lable或Rm中的地址; 若下面两条中的任何一条成立,则将指令集切换到Thumb,即,Rm的位0为1; 使用 BLX label 形式。,跳转范

32、围 限制在当前指令的32M字节地址内。,举例,B Loop BLE nq+8 BL bubc BLLT rtx BX R7 BXVS R0 BLXNE R2 BLX thumbsub,3.3.5 Load/Store指令,Load/Store指令是内存访问指令,Load用于把 内存中数据装载到寄存器中,而Store则用于把 寄存器中的数据存入内存。Load/Store指令分为3类:,单数据访存指令多(批量)数据访存指令寄存器和存储器交换指令,1.单数据(单寄存器)访存指令,功能,LDR指令用于从内存中读取单一数据存入寄 存器中;STR指令用于将寄存器中的单一数据 保存到内存。,类型,字和无符号

33、字节加载/存储指令 半字和有符号字节加载/存储指令,字和无符号字节加载/存储指令,助记符,读写字: LDRT/STRT 读写无符号字节: LDRBT/STRBTT为可选后缀。若有T,无论处理器处于何种模式,都 将该指令当作一般用户模式下的内存操作。,指令编码格式,地址偏移量,立即数:是个无符号数值,可加/减到基址寄存器中。 寄存器:寄存器中的数值可加/减到基址寄存器中。 寄存器及一个移位常数:寄存器中的数值可以根据指令中的移位标志及移位常数作一定的移位操作,生成一地址偏移量。地址偏移量可加/减到基址寄存器中。,ldr|strb,#! ldr|strb,!ldr|strb,#! ldr|strb

34、,#ldr|strb,ldr|strb,#,指令的助记符格式:,说明: 无论如何,pc都不能作Rm。 无叹号的前变址,当pc作为Rn时,内存基地址为当前指令地址加8;后变址或有叹号的前变址,当pc作为Rn时,会产生不可预知的结果。 后变址或有叹号的前变址,如果Rn和Rd是同一个寄存器,会出现不可预知的结果。 如果immed_5超过31,编译器报错。 如果immed_12超过0xfff,编译会出错。,举例 Ldrb r0,r1,#0xfff /* 把r10xfff地址的字节读入r0 */ Ldr r0,r1,r2! /*把r1r2地址的32比特数读入r0,然后r1= r1r2 */ Str r0

35、,r1,r2,LSL #31 /* 把r0(32bit)写到地址r1(r231)*/ ldr r0,r1,#0xfff /* 把r1地址的数读入r0,然后r1=r10xfff */ ldr r0,r1,r2 /* 把r1地址的数读入r0,然后r1=r1r2 */ ldr r0,r1,r2,LSL #31 /* 把r1地址的数读入r0,然后r1=r1+(r231)*/,说明ldr/str 读/写一个32bit字到/从一个32bit的寄存器,要求读/写地址字对齐。Ldrb 读一个8bit字节到一个32bit的寄存器,不要求地址对齐,寄存器的高24位清零。Strb 将寄存器的低8位,写入内存的某个地

36、址,不要求地址对齐。,半字和有符号字节加载/存储指令,读写无符号半字:LDRH/STRH 读有符号半字: LDRSH 读有符号字节: LDRSB,助记符,指令编码格式,addr_mode 指令的寻址方式 S 1表示有符号访问,为0表示无符号访问; H 1表示半字访问,为0表示字节访问;,指令助记符格式同第一类指令说明 ldrh:读取16bit半字到一个32bit寄存器,要求地址半字对齐,目标寄存器的高16bit清零。 strh:将寄存器的低16bit存放到内存中,要求地址半字对齐。 ldrsh:将内存中的一个16bit半字读到一个32bit寄存器中,要求地址半字对齐。寄存器高16bit根据符号

37、位扩展。 ldrsb:将内存中的一个8bit字节读到一个32bit寄存器中,寄存器高24bit根据符号位扩展,不要求地址对齐。,LDRSB R1,R0,R3 ;将R0+R3地址上的字节数据存入R1,;高24位用符号扩展 LDRH R6,R2,#2 ;将R2指向地址的半字数据存入R6, 高16位用0扩展读出后,R2=R2+2 STRH R1,R0,#2! ;将R1的半字数据保存到R0+2地址,;只修改低2字节数据,然后R0=R0+2,举例,2.批量Load/Store指令,批量Load/Store指令也称为多寄存器传送指令。批量访存指令可以实现一组(116)寄存器和一块(464字节)连续内存单元

38、之间的数据传输。,LDM 加载多个寄存器;STM 存储多个寄存器。,批量Load/Store的指令编码格式,寻址方式,在批量Load/Store内存访问指令中,支持 堆栈寻址 块拷贝寻址,ldm|stm!,有8种:,指令的助记符格式,IA(Increment After) 事后递增 IB(Increment Before) 事先递增 DA(Decrement After) 事后递减 DB(Decrement Before) 事先递减 FD(Full Decrement) 满递减 ED(Empty Decrement) 空递减 FA(Full Aggrandizement) 满递增 EA(Emp

39、ty Aggrandizement)空递增,:可选后缀。允许在用户模式或系统模式下使用。它有以 下两个功能: 若op是LDM且寄存器列表包含R15时,那么除了正常的多寄存器传送外,还将SPSR也复制到CPSR中。这用于异常处理返回,仅在异常模式下使用。 数据传入或传出的是用户模式下的寄存器,而不是当前模式的寄存器。,模拟压栈操作,ARM指令集中没有用于栈的操作指令,但可由批量Load/Store指令来实现。,模拟出栈操作,更新基地址的load-store指令对,批量load-store指令的寻址模式起始、结束地址的影响,注:N是操作寄存器的个数,例子,ldmia r0,r5-r8 /*将内存中

40、(r0)到(r0+12)4个字读取到r5r8的4个寄存器中*/ ldmib r0,r5-r8 /*将内存中(r0+4)到(r0+16)4个字读取到r5r8的4个寄存器中*/ ldmda r0,r5-r8 /*将内存中(r0-12)到(r0)4个字读取到r5r8的4个寄存器中*/ ldmdb r0,r5-r8 /*将内存中(r0-16)到(r0-4)4个字读取到r5r8的4个寄存器中*/,说明 递增方式和递减方式处理寄存器列表和内存地址对应关系时采用不同的顺序,可以总结为:编号低的寄存器对应低内存地址。 pc不能作为stm指令的,否则结果不可预知。 !表示执行后将更新。 “”不能在usr和sys

41、tem模式下使用,否则结果不可预知。在其它模式下使用时,含义和寄存器列表是否包含pc有关。,批量(多数据)访存的程序例子,/*r12指向源数据起点*/*r14指向源数据终点*/*r13指向目标地址*/ Loop:ldmia r12!,r0-r11/*读48个字节*/stmia r13!,r0-r11/*写48个字节*/cmp r12,r14/*是否到末尾?*/bne loop/*没到重复循环*/,3.寄存器和存储器交换(信号量操作)指令,信号量操作指令用于进程间的同步和互斥,提供对信号量的原子操作。指令的助记符格式 swp|swpb , , 寄存器包含将保存到内存中的数据寄存器中包含将要访问的

42、内存地址,功能,SWP指令用于将一个内存单元的内容读取到一个寄 存器Rd中,同时将另一个寄存器Rm的内容写入到该内 存单元中。使用SWP可实现信号量操作。,例子 swp r1, r2, r3 /* 将内存单元(r3)中的字读取到r1,同时将r2中的数据写入内存单元(r3)中*/ swp r1, r1, r2 /* 将r1寄存器内容与内存单元(r2)的内容互换*/swpb r1,r2,r3/* 将内存单元(r3)的字节数据读取到r1中,r1高24位为0,同时将r2的低8位写入到内存单元(r3)中。*/ 说明:swpb读取8bit数据到寄存器后,会对高24位清零,写到内存的8bit数来自寄存器低8

43、位。,3.3.6 异常中断指令,异常中断产生指令用于系统调用和调试。ARM有两条异常中断产生指令:,软中断指令SWI 断点中断指令BKPT,1.软中断指令,指令编码格式,cond,1 1 1 1,31,28 27,24 23,0,Immed_24,Immed_24 24位立即数,系统调用号。,说明 主要用于用户程序调用操作系统的API。参数传递通常有两种方法: 指令中的24bit立即数指定API号,参数通过寄存器传递。 忽略指令中的24bit立即数,r0指定API号,其它参数通过其它寄存器传递。,swi ,指令的语法格式,2. 断点中断指令,指令的语法格式BKPT immed_16 16位立即

44、数,被调试软件用来保存额外的断点信息。 说明 用于产生软件断点中断; 主要用于调试; ARMv5以上版本支持。,3.3.7 协处理器指令,ARM体系结构支持通过增加协处理器来扩展指令集的机制。ARM体系支持16个协处理器。ARM协处理器具有它们自己的专用寄存器组,它们的状态由控制ARM寄存器的指令的镜像指令来控制。,三类协处理器指令协处理器的数据操作指令;协处理器的数据传送指令;协处理器的寄存器传送指令。,1. 协处理器的数据操作,用于控制数据在协处理器寄存器内部的操作,可改变协处理器的状态。指令编码格式,指令助记符格式CDP,,说明该指令是ARM处理器用于通知ARM协处理器执 行特定操作,该

45、操作中不涉及ARM寄存器和内存 单元。,协处理器的数据传送指令从存储器读取数据装入协处理器寄存器或将协处理器寄存器的数据存入存储器。ARM产生存储器地址,协处理器控制传送的字数。,2.协处理器的数据传送,指令编码格式,指令助记符格式LDC/STCL,CRd,Rn,!LDC/STCL,CRd,Rn,LDC从存储器中读取数据装入协处理器寄存器。 STC将协处理器寄存器的数据存储到存储器。 L选择数据类型,如存在,选择长数据类型(N=1)。 是8位带符号数。,说明 该指令可用于任何可能存在的协处理器。如果无协处理器接收,将产生未定义指令异常中断,可使用软件仿真协处理器。地址计算在ARM中进行。字的传

46、送数目由协处理器控制。在数据传送过程中,ARM 将不影响中断请求。最大传送长度限制在16字。,3.协处理器的寄存器传送,指令功能该类指令完成ARM和协处理器寄存器之间 的数据传送。指令编码格式,指令的语法格式MRC/MCR ,,Rd,CRn,CRm, MCR将ARM寄存器中的数据传送到协处理器寄存器中。 MRC将协处理器寄存器中的数据传送到ARM的寄存器中。 说明若将PC定义为目的寄存器Rd,则由协处理器 产生32位整数的最高4位将被存放在CPSR中的N 、Z、C和V中。,伪指令,ARM中的伪指令在汇编编译器对源程序进行汇编处理时,被替换成对应的ARM或Thumb指令(序列)。伪指令的类型 ADR(小范围的地址读取伪指令) ADRL(中等范围的地址读取伪指令) LDR(大范围的地址读取伪指令) NOP,1 ADR小范围的地址读取伪指令,功能将基于PC的地址值或基于寄存器的地址值读 取到寄存器中。指令的语法格式ADR cond register, exprregister 目标寄存器 expr 基于PC或基于寄存器的地址表达式,取址范围为: 非字对准地址,在-255255字节范围内 字对准地址,在-10201020字节范围内,用法,在汇编时,ADR被汇编成一条指令。汇编器 产生一条ADD或SUB指令来加载地址。若不能用 一条指令来实现ADR的功能,则产生错误,汇 编失败。,

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

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

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


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

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

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