ARM嵌入式系统结构与编程习题答案 清华大学出版社 最详细版 下载本文

6

上边程序中ORR指令执行时需要使用LDR指令加载后的R4寄存器,因此造成了ORR指令的等待。

编译器以及汇编程序员可以通过重新设计代码的顺序或者其他办法来减少互锁的数量。

第3章 ARM指令集寻址方式

1.在指令编码中,条件码占几位,最多有多少个条件,各个条件是如何形成的? 答:条件码占4位,最多有15个条件 操作码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 条件助记符 标志 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL NV Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1,Z=0 C=0,Z=1 N=V N!=V Z=0,N=V Z=1,N!=V 任何 任何 含义 相等 不相等 无符号数大于或等于 无符号数小于 负数 正数或零 溢出 没有溢出 无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 无条件执行 (指令默认条件) 从不执行(不要使用)

2. 指令条件码中,V标志位在什么情况下才能等于1? 答:V—溢出标志位 对于加减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1表示符号

6

7

位溢出,其他指令通常不影响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逻辑左移 :

3100

LSR逻辑右移 :

3100

ASR算术右移 :

7

8

310

ROR循环右移 :

310

RRX带扩展的循环右移:

31C0

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:堆栈指针指向下一个要放入数据的空位置,且由低地址向高地址生成。

8

9

空递减堆栈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(更新基地址寄存器)。

10. 写出下列指令的机器码,并分析指令操作功能。 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]

9

10

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

第4章 ARM指令集系统

1.ARM指令可分为哪几类?说出哪几条指令是无条件执行的。

答:ARM微处理器的指令集可以分为:数据处理指令,分支指令,加载/存储指令,批量加载/存储指令,交换指令,程序状态寄存器(PSR)处理指令,协处理器操作指令和异常产生指令八大类。

几乎所有的ARM指令都是可以有条件执行的。带链接和状态切换的跳转指令BLX,当目标地址由程序标号给出时,即:BLX

由于指令码中是没有条件编码位的,所以指令是无条件执行的。

2.如何实现两个64位数的加法操作,如何实现两个64位数的减法操作,如何求一个64位数的负数?

答:1)使用ADC实现64位加法,结果存于R1、R0中:

ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位 ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位

2)使用SBC实现64位减法,结果存于R1、R0中: SUBS R0,R0,R2 ; 低32位相减,并影响标志位 SBC R1,R1,R3 ;高32位相减,并减去低位借位

3)使用RSC指令实现求64位数值的负数 : RSBS R2,R0,#0 RSC R3,R1,#0

3.写出LDRB指令与LDRSB指令的二进制编码格式,并指出它们之间的区别。 答:LDRB指令的二进制编码格式:

10