这几个例题来自我们的上机实验, 通过这几个例题基本上能掌握 ARM 汇编一些最基本的操作
ARM 汇编实现 1-100 的加法
- AREA Example1,CODE,READONLY;
- ENTRY;
- CODE32;
- START
- MOV R0,#0; 总和
- MOV R1,#0; 遍历数
- MOV R2,#100; 至多少
- TIME
- ADDS R1,R1,#1; 遍历数自加 1
ADDS R0,R0,R1; 总和增加
CMP R1,R2; 判断
BCC TIME; 循环
END;
求一个二进制数中 1 的个数
- AREA lab2,CODE,READONLY;
- ENTRY
- start
- MOV r1,#0xac
;10101100 共 4 个 1
- MOV r6,#0; 记录 1 的个数
- step
- SUB r0,r1,#1; 写 r1-1 到 r0
AND r1,r0,r1; 对 r1 与 r1-1 求与
- ADD r6,r6,#1; 记录数 + 1
- CMP r1,#0; 判断是否取完
BNE step; 否则继续
END
求一个二进制数的数组中 1 的个数
- AREA lab2,CODE,READONLY;
- ENTRY
- start
- LDR r2,=nums
- MOV r6,#0; 初始化 1 的个数为 0
- LDRB r1,[r2],#1
- step
- SUB r0,r1,#1; 写 r1-1 到 r0
AND r1,r0,r1; 对 r1 与 r1-1 求与
- ADD r6,r6,#1; 记录数 + 1
- CMP r1,#0; 判断一个数是否取完
- LDREQB r1,[r2],#1; 取完则访问下一个数
- CMP r1,#0; 判断是否读到最后一个数字
- BNE step
- MOV r5,r6,LSR #1; 将 r6 最后一位移入标志 C 位
- MOVCS r7,#1; 为 1 则为奇数
- AREA data,DATA,READWRITE
- nums
; 数组
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
DCB 65 大专栏 ARM 汇编几个经典例题 >
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 21
- DCB 52
- DCB 16
- DCB 65
- DCB 95
- DCB 0;
- END
ARM 实现两个数字求最大公约数
- AREA lab3,CODE,READONLY;
- ENTRY
- start
LDR r0,=546; 初始化第一个数
LDR r1,=999; 初始化第二个数
step
CMP r0,r1; 比较 r0 与 r1
SUBHI r0,r0,r1; 谁大, 谁被除
SUBLO r1,r1,r0; 谁大, 谁被除
BEQ over; 相等则求到结果, 结束
B step; 重复
- over
- B over
- END
ARM 实现字符串的复制
- AREA lab1,CODE,READONLY;
- ENTRY
- start
LDR r0,=chars1; 传入源字符串
LDR r1,=chars2; 传入目标字符串
- step
- LDRB r2,[r0],#1; 递增读取单个字符
- STRB r2,[r1],#1; 递增写入单个字符
- CMP r2,#0; 判断是否写到最后最后一个字符
BNE step; 否则继续复制
- AREA data,DATA,READWRITE
- chars1
; 源字符串
- DCB "abcdefghijklmnopqrstuvwxyz"
- DCD 0;
- chars2
; 目标字符串
DCD 0;
END
ARM 实现冒泡法排序
- AREA lab4,CODE,READONLY;
- ENTRY
- start
- MOV r7,#7; 初始化外层循环计数
- out
LDR r0,=nums; 初始化内层地址
MOV r6,r7; 利用外层初始化内层循环计数
- in
- LDRB r1,[r0];
- ADD r2,r0,#1;
- LDRB r3,[r2];
CMP r1,r3; 比较前后两个
STRCSB r1,[r2]; 小的往前放
STRCSB r3,[r0]; 大的往后放
- ADD r0,r0,#1;
- SUB r6,r6,#1;
- CMP r6,#2;
- BNE in;
- SUB r7,r7,#1;
- CMP r7,#2; 外层循环 6 次
- BNE out;
- AREA data,DATA,READWRITE
- nums
; 数组
- DCB 2
- DCB 4
- DCB 10
- DCB 8
- DCB 14
- DCB 1
- DCB 20
- DCD 0;
- END
来源: http://www.bubuko.com/infodetail-3439026.html