(完整版)《ARM嵌入式系统结构与编程》第三章课后答案.pdf
第第 3 3 章章 ARMARM 指令集寻址方式指令集寻址方式1.1.在指令编码中,条件码占几位,最多有多少个条件,各个条件是如何形成的?在指令编码中,条件码占几位,最多有多少个条件,各个条件是如何形成的?答:条件码占 4 位,最多有 15 个条件操作码0000000100100011010001010110011110001001101010111100110111101111条件助记符标志EQNECS/HSCC/LOMIPLVSVCHILSGELTGTLEALNVZ=1Z=0C=1C=0N=1N=0V=1V=0C=1,Z=0C=0,Z=1N=VN!=VZ=0,N=VZ=1,N!=V任何任何含义相等不相等无符号数大于或等于无符号数小于负数正数或零溢出没有溢出无符号数大于无符号数小于或等于有符号数大于或等于有符号数小于有符号数大于有符号数小于或等于无条件执行(指令默认条件)从不执行(不要使用)2.2.指令条件码中,指令条件码中,V V 标志位在什么情况下才能等于标志位在什么情况下才能等于 1 1?答:V溢出标志位对于加减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1 表示符号位溢出,其他指令通常不影响V 位。3.在 ARM 指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合法则写出在指令中的编码格式(也就是8 位常数和 4 位移位数)0 x54300 x1080 x3040 x5010 xfb100000 x3340000 x3FC0000 x1FE00000 x55800000 x7F800 0 x39C0000 x1FE80000答:立即数必须由 1 个 8 位的常数通过进行 32 位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即一个8位的常数通过循环右移2*rotate_4位(即0,2,4,。30)得到0X54300000,0000,0000,0000,0101,0100,0011,0000 非法立即数0X1080000,0000,0000,0000,0000,0001,0000,10000 x42 循环右移 30 位(rotate_4=0 xF)0X3040000,0000,0000,0000,0000,0011,0000,01000 xC1 循环右移 30 位(rotate_4=0 xF)0 x5010000,0000,0000,0000,0000,0101,0000,0001非法立即数0 xfb100000000,1111,1011,0001,0000,0000,0000,0000 非法立即数0 x3340000000,0000,0011,0011,0100,0000,0000,00000Xcd 循环右移 18 位(rotate_4=0 x9)0 x3FC0000000,0000,0011,1111,11 00,0000,0000,00000XFF 循环右移 18 位(rotate_4=0 x9)0 x1FE00000000,0001,1111,111 0,0000,0000,0000,0000非法立即数0 x55800000000,0101,0101,1000,0000,0000,0000,0000非法立即数0 x7F8000000,0000,0000,0111,1111,1 000,0000,0000非法立即数0 x39C0000000,0000,0011,1001,1100,0000,0000,00000XE7 循环右移 18 位(rotate_4=0 x9)0 x1FE800000001,1111,1110,1000,0000,0000,0000,0000 非法立即数4.分析逻辑右移,算术右移,循环右移,带扩展的循环右移它们间的差别。答:LSLLSL 逻辑左移逻辑左移:3100LSRLSR 逻辑右移逻辑右移:3100ASRASR 算术右移算术右移:310RORROR 循环右移循环右移:310RRXRRX 带扩展的循环右移:带扩展的循环右移:31C05.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)IA(Increment After):每次数据传送后地址加:每次数据传送后地址加 4 4;先增先增 IB(Increment Before)IB(Increment Before):每次数据传送前地址加:每次数据传送前地址加 4 4;后减后减 DA(Decrement After)DA(Decrement After):每次数据传送后地址减:每次数据传送后地址减 4 4;先减先减 DB(Decrement Before)DB(Decrement Before):每次数据传送前地址减:每次数据传送前地址减 4 4;8.栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而得出栈操作指令寻址和块拷贝 Load/Store 指令之间的对应关系。答:根据堆栈指针的指向位置不同和堆栈的生长方向不同,共有4 种类型的堆栈工作方式:满递增堆栈 FA:堆栈指针指向最后压入的数据,且由低地址向高地址生成。满递减堆栈 FD:堆栈指针指向最后压入的数据,且由高地址向低地址生成。空递增堆栈 EA:堆栈指针指向下一个要放入数据的空位置,且由低地址向高地址生成。空递减堆栈 ED:堆栈指针指向下一个要放入数据的空位置,且由高地址向低地址生成。9.分析协处理器加载/存储指令的寻址方式种的内存地址索引格式中不同的汇编语法格式下内存地址的计算方法。答:协处理器加载/存储指令的寻址方式种的内存地址索引格式中,索引格式类似于LDR/STR指令寻址中的立即数作为地址偏移量的形式。Addressing_mode 中的偏移量为 8 位立即数的汇编语法格式有以下 3 种:前变址不回写形式:,#+/-*4 第一个内存地址编号为基地址寄存器 Rn 值加上/减去 imm_offset8 的 4 倍,后续的每一个地址是前一个内存地址加4,直到协处理器发出信号,结束本次数据传输为止。前变址回写形式:,#+/-*4!第一个内存地址编号为基地址寄存器 Rn 值加上/减去 imm_offset8 的 4 倍,后续的每一个地址是前一个内存地址加 4,直到协处理器发出信号,结束本次数据传输为止。当指令执行时,生成的地址值将写入基址寄存器。后变址回写形式:,#+/-*4内存地址为基址寄存器 Rn 的值,当存储器操作完成后,将基地址寄存器Rn 值加上/减去 imm_offset8 的 4 倍,后续的每一个地址是前一个内存地址加 4,直到协处理器发出信号,结束本次数据传输为止。最后将 Rn 值加上/减去 imm_offset8 的 4 倍写回到基址寄存器 Rn(更新基地址寄存器)。1.写出下列指令的机器码,并分析指令操作功能。MOVR0,R1MOVR1,,0X198ADDEQS R1,R2,,0 xABCMPR2,#0XabLDRR0,R1,#4STRR0,R1,R1,LSL#2!LDRHR0,R1,#4LDRSB R0,R2,#-2!STRBR1,R2,#0Xa0LDMIA R0,R1,R2,R8STMDB R0!,R1-R5,R10,R11STMED SP!R0-R3,LR答:机器码部分略。MOVR0,R1;R0-R1MOVR1,,0X198;R0-0X198ADDEQS R1,R2,,0 xAB;当 Z=1 时,R1-R2+0 xAB 并影响标志位CMPR2,#0Xab;R2-0 xAB,并影响标志位LDRR0,R1,#4;R0-【R1+4】STRR0,R1,R1,LSL#2!;【R1+R1*4】-R0,R1=R1+R1*4LDRHR0,R1,#4;R0-【R1+4】半字,R0 的高 16 位清零LDRSB R0,R2,#-2!;R0-【R2-2】字节,R0 有符号扩展为 32 位,R2=R2-2STRBR1,R2,#0Xa0;【R2+0Xa0】-R1 低 8 位,LDMIA R0,R1,R2,R8;将内存单元【R0】【R+11】以字为单位读取到R1,R2,R8 中STMDB R0!,R1R5,R10,R11将寄存器 R1R5,R10,R11 的值以字为单位依次写入【R0】中,每写一个字之前R0=R04STMED SP!R0R3,LR将寄存器 R0R3,LR 的的值以字为单位依次写入【SP】中,每写一个字之后SP=SP4