下面是一些ARM汇编的基础练习题,涵盖数据处理指令、内存访问、控制流等基本操作。建议你从简单到复杂逐步完成。
第一轮
1. 寄存器操作练习
题目1: 将寄存器R0的值设置为0x1234ABCD
题目2: 将R1的低16位清零,保持高16位不变
题目3: 交换寄存器R2和R3的值(不使用额外存储空间)
2. 位操作练习
题目4: 将R4的第7位设置为1,其他位保持不变
题目5: 将R5的第3位和第11位清零
题目6: 判断R6的最低位是否为1,如果是则跳转到label1
3. 内存访问练习
题目7: 将内存地址0x20000000处的值加载到R7
题目8: 将R8的值存储到内存地址0x20000004处
题目9: 将R9-R12四个寄存器的值依次存储到从0x20000100开始的内存中
4. 算术运算练习
题目10: 计算R10 = R10 × 8 (使用移位指令)
题目11: 实现32位无符号数加法(R11=R12+R13),考虑进位标志
题目12: 计算R14 = (R15 + 0x100) / 4
5. 控制流练习
题目13: 实现一个循环,将R0从10递减到0
题目14: 比较R1和R2,如果R1>R2则跳转到greater标签
题目15: 实现以下C代码的汇编版本:
if(a > b) { c = a - b; } else { c = b - a; }
6. 综合练习
题目16: 编写一个函数计算字符串长度(字符串以0结尾)
题目17: 实现内存块复制(从src到dest,长度为len字节)
题目18: 编写代码将R0中的二进制数1的个数统计到R1中
挑战题
题目19: 实现快速乘法(R0×17)而不使用MUL指令
题目20: 编写代码检测R0是否是2的幂次方
练习建议:
先用简单数值手动模拟寄存器变化
使用ARM模拟器(如QEMU或Keil)验证结果
尝试用不同方法实现同一功能
从无条件指令开始,逐步加入条件执行
第二轮
以下是一些覆盖 ARM 汇编基础操作的练习题,涵盖数据处理、内存访问、条件分支、循环等核心知识点,难度由浅入深:
练习题 1:基本数据运算
任务:编写 ARM 汇编程序,实现以下功能:
- 将寄存器
r0
初始化为10
,r1
初始化为20
- 计算
r0 = r0 + r1 - 5
- 计算
r2 = r0 * 3
(使用加法实现乘法)- 最终
r0
和r2
的结果应分别为25
和75
练习题 2:内存数据访问
任务:假设有一片内存区域起始地址为
0x20000000
,编写程序:
- 向该地址写入
0x12345678
- 从该地址读取数据到
r3
- 向
0x20000004
地址写入r3 + 0x10
- 验证
0x20000004
的值应为0x12345688
练习题 3:条件分支(if-else)
任务:实现以下 C 逻辑的 ARM 汇编:
int a = 15, b = 20; int max; if (a > b) { max = a; } else { max = b; }
- 用
r0
存储a
,r1
存储b
,r2
存储max
练习题 4:循环实现(累加求和)
任务:编写汇编程序计算
1+2+3+...+10
的和,结果存入r0
。
要求:
- 使用循环结构
- 用
r1
作为计数器(从 1 到 10)- 用
r0
存储累加结果(最终应为55
)练习题 5:数组访问与修改
任务:假设有一个 int 型数组
arr
存储在内存0x20000020
处,包含 5 个元素:[3, 1, 4, 1, 5]
。
编写程序:
- 遍历数组,将每个元素乘以 2
- 计算修改后所有元素的和,存入
r5
- 最终数组应为
[6, 2, 8, 2, 10]
,和为28
练习题 6:嵌套条件(分段函数)
任务:实现以下分段函数的汇编逻辑:
int x = ...; // x存储在r0中 int y; // y存储在r1中 if (x < 0) { y = -x; } else if (x <= 10) { y = x + 5; } else { y = x * 2; }
参考答案思路提示(部分)
练习题 3 参考框架:
MOV r0, #15 ; a = 15 MOV r1, #20 ; b = 20 CMP r0, r1 ; 比较a和b BGT a_greater ; 若a > b,跳转到a_greater MOV r2, r1 ; else,max = b B end ; 跳过a_greater分支 a_greater: MOV r2, r0 ; max = a end: ; 程序结束
练习题 4 参考框架:
MOV r0, #0 ; 累加结果初始化为0 MOV r1, #1 ; 计数器i=1 loop: CMP r1, #10 ; 检查i是否超过10 BGT loop_end ; 若i>10,退出循环 ADD r0, r0, r1 ; 累加:r0 += i ADD r1, r1, #1 ; i++ B loop ; 回到循环开始 loop_end: ; r0中为结果55
这些练习题覆盖了 ARM 汇编的核心操作,完成后可以掌握:
- 寄存器操作与算术运算
- 内存读写(
LDR
/STR
)- 标志位与条件分支(
CMP
/B<cond>
)- 循环结构设计
- 简单数据结构(数组)的处理
可以通过汇编模拟器(如 Keil、QEMU)单步调试验证结果是否正确。