第3讲arm指令集寻址方式

上传人:今*** 文档编号:107587101 上传时间:2019-10-20 格式:PPT 页数:68 大小:967KB
返回 下载 相关 举报
第3讲arm指令集寻址方式_第1页
第1页 / 共68页
第3讲arm指令集寻址方式_第2页
第2页 / 共68页
第3讲arm指令集寻址方式_第3页
第3页 / 共68页
第3讲arm指令集寻址方式_第4页
第4页 / 共68页
第3讲arm指令集寻址方式_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《第3讲arm指令集寻址方式》由会员分享,可在线阅读,更多相关《第3讲arm指令集寻址方式(68页珍藏版)》请在金锄头文库上搜索。

1、第3章ARM指令集寻址方式,ARM指令寻址方式可分为四大类: 数据处理指令寻址 Load/Store指令的寻址 批量Load/Store指令的寻址 协处理指令寻址。,内容提要,31 ARM指令的编码格式 32 数据处理指令寻址方式 33 Load/Store指令寻址 34 批量Load/Store指令寻址方式 35 协处理器指令寻址方式,31 ARM指令的编码格式,每条ARM指令占有4个字节,其指令长度为32位,cond(bit31:28) 指令执行的条件码,几乎所有的ARM指令都可以根据当前程序状态寄存器CPSR中标志位的值,有条件地执行。 ARM指令的条件域有16种类型。,指令条件码,00

2、00 EQ 相等 Z=1 0001 NE 不相等 Z=0 0010 CS/HS 无符号大于等于 C=1 0011 CC/LO 无等号小于 C=0 0100 MI 负数 N=1 0101 PL 非负数 N=0 0110 VS 上溢出 V=1 0111 VC 没有上溢出 V=0 1000 HI 无符号数大于 C=1且Z=0 1001 LS 无符号小于等于 C=0或Z=1 1010 GE 有符号数大于等于 N=1且V=1 或 N=0且V=0 1011 LT 有符号数小于 N=1且V=0 或 N=0且V=1 1100 GT 有符号数大于 Z=0且N=V 1101 LE 有符号数小于/等于 Z=1或N!

3、=V 1110 AL 无条件执行,一般编码格式,每条ARM指令占有4个字节,其指令长度为32位,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件

4、码; type(bit27:26) 指令类型码,type(bit27:26) 指令类型码 根据其编码的不同代表各类型的指令,一般编码格式,每条ARM指令占有4个字节,其指令长度为32位,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码

5、; type(bit27:26) 指令类型码,cond(bit31:28) 指令执行的条件码; type(bit27:26) 指令类型码,I(bit25) 第二操作数类型码。 I=1表示第二操作数是立即数 I=0表示第二操作数是移位寄存器 opcode(bit24:21) 指令操作码 S (bit20) 决定指令的操作结果是否影响CPSR; Rn (bit19:16) 包含第一个操作数的寄存器编码; Rd (bit15:12) 目标寄存器编码; Operand2(bit11:0) 指令第二个操作数。,ARM汇编指令语法格式: S, 例如,指令 ADDEQS R1,R2,5,3.2 数据处理指令

6、寻址方式,数据处理指令第2操作数的构成方式 立即数方式 寄存器方式 寄存器移位方式 具体寻址类型 第二操作数为立即数 第二操作数为寄存器 第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数 第二操作数为寄存器移位方式,且移位数值放在寄存器中 第二操作数为寄存器进行RRX移位得到,具体寻址类型,1第二操作数为立即数 汇编语法格式:# 立即数要以“#”号为前缀,16进制数值时以“0x”表示。,每个立即数由一个8位的常数进行32位循环右移偶数位得到(8位位图),循环右移的位数由一个4位二进制的两倍表示。即: =immed_8进行32位循环右移(2*rotate_4)位,AND R1,R2,#

7、0xff 当处理器处理第二操作数0xff时,因为0xff为8位二进制数,所以处理器就将其直接放进8位“基本”数中,而4位“移位”数则为0. AND R1,R2,#0x104 当处理器处理这条指令的第二操作数0x104时,因为此时0x104已经超过了8位二进制数,所以处理器就要将其“改造”一下: 0x104 = 0000 0000 0000 0000 0000 0001 0000 0100, 这个数是0000 0000 0000 0000 0000 0000 0100 0001通过循环右移30位得到的,因此8位“基本”数中存放0100 0001,而“移位”数为15。 AND R1,R2,#0xf

8、f000000 当处理器处理这条指令的第二操作数0xff000000时,同样对其“改造”,0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000, 这个数是 0000 0000 0000 0000 0000 0000 1111 1111通过循环右移8位得到的,因此8位“基本”数中存放1111 1111,而“移位”数为4。,注意: 要用一个12位的编码来表示任意的32位数是绝对不可能的,只有在表示数的数量上做限制。 在12位的中,8位存数据,4位存移位的次数。 8位存数据(0255):解释了“该常数必须对应8位位图” 。 4位存移位的次数(015

9、,对应的移位位数030位):4位只有16种可能值,而32位数可以循环移位32次,那就只好限制只能移偶数位,这样解决了能表示的情况是实际情况一半的矛盾。也就是说若“移位”数为0,则表示“基本”数不变,若“移位”数为1,则表示将“基本”数右移2位。 所以对immed_8r常数表达式的限制是解决指令编码的第二个操作数位数不足以表示32位操作数的无奈之举。,同时按照上面的构造方法,一个合法的立即数可能有多种编码方式。 如0x3f0是一个合法的立即数,它可以采用下面两种的编码方式: immed_8=0x3f=0000 0000 0000 0000 0000 0000 0011 1111 rotate_i

