嵌入式Wayne 第二章答案

Q2-0 RISC和CISC指令的特点和区别

RISC相比CISC具有指令等长或定长,基于寄存器文件的多个通用寄存器,使用Load和Store 进行存储器访问。

Q2-1 高序和低序表示法的不同

低序表示法: 在字的最低位中存放最低位字节

高序表示法:在字的最高位中存放最低位字节

Q2-2 哈佛结构和冯.诺依曼结构有什么不同

数据和指令都存储在同一存储器中的计算机称为冯.诺依曼机

为数据和程序提供了各自独立的存储器,程序计数器指向程序存储器而不指向数据存储器称为哈佛结构

Q2-3 关于ARM程序设计模型的问题:

a.模型中有多少通用寄存器?

ARM有16个通用寄存器,r0-r15,其中r15还可以用作程序计数器

b.CPSR的作用是什么

程序状态寄存器,包含了条件码标识、中断禁止位、当前处理器模式和其他状态\控制信息,其中条件码标识在进行算术、逻辑或移位运算的过程中被设置。

C.Z位的作用

如果运算结果的每一位都为0,则CPSR的Z位置1

D.程序计数器保存在哪

r15寄存器

Q2-4 下列操作完成之后ARM状态字是怎样的

A.2-3

0x00000002+0xfffffffd=0xffffffff N=1, Z=0,C=0,V=0;

B. -231+1 -1

0x80000001(-231+1)+0xffffffff(-1) =0x80000000, N=1,Z=0,C=1,V=0

C. -4+5

0xffff fffc+0x00000005=0x00000001,N=0,Z=0,C=1,V=0

Q2-5 用ARM汇编代码实现下列C赋值语句

A:x=a-b

ADR r4,a

LDR r0,[r4]

ADR r4,b

LDR r1,[r4]

SUB r3,r0,r1

ADR r4,x

STR r3, [r4]

B y=(c-d)+(e-f)

ADR r4,c

LDR r0,[r4]

ADR r4,d

LDR r1,[r4]

SUB r2,r0,r1

ADR r4,e

LDR r0,[r4]

ADR r4,f

LDR r1,[r4]

SUB r3,r0,r1

ADD r0,r2,r3

ADR r4, y

STR r0, [r4]

C z=a*(b+c)-d*e

ADR r4,b

LDR r0,[r4]

ADR r4,c

LDR r1,[r4]

ADD r2,r0,r1 ; result of b+c in r2

ADR r4,a

LDR r0,[r4]

MUL r3,r0,r2; result of a*(b+c) in r3

ADR r4,d

LDR r0,[r4]

ADR r4,e

LDR r1,[r4]

MUL r2,r0,r1 ; result of d*e in r2

SUB r0,r3,r2 ;

ADR r4, z

STR r0, [r4]

Q2-6 这些ARM的条件代码是什么意思?

EQ 含义是相等,当Z=1时

NE 不等,当Z=0时

MI 结果为负,当N=1

VS 结果为溢出,当V=1

GE 带符号的大于或等于,N与V相等(N=1,V=1,或N=0,V=0)LT 带符号的小于,N与V不相等

HI 无符号大于

LS 无符号小于或等于

Q2-7 编写ARM 汇编代码,先读然后写一个映射到0x2100处的设备存储器LDR r4, #2100

LDR r0, [r4] ; 从0X2100处读

ADR r1, mem1;如mem1为一个变量

LDR r0,[r1]

STR r0,[r4]; 将mem1的数值设备

LDR r1, = mem1;如mem1是一个表示地址的任意数据

LDR r0,[r1]

STR r0,[r4]; 将mem1的数值设备

Q2-8 参考教材的示例3.4(为C实现方式)

Q2-9 可参考教材示例2.3的实现

Q2-10

a.for (i=0;i<20,i++)

z[i]=a[i]*b[i];

MOV r0,#0; use r0 for i, set to 0

MOV r1,#20;

ADR r2,a ; use r2 with the address of base of a array

ADR r3,b ; use r3 with the address of base of a array

ADR r4,z ; use r4 with the address of base of a array

Loop LDR r5,[r2,r0];

LDR r6,[r3,r0];

MUL r7,r5,r6;

STR r7,[r4,r0];

ADD r0,r0,#1;

CMP r0,r1

BLT loop

Loopend

b.for (i=0; i<20;i++)

for(j=0;j<10;j++)

z[i,j]=a[i][j]*b[i]

MOV r0,#0; use r0 for i, set to 0

MOV r8,#0; use r8 for index,set to 0

