第3章 ARM指令集寻址方式
1.在指令编码中,条件码占几位,最多有多少个条件,各个条件是如何形成的?
答:条件码占4位,最多有15个条件
操作码 | 条件助记符 | 标志 | 含义 |
0000 | 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=V | 有符号数大于或等于 |
1011 | LT | N!=V | 有符号数小于 |
1100志愿活动策划书 | GT | Z=0,N=V | 有符号数大于 |
1101 | LE | Z=1,N!=V | 有符号数小于或等于 |
1110 | AL | 任何 | 无条件执行 (指令默认条件) |
1111 | NV | 任何 | 从不执行(不要使用) |
| | | |
方位五行
2. 指令条件码中,V标志位在什么情况下才能等于1?
我的乐趣答:V—溢出标志位
对于加减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1表示符号位溢出,其他指令通常不影响V位。
3. 在ARM指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合法则写出在指令中的编码格式(也就是8位常数和4位移位数)
0x5430 0x108 0x304 0x501
0xfb10000 0x334000 0x3FC000 0x1FE0000
0x5580000 0x7F800 0x39C000 0x1FE80000
答:立即数必须由1个8位的常数通过进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即一个8位的常数通过循环右移2*rotate_4位(即0,2,4,。。。30)得到
0X5430
0000,0000,0000,0000,0101,0100,0011,0000 非法立即数
0X108
0000,0000,0000,0000,0000,0001,0000,1000 0x42循环右移30位 (rotate_4=0xF)
0X304
0000,0000,0000,0000,0000,0011,0000,0100 0xC1循环右移30位 (rotate_4=0xF)
0x501
0000,0000,0000,0000,0000,0101,0000,0001 非法立即数
0xfb10000
0000,1111,1011,0001,0000,0000,0000,0000 非法立即数
0x334000
0000,0000,0011,0011,0100,0000,0000,0000 0Xcd 循环右移18位(rotate_4=0x9)
0x3FC000
0000,0000,0011,1111,1100,0000,0000,0000 0XFF 循环右移18位(rotate_4=0x9)
0x1FE0000
0000,0001,1111,1110,0000,0000,0000,0000 非法立即数
0x5580000
0000,0101,0101,1000,0000,0000,0000,0000 非法立即数
0x7F800
0000,0000,0000,0111,1111,1000,0000,0000 非法立即数
0x39C000
0000,0000,0011,1001,1100,0000,0000,0000 0XE7循环右移18位(rotate_4=0x9)
0x1FE80000
0001,1111,1110,1000,0000,0000,0000,0000 非法立即数
4.分析逻辑右移,算术右移,循环右移,带扩展的循环右移它们间的差别。
答:LSL逻辑左移 :
LSR逻辑右移 :
ASR算术右移 :
ROR循环右移 :
RRX带扩展的循环右移:
5.ARM数据处理指令具体的寻址方式有哪些,如果程序计数器PC作为目标寄存器,会产生什么结果?
答:数据处理指令寻址方式具体可分为5种类型:
1)第二操作数为立即数2)第二操作数为寄存器3)第二操作数为寄存器移位方式且移位的位数为一个5位立即数4)第二操作数为寄存器移位方式且移位数值放在寄存器中5)第二操作数位寄存器进行RRX移位得到。如果PC (R15)用作目标寄存器,指令会产生不可预知的结果。
6.在Load/Store指令寻址中,字,无符号字节的Load/Store指令寻址和半字,有符号字节
寻址,试分析它们之间的差别。
答:在Load/Store指令寻址中,
字,无符号字节的Load/Store指令寻址中共有以下3种内存地址构成格式:
1)Addressing_mode 中的偏移量为立即数 2)Addressing_mode 中的偏移量为寄存器的值
3)Addressing_mode 中的偏移量通过寄存器移位得到
半字,有符号字节的Load/Store指令寻址中共有以下2种内存地址构成格式:
1)Addressing_mode 中的偏移量为立即数 2)Addressing_mode 中的偏移量为寄存器的值
7.块拷贝Load/Store指令在实现寄存器组合连续的内存单元中数据传递时,地址的变化方式有哪几种类型,并分析它们的地址变化情况。
答:批量Load/Store指令在实现寄存器组合连续的内存单元中数据传递时,地址的变化方式有以下4种类型:
⏹ 后增IA (Increment After) :每次数据传送后地址加4;
⏹ 先增IB (Increment Before) :每次数据传送前地址加4 ;
⏹ 后减DA (Decrement After) :每次数据传送后地址减4 ;
⏹ 先减DB (Decrement Before) :每次数据传送前地址减4 ;
8.栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而得出栈操作指令寻址和块拷贝Load/Store指令之间的对应关系。
答:根据堆栈指针的指向位置不同和堆栈的生长方向不同,共有4种类型的堆栈工作方式:
满递增堆栈FA:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
满递减堆栈FD:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
空递增堆栈EA:堆栈指针指向下一个要放入数据的空位置,且由低地址向高地址生成。
空递减堆栈ED:堆栈指针指向下一个要放入数据的空位置,且由高地址向低地址生成。
9.分析协处理器加载/存储指令的寻址方式种的内存地址索引格式中不同的汇编语法格式下内存地址的计算方法。
答:协处理器加载/存储指令的寻址方式种的内存地址索引格式中,索引格式类似于LDR/S
TR指令寻址中的立即数作为地址偏移量的形式。Addressing_mode中的偏移量为8位立即数的汇编语法格式有以下3种:
• 前变址不回写形式:[<Rn>,#+/-<imm_offt8>*4 ]
第一个内存地址编号为基地址寄存器Rn值加上/减去imm_offt8的4倍,后续的每一个地址是前一个内存地址加4,直到协处理器发出信号,结束本次数据传输为止。
• 前变址回写形式: [<Rn>,#+/-<imm_offt8>*4]!
第一个内存地址编号为基地址寄存器Rn值加上/减去imm_offt8的4倍,后续的每一个地址是前一个内存地址加4,直到协处理器发出信号,结束本次数据传输为止。当指令执行时,生成的地址值将写入基址寄存器。
• 后变址回写形式: [<Rn>],#+/-<imm_offt8>*4
内存地址为基址寄存器Rn的值,当存储器操作完成后,将基地址寄存器Rn值加上/减去imm_offt8的4倍,后续的每一个地址是前一个内存地址加4,直到协处理器发出信号,结
束本次数据传输为止。最后将Rn值加上/减去imm_offt8的4倍写回到基址寄存器Rn(更新基地址寄存器)。
1. 写出下列指令的机器码,并分析指令操作功能。
家常红烧鲫鱼MOV R0,R1
MOV R1,,0X198
ADDEQS R1,R2,,0xAB
CMP R2,#0Xab
LDR R0,[R1,#4]
北京落户积分细则STR R0,[R1,R1,LSL #2]!
LDRH R0,[R1,#4]
LDRSB R0,[R2,#-2]!
STRB R1,[R2,#0Xa0]
LDMIA R0,{R1,R2,R8}
STMDB R0!,{R1-R5,R10,R11}
STMED SP!{R0-R3,LR}
答:机器码部分略。
MOV R0,R1 ;R0《-----R1
MOV R1,,0X198 ;R0《----0X198
ADDEQS R1,R2,,0xAB ;当Z=1时,R1《---R2+0xAB 并影响标志位
CMP R2,#0Xab ;R2-0xAB,并影响标志位
LDR R0,[R1,#4] ;R0《---【R1+4】
STR R0,[R1,R1,LSL #2]! ;【R1+R1*4】《---R0,R1=R1+R1*4
LDRH R0,[R1,#4] ;R0《---【R1+4】半字,R0的高16位清零
LDRSB R0,[R2,#-2]! ;R0《---【R2-2】字节,R0有符号扩展为32位,R2=R2-2
STRB R1,[R2,#0Xa0] ;【R2+0Xa0】《----R1低8位,
LDMIA R0,{R1,R2,R8}
;将内存单元【R0】~【R+11】以字为单位读取到R1,R2,R8中
STMDB R0!,{R1-R5,R10,R11}
将寄存器R1~R5,R10,R11的值以字为单位依次写入【R0】中,每写一个字之前R0=R0-4
STMED SP!{R0-R3,LR}
将寄存器R0~R3,LR的的值以字为单位依次写入【SP】中,每写一个字之后SP=SP-4
手工制作小兔子灯笼