10、mm=0xe=14(十进制) 2*14=28 0x3f循环右移28位得到如下结果: 0000 0000 0000 0000 0000 0011 1111 0000=0x3f0 immed_8=0xfc=0000 0000 0000 0000 0000 0000 1111 1100 rotate_imm=0xf=15(十进制) 2*15=30 0xfc循环右移30位得到如下结果: 0000 0000 0000 0000 0000 0011 1111 0000=0x3f0 可以看出,结果是一样的!,由于这种立即数的构造方法中包含循环移位操作,而循环移位操作会影响CPSR的条件标志位C。因此,同一个

11、合法的立即数由于采用了不同的编码方式,将使得某些指令的执行产生不同的结果,这是不能允许的。 ARM汇编编译器按照下面的规则生成立即数的编码。 1.当立即数数值在0和0xFF范围时,immmed_8=,rotate_imm=0.、 2.其他情况下,汇编编译器选择使rotate_imm数值最小的编码方式。所以0x3f0的正确表示法是第一种。,再举些反例: 0x101 = 0000 0000 0000 0000 0000 0001 0000 0001,这个数无论向右循环几位,都无法将两个1同时放到低8位中,因此不符合8位位图 0x102 = 0000 0000 0000 0000 0000 0001

12、 0000 0010,这个数如果将两个1同时放到低8位中,即转换成二进制后为0000 0000 0000 0000 0000 0000 1000 0001,但需要将此二进制数向右移31位,这也不符合循环右移偶数位的条件 0xff1 = 0000 0000 0000 0000 1111 1111 0001,这个数有9个1,不可能将其同时放入8位中,因此当然也不符合,总结: 判断一个立即数是否合法 首先看这个数的二进制表示中1的个数是否不超过8个; 如果不超过8个, 再看这n个1(n=8)是否能同时放到8个二进制位中; 如果可以放进去, 再看这8个二进制位是否可以循环右移偶数位得到我们欲使用的数.

13、 如果可以, 则此数是合法的立即数. 否则, 不符合. 无法表示的立即数, 只有通过逻辑或算术运算等其它途径获得 如0xffffff00, 可以通过0x000000ff按位取反得到.,2第二操作数为寄存器 汇编语法格式:,举例如下: MOV R1,R2 ;将R2的值存入R1 SUB R0,R1,R2 ;(R1)(R2) R0,寄存器移位方式:操作数由寄存器的数值做相应的移位而得到。 在ARM指令中移位操作包括:逻辑左移LSL、逻辑右移LSR、算术左移ASL(同LSL)、算术右移ASR、循环右移ROR和带扩展的循环右移RRX。,注意: 移位操作在ARM指令集中不作为单独的指令使用,3第二操作数为

14、寄存器移位方式,且移位的位数为一个5位的立即数 汇编语法格式:, #,举例如下: MOV R0, R2, LSL #3 ;R2的值左移3位,结果放入R0,;即是R0=R28,MOV R0,R2,LSL #3,0x08,0x08,逻辑左移3位,4第二操作数为寄存器移位方式,且移位数值放在寄存器中 汇编语法格式:, ,举例如下: ANDS R1, R1, R2, LSL R3 ;R2的值左移R3位,然后和R1相“与”操作,结果放入R1,5第二操作数为寄存器进行RRX移位得到 汇编语法格式:,RRX,操作数OPR2由寄存器Rm中的数值进行带扩展的循环右移一位,并用CPSR中的C条件标志位填补空出的位

15、,CPSR的C条件标志位则用移出的位代替.,3.3 Load/Store指令寻址,Load/Store指令是对内存进行存储/加载数据操作的指令,根据访问的数据格式的不同,将这类指令的寻址分为: 字、无符号字节的Load/Store指令寻址 半字、有符号字节Load/Store指令寻址,地址计算方法,1寄存器间接寻址 寄存器中的值是操作数的地址,而操作数本身存放在存储器中。 举例如下: LDR R1,R2 ;将R2指向的存储单元的数据读出保存在R1中 SWP R1,R1,R2 ;将寄存器R1的值和R2指定的存储单元的内容交换,LDR R0,R2,0xAA,2. 基址加变址寻址 前变址法(先计算可选更新再访问):基址寄存器中的值和地址偏移量先作加减运算,生成的操作数作为内存访问的地址。 后变址法(先访问再计算更新):将基址寄存器中的值直接作为内存访问的地址进行操作,内存访问完毕后基址寄存器中的值和地址偏移量作加减运算,并更新基址寄存器。,举例如下: LDR R2, R3,#0x0C ; 前变址, 传数前计算地址 ;读取R3+0x0C地址上的存储单元的内容,放入

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号