type
status
date
slug
summary
tags
category
icon
password
第 4 章 ARM 伪指令及编程基础(共 125 分)
一、简述指令与伪指令的本质区别是什么? (4 分)
指令是被计算机硬件直接执行的命令,而伪指令是在汇编程序中使用的一种方便的命令形式,最终会被转换为实际的指令
二、简述伪指令的作用是什么?(8 分)
程序定位的作用
为非指令代码进行定义
为程序完整性做标注
有条件的引导程序段
三、简述宏指令与伪指令的主要区别是什么?(4 分)
在汇编时,这些宏指令被替换成一条或两条真正的ARM或Thumb指令。而伪指令经编译后没有指令代码。
四、简述伪指令 LTORG 的主要作用和目的。(6 分)
伪指令 LTORG 用来说明某个存储区域为一个用来暂存数据的数据缓冲区,也叫文字池或数据缓冲池。
目的:防止在程序中使用 LDR 之类的指令访问时,可能产生的越界。
五、定义一个内存表(12分)
其首地址为固定地址 8192,该内存表中包含5个数据域:consta 长度为 4 字节,constb 长度为 4 字节,x 长度为 8 字节,y 长度为 8字节,string 长度为 16 字节
六、在列表中查找指定的数据(23 分)
要求如下:
(1) 定义一个存储单元首地址名为 Start 的数据列表,该数据列表包含 5 个字存储单元。第一个单元是列表中数据的数量,其值为 4,即列表中包含 4 个数据。后面四个单元存储的是列表中的 4 个数据:0x0138A, 0x0A21DC, 0x1F5376, 0x9018613。
(2) 定义一个名为 NewItem 的字存储单元,该单元中包含要查找的数据,该例要求是0x1F5376
(3) 要求编写一个程序,在 Start 数据列表中查找是否包含 NewItem 单元中的数据。如果包含则把该数据在列表中的位置序号(1、2、3、4)存储到 Index 字存储单元中。否则在Index 字存储单元中存储 0xFFFFFFFF。
(4) 要求 Start 的数据列表和 NewItem 的字存储单元定义在代码段中(只读的 ROM区),而 Index 字存储单元要定义在一个名为 mydata 的数据段中(可读写的 RAM区)。
七、降序冒泡排序程序(33 分)
(1) 编写一个降序冒泡排序程序,要求如下:(22 分)
a) 定义一个存储单元首地址名为 StartOR 的数据列表(在代码段只读 ROM 区),该数据列表包含若干个字节存储单元。第一个单元是列表中数据的数量,后续若干连续存储单元包含若干字节数据。字节数据的数量由编程人员自己确定。
b) 编程要求把 StartOR 数据列表中存放的数据按降序排序(冒泡排序法)。排序后的数据存放到名为 Start 的数据列表中,该数据列表定义在名为 mydata 的数据段中(可读写的 RAM 区)。Start 数据列表的存储结构与 StartOR 数据列表完全相同
(2) 要求画出程序流程图。流程图要求黑框白底,分支需要标注转移满足的条件。(5 分)
(3) 回答问题:为什么 StartOR 数据列表要存放在只读 ROM 区中?而 Start 数据列表需要存放在 RAM 区中?(6 分)
只有存放在 ROM 去的程序和数据,在掉电后才能保持其原值,在上电后 ARM 处理器才能正确读取存放存放于其中的数据。因此 StartOR 数据列表保存了数据的初始值,需要在ROM 中存放。而排序后的结果需要存放于 Start 数据列表中,其对应的存储单元必须可写,因此 Start 数据列表需要存放在 RAM 区中。
八、编写一个程序段(17分)
判断寄存器 R5 中的数据是否为 11、15、18、22、44、67,如果是,则将 R0 中的数据置为 1;否则将 R0 设置为 0,并把这个程序段定义为一个代码段,要求先画出程序流程图(流程图要求黑框白底,分支需要标注转移满足的条件。),再用 ARM 指令写详细代码,程序要完整。
九、试把如下 C 函数改写成 ARM 指令函数。(9 分)
int subxx(int x, int y)
{
return x-y;
}
十、把下面的 ARM 指令函数改写成 C 语言函数。(9 分)
AREA tt,CODE, READONLY
EXPORT strcopy
strcopy
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE strcopy
MOV PC, LR
END
- 作者:spark
- 链接:http://sparkleaf.cn/article/1273c231-7c52-8030-a74a-cd2db3346006
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。