ADR r2,a ; use r2 with the address of base of a array

ADR r3,b ; use r3 with the address of base of a array

ADR r4,z ; use r4 with the address of base of a array

Loop MOV r1,#0; use r1 for j, set to 0;

Loop1 LDR r5,[r2,r8]; get a[i,j]

LDR r6,[r3,r0]; get b[i]

MUL r7,r5,r6; get a[I,j]*b[i]

STR r7,[r4,r8];

ADD r1,r1,#1;

ADD r8,r8,#1;

CMP r1,#10

BLT loop1

ADD r0,r0,#1;

CMP r0,#20;

BLT loop;

Loopend

Q2-11 解释BL指令的操作,包括操作前后的ARM寄存器状态

BL label1 则BL指令执行后,将当前PC值(指向BL的下一条语句)赋给r14, 将label1代表的地址赋给PC(r15),程序跳转到label1处执行。

Q2-12 如何从ARM过程返回

过程返回时,用栈中存放的过程调用下一条语句的地址更新PC或用link register(r14)来更新PC值。

Q2-13

下面该程序在ARM ADS下的编译结果,从编译结果看,在栈中保存的数据说明如下:

在main函数里

保存的是main函数执行完后的返回地址

对SCUM和baz函数的调用直接采用ARM APCS标准,使用r0~r3用于输入参数的传递,其中r0用于保存返回值

因为在SCUM中存储嵌套调用,所以在scum首先保存返回地址到栈中

对于foo和baz函数因为没有嵌套,所以过程调用直接采用BL指令,在返回时将r14赋给PC值。

嵌入式Wayne 第二章答案

下面是ARM GCC的编译结果,该编译器在函数调用将ARM APCS调用规定的寄存器进行了保存,采用帧指针和栈指针结合的访问方式。

000083b0 :

83b0: e52db004 push {fp} ; (str fp, [sp, #-4]!)

83b4: e28db000 add fp, sp, #0

83b8: e24dd00c sub sp, sp, #12

83bc: e50b0008 str r0, [fp, #-8]

83c0: e50b100c str r1, [fp, #-12]

83c4: e51b2008 ldr r2, [fp, #-8]

83c8: e51b300c ldr r3, [fp, #-12]

83cc: e0823003 add r3, r2, r3

83d0: e1a00003 mov r0, r3

83d4: e28bd000 add sp, fp, #0

83d8: e8bd0800 pop {fp}

83dc: e12fff1e bx lr

000083e0 :

83e0: e52db004 push {fp} ; (str fp, [sp, #-4]!)

83e4: e28db000 add fp, sp, #0

83e8: e24dd00c sub sp, sp, #12

83ec: e50b0008 str r0, [fp, #-8]

83f0: e51b3008 ldr r3, [fp, #-8]

83f4: e2833001 add r3, r3, #1

83f8: e1a00003 mov r0, r3

83fc: e28bd000 add sp, fp, #0

8400: e8bd0800 pop {fp}

8404: e12fff1e bx lr

00008408 :

8408: e92d4800 push {fp, lr}

840c: e28db004 add fp, sp, #4

8410: e24dd010 sub sp, sp, #16

8414: e50b0010 str r0, [fp, #-16]

8418: e3a03000 mov r3, #0

841c: e50b3008 str r3, [fp, #-8]

8420: ea000008 b 8448 8424: e51b2010 ldr r2, [fp, #-16]

8428: e51b3008 ldr r3, [fp, #-8]

842c: e0823003 add r3, r2, r3

8430: e1a00003 mov r0, r3

8434: e3a01005 mov r1, #5

8438: ebffffdc bl 83b0

843c: e51b3008 ldr r3, [fp, #-8]

8440: e2833001 add r3, r3, #1

8444: e50b3008 str r3, [fp, #-8]

8448: e51b3008 ldr r3, [fp, #-8]

844c: e3530002 cmp r3, #2

8450: dafffff3 ble 8424

8454: e24bd004 sub sp, fp, #4

8458: e8bd4800 pop {fp, lr}

845c: e12fff1e bx lr

00008460

:

8460: e92d4800 push {fp, lr}

8464: e28db004 add fp, sp, #4

8468: e3a00003 mov r0, #3

846c: ebffffe5 bl 8408

8470: e3a00002 mov r0, #2

8474: ebffffd9 bl 83e0

8478: e24bd004 sub sp, fp, #4

847c: e8bd4800 pop {fp, lr}

8480: e12fff1e bx lr

相关推荐
相关主题
热门推荐