文章目录

  • 0x00. 整数加减乘除
  • 0x01. 一维数组按某种规律求和
    • 0x01.1 求 1~100 之和
    • 0x01.2. 求一维数组的和
    • 0x01.2. 求一维数组的所有奇数的和
  • 0x02. 二维数组按某种规律求和
    • 0x02.1. 求二维数组的和
    • 0x02.2. 求二维数组的所有奇数的和
  • 0x03. 求两数的最大公约数
  • 0x04. 求两数的最小公倍数
  • 0x05. 对一维数组进行排序
    • 0x05.1. 冒泡排序
  • 0x06. 求一维数组中的最大值 / 最小值
  • 0x07. 字符串的复制
    • 0x07.1. 字符串的复制
    • 0x07.2. 从某地址处连续读取复制 100 个字符到目的地址标号 DIST 处

期末上机考试题目!

(只能用纯 ARM 汇编…不能调用 C 语言 ><)

0x00. 整数加减乘除

 area test, code, readonlyentrymov r0, #2mov r1, #8getaddadd r2, r1, r0     ; r2 = r1 + r0
getsubsub r3, r1, r0     ; r3 = r1 - r0
getmulmul r4, r1, r0     ; r4 = r1 * r0
getdiv                 ; r5 = r1 / r0sub r1, r1, r0add r5, r5, #1cmp r1, #0bgt getdiv
stop b stopend

r2 = r1 + r0 = 0x0A = 10\text{r2 = r1 + r0 = 0x0A = 10}r2 = r1 + r0 = 0x0A = 10

r3 = r1 - r0 = 0x06 = 6\text{r3 = r1 - r0 = 0x06 = 6}r3 = r1 - r0 = 0x06 = 6

r4 = r1 * r0 = 0x10 = 16\text{r4 = r1 * r0 = 0x10 = 16}r4 = r1 * r0 = 0x10 = 16

r5 = r1 / r0 = 0x04 = 4\text{r5 = r1 / r0 = 0x04 = 4}r5 = r1 / r0 = 0x04 = 4

0x01. 一维数组按某种规律求和

0x01.1 求 1~100 之和

代码

 area text, code, readwriteentrymov R0, #100        ; R0=100mov R1, #0          ; R1=0
loopadd R1, R1, R0      ; R1=R1+R0subs R0, R0, #1     ; R0=R0-1cmp R0, #0          ; 根据下一条指令来对R0,0进行比较bne loop            ; bne: 若R0 ≠ 0, 跳转至loop函数处循环执行。否则,就跳过loop函数继续执行ldr R2, =result     str R1, [R2]        ; 把R1的值存到R2所指定的地址中
resultdcd 0
stopb stopend

运行结果

r1 = 0x00013BA = 5050

0x01.2. 求一维数组的和

结果放置在 0x300000

 area getsum, code, readonlyentryldr r0, =srcldr r5, =0x300000mov r3, #len       ; r3=len, 数组长度mov r1, #0       ; r1保存总和 loopldr r2, [r0]       ; r1为数组当前值add r1, r1, r2add r0, r0, #4     ; 地址指针r0后移1位sub r3, r3, #1     ; r3--cmp r3, #0bne loop
stopstr r1, [r5]b stoparea array, data, readwrite
src dcd 1, 2, 3, 4, 5, 6, 7, 8, 9
len equ 9end

运行结果

1+2+3+4+5+6+7+8+9=451+2+3+4+5+6 +7+8+9=451+2+3+4+5+6+7+8+9=45

得到的结果 r1 = 0x02D = 45\text{r1 = 0x02D = 45}r1 = 0x02D = 45

结果存放在 0x300000 处

0x01.2. 求一维数组的所有奇数的和

代码

 area getsum, code, readonlyentryldr r0, =srcmov r3, #len       ; r3=len, 数组长度mov r1, #0       ; r1保存总和 loopldr r2, [r0]       ; r1为数组当前值and r5, r2, #1cmp r5, #0         addne r1, r1, r2   ; 如果是奇数就加上add r0, r0, #4     ; 地址指针r0后移1位sub r3, r3, #1     ; r3--cmp r3, #0bne loop
stopb stoparea array, data, readwrite
src dcd 1, 2, 3, 4, 5, 6, 7, 8, 9
len equ 9end

1 + 3 + 5 +7 + 9 = 25\text{1 + 3 + 5 +7 + 9 = 25}1 + 3 + 5 +7 + 9 = 25

得到的结果 r1 = 0x019 = 25\text{r1 = 0x019 = 25}r1 = 0x019 = 25

0x02. 二维数组按某种规律求和

听说不考二维数组()

0x02.1. 求二维数组的和

0x02.2. 求二维数组的所有奇数的和

0x03. 求两数的最大公约数

使用更相减损术计算 gcd⁡\gcdgcd

 area getgcd, code, readonlyentrystart mov r1, #50           ; r1 = 50mov r2, #30           ; r2 = 30
loopcmp r1, r2            subhi r1, r1, r2      ; 若r1>r2, r1=r1-r2subls r2, r2, r1      ; 若r1<r2, r2=r2-r1cmp r1, r2bne loop              ; 若 r1=r2, 退出循环
stopb stopend

运行结果


gcd⁡(30,50)=10\gcd(30,50)=10gcd(30,50)=10

r1 = r2 = gcd = 0x0A = 10\text{r1 = r2 = gcd = 0x0A = 10}r1 = r2 = gcd = 0x0A = 10

0x04. 求两数的最小公倍数

代码

lcm(a,b)=a×bgcd⁡(a,b)\text{lcm}(a,b)=\cfrac {a\times b}{\gcd{(a, b)}}lcm(a,b)=gcd(a,b)a×b​

 area getlcm, code, readonlyentrystart mov r1, #50           ; r1 = 50mov r2, #30           ; r2 = 30mul r3, r1, r2        ; r3 = r1 * r2
loopcmp r1, r2            subhi r1, r1, r2      ; 若r1 > r2, r1 = r1 - r2subls r2, r2, r1      ; 若r1 < r2, r2 = r2 - r1cmp r1, r2bne loop              ; 若 r1 = r2, 退出循环
lcm                       ; lcm = a * b / gcd(a, b) sub r3, r3, r1        ; arm 没有出发操作,因此使用模拟除法add r4, r4, #1cmp r3, #0bgt lcm
stopb stopend

运行结果

r4=0x96=150r4 = 0x96 = 150r4=0x96=150

lcm(30, 50) = 150\text{lcm(30, 50) = 150}lcm(30, 50) = 150

0x05. 对一维数组进行排序

0x05.1. 冒泡排序

代码

; 冒泡排序area sort, code, readonlyentry
start mov R4, #0          ; R4=0 ldr R6, =src        ; R6=src ,此时R6指向数组的开头   add R6, R6, #len    ; R6=R6+len ,此时R6指向数组的末尾
outer ldr R1, =src        ; 开始外围循环
innerldr R2, [R1]        ; 获取地址R1中的数字       R2=a[i] ldr R3, [R1, #4]    ; 获取R1的下一个地址的数字 R3=a[i+1] cmp R2, R3          ; 根据下一条指令来对R2,R3进行比较 strgt R3, [R1]      ; 如果R2>R3:  strgt R2, [R1, #4]  ;     交换R2,R3地址 add R1, R1, #4      ; 地址指针R1后移一位 cmp R1, R6          ; 根据下一条指令来对R1,R6进行比较(R1: 当前位置, R6: 数组末尾)    blt inner           ; blt: 小于(有符号数)如果R1<R6, 则跳转至inner处继续循环执行inneradd R4, R4, #4      ; R4=R4+4 全局指针后移一位cmp R4, #len        ; 根据下一条指令来对R4,len进行比较(R4: 当前位置, len: 数组长度)suble R6, R6, #4    ; 如果没有走到末尾ble outer           ; 跳转至outer处继续循环执行outer
stopb stoparea array, data, readwrite
src dcd 2, 5, 3, 1, 11, 10, 20
len equ 7 * 4 end

运行结果


R6 = src = 0x804C\text{R6 = src = 0x804C}R6 = src = 0x804C

从 r6\text{r6}r6 开始,排序结果为:1,2,3,5,10,11,201, 2, 3, 5, 10, 11, 201,2,3,5,10,11,20

0x06. 求一维数组中的最大值 / 最小值

代码

 area getminmax, code, readonlyentryldr r0, =srcmov r5, #len       ; r5=len, 数组长度ldr r7, [r0]       ; r7为最大值ldr r6, [r0]       ; r6为最小值loopadd r0, r0, #4     ; 地址指针r0后移1位ldr r1, [r0]       ; r1为数组当前值sub r5, r5, #1     ; r5--cmp r7, r1movcc r7, r1       ; 产生错位,也即r7<r1, 使得r7=r1cmp r6, r1movcs r6, r1       ; 未产生错位,也即r6>r1, 使得r6=r1cmp r5, #0bne loop
stopb stoparea array, data, readwrite
src dcd 2, 5, 3, 1, 11, 10, 15
len equ 7end

运行结果

r6\text{r6}r6 为最小值,r6 = 1\text{r6 = 1}r6 = 1
r7\text{r7}r7 为最大值,r7 = 0xF = 15\text{r7 = 0xF = 15}r7 = 0xF = 15

0x07. 字符串的复制

0x07.1. 字符串的复制

    area strcpy, code, readonlyentry  ldr r0, =src   ldr r1, =des
loopldrb r2, [r0], #1  strb r2, [r1], #1  cmp r2, #0   bne loop
stop b stop    area string, data, readwrite
src dcb "abcdefghijklmn\0"
des dcb "" end

0x07.2. 从某地址处连续读取复制 100 个字符到目的地址标号 DIST 处

     area strcpy, code, readonly
dist    dcb "123456789……01234567890" entry
strcpys  stmfd r13!,{r0-r3}mov r0, #0x400ldr r1,= distmov r2,#100
loop   subs r2, r2, #1ldrb r3, [r0], #1strb r3,[r1],#1bne  loopldmfd r13!,{r0-r3}mov pc, lrend

嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)相关推荐

  1. (c语言)编程输出二维数组中元素的最大值,要求用指针实现。

    (c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...

  2. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  3. 编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推。

    编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推.     例如,原始二维数组为,逆向存放后变为.试建立一个类 ...

  4. 泊松方程 matlab,MATLAB编程求解二维泊松方程

    <MATLAB编程求解二维泊松方程>由会员分享,可在线阅读,更多相关<MATLAB编程求解二维泊松方程(3页珍藏版)>请在人人文库网上搜索. 1. 真解 u=sin(pi*x) ...

  5. 在Matlab下编程实现二维与三维的航迹跟踪控制、路径跟踪控制和轨迹跟踪控制,实现编队集群控制与避障控制

    在Matlab下编程实现二维与三维的航迹跟踪控制.路径跟踪控制和轨迹跟踪控制,实现编队集群控制与避障控制. 研究对象有空中无人机.地面机器人.水面无人艇.水下机器人以及多智能体等. ID:321006 ...

  6. 练习题记录:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离

    碰到一道练习题:求解距离矩阵,首先生成一百个二维坐标点,计算任意两个坐标点的距离.我一开始看到这题目是一脸懵逼,然后上网找了一下,更是二脸懵逼.生成一百个二维坐标点,我首先就是想去生成一个1010的二 ...

  7. LeetCode149. 直线上最多的点数: 给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o ±------- ...

  8. python 二维列表按列求和,按列求最大值,转置,* 星号操作,简便方法,不使用numpy

    python3中,二维列表(矩阵)按列求和.求最大值.二维列表转置的一些操作,不使用numpy库.在LeetCode做题时比较常用. 太长不看版本 # 用于演示的二维列表 >>>a ...

  9. 给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    需求:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 分析思路: 1.将所有点二维坐标化,即定义出所有点的x,y坐标值 2.遍历出所有取出两点的情况(不考虑先后顺序),根据任意 ...

最新文章

  1. springMVC swagger2
  2. CSS在ASP.NET中使用
  3. 重启asp.net 命令
  4. CVPR 2019 | 基于可解释性以及细粒度的可视化解释卷积神经网络
  5. Java 线程的生命周期
  6. 轻松实现深度Clone | Source Generators方式
  7. MySQL中varchar类型字段隐式转换造成多删除数据
  8. java oom分析_JAVA各种OOM代码示例与解决方法
  9. 全国大学生数学建模竞赛2018A题高温作业专用服装设计MATLAB程序
  10. 快手分享链接,实战解析无水印视频源码
  11. 深度学习系列18:开源人脸识别库
  12. 基于腾讯云播放器封装的Flutter Video Player插件
  13. 万科副总裁毛大庆在建策沙龙上关于楼市走向的发言
  14. 奇怪的是珊瑚虫版反而可以
  15. Word2007/2003常用快捷键
  16. 一位小公司CTO的成长历程
  17. Android RecyclerView ItemDecoration 分割线
  18. USRP系列(三):NI 与Ettus Research的USRP区别
  19. 三星手机刷机后显示无服务器,三星手机刷机后无基带无信号打不了电话等故障详细修复教程...
  20. EasyNVR服务里为什么会有两个easynvr程序?可以互相替换吗?

热门文章

  1. (CV方向)精通C++,该如何学?
  2. 任何社区,只要能影响他人成长的人,都可以成为敏捷个人的荣誉会员
  3. Java线程池使用与原理
  4. PAT (Advanced Level) 1078. Hashing (25)
  5. EngineRoot是在哪里定义的?
  6. 大型网站技术架构(3):WEB 前端性能优化
  7. Android数据手册02:android.permission权限请求汇总
  8. XPath基本概念(一)
  9. 对数函数定义域和值域为r_100观察法求函数的值域
  10. 一道Python面试题,据说大部分人都中招了,纷纷开始怀疑自己