ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】
- 前言
- 推荐
- 说明
- ARM汇编第一次上机(顺序、分支、单重循环)
- 内容
- 1 sum1
- 流程图
- 代码编写
- 结果分析
- 2 sum2
- 流程图
- 代码编写
- 结果分析
- 3 numbers
- 流程图
- 代码编写
- 结果分析
- 最后
前言
2023-4-14 19:30:55
以下内容源自《创作模板三》
仅供学习交流使用
推荐
ARM简单程序设计【嵌入式系统】
说明
第一点 关于&
号
不会有人不知道?
我流程图中写的R3=&nums
&
是什么意思吧?
请看下面C语言程序
#include<stdio.h>
int main(){
int n=10;
int *p=&n;
printf("%x\n",p); //62fe14
printf("%x\n",&n); //62fe14
printf("%d\n",n); //10
printf("%d\n",*p); //10
}
回答&
号是取地址的意思哦
第二点 关于说明中的R0++
说明
此处R0用来遍历数组的指针
流程图中R0++表示指针移动到下一个存储数据
因为此数组nums是按字对齐存储数据的
所以实际代码中是R0=R0+4(一个字是4字节)
请看以下C语言程序
#include<stdio.h>
int main(){
int nums[10]={0,1,2,3,4,5,6,7,8,9};
int *p=nums;
for(int i=0;i<10;i++){
printf("%x ",p);//62fde0 62fde4 62fde8 62fdec 62fdf0 62fdf4 62fdf0 62fdf8 62fdfc 62fe00 62fe04
printf("%d ",*p++);//0 1 2 3 4 5 6 7 8 9
}
}
结论不再赘述
//结果显而易见
//p是int型指针
//int存储32位数据 4字节
//p++就是指针移动到下一个存储数据
ARM汇编第一次上机(顺序、分支、单重循环)
内容
按照要求编程实现以下功能
1、编程实现两种求和运算,1+2+…+100求和运算,按条件求和运算1+2+…+n >1000 ? ,不局限于这个题目,可以按自己的想法分别完成按计数、条件判断的循环编程与调试(6分)
2、给定10-20个数中找出最大数和最小数(自定义),求平均值,统计小于、大于及等于平均值的个数; (9分)
要求:
1、提交自己实际调试结果截图;
2、上传录制视频,讲述实验完成情况,先演示完成的功能,然后简要分析代码。(控制在5~6分钟左右)
3、简要写出设计思路,画出程序流程图,并把调试结果截图附录,以PDF格式形成报告(与下次实验一起提交)。
1 sum1
流程图
代码编写
AREA sum1, CODE, READONLY ; 代码段的名字 sum1
ENTRY ; 程序的入口
CODE32
num EQU 100 ; 求和的次数
start
LDR R0, =0 ; R0 求和结果
LDR R1, =1 ; R1作为被加数
LDR R2, =num ; R2作为计数器
LDR R3, =sum ; R3指向sum
sumloop
ADD R0, R0, R1 ; R0=R0+R1
ADD R1, R1,#1 ; R1=R1+1
SUBS R2, R2, #1 ; 计数器值减1
BNE sumloop ; 如果不为0,那么继续跳到sum执行
STREQ R0, [R3]
stop
MOV r0, #0x18
LDR r1, =0x20026
SWI 0x123456
AREA Data, DATA, READWRITE
sum DCD 0
END
结果分析
初始化后
R0=0
R1=1
R2=0x64=100
R3=&sum=0x40000000
运算结果
R0=0x000013BA=5050
R1=0x65=101
R2=0
R3=&sum=0x40000000
[0x40000000]=0x000013BA
2 sum2
流程图
代码编写
AREA SUM, CODE, READONLY ; 代码段的名字 SUM
ENTRY ; 程序的入口
CODE32
start
LDR R0, =n ; 将数据段中自然数的个数n的地址加载到R0寄存器
LDR R1, =sum ; 将数据段中自然数的累加和sum的地址加载到R1寄存器
LDR R3, =0 ; R3存放自然数的累加和
LDR R4, =0 ; R4用于循环个数的统计/每次取得的自然数
LDR R5, =1000 ; R5用于循环结束的界限值
continue
ADD R4, R4, #1 ; 取下一个自然数
ADD R3, R3, R4 ; 累加自然数
CMP R3, R5 ; 比较累加和是否超过了1000
BCC continue ; 如果小于1000,那么跳到compare执行
STRCS R3, [R1] ; 如果大于1000,那么将累加和存储到R1所指向的单元中
STRCS R4, [R0] ; 如果大于1000,那么将已累加的自然数个数值存储
; 到R0所指向的单元中
stop
MOV r0, #0x18
LDR r1, =0x20026
SWI 0x123456
AREA Data, DATA, READWRITE
n DCD 0 ; 定义累加的自然数的个数
sum DCD 0 ; 定义自然数的累加和
结果分析
初始化后
R0=&n=0x40000000
R1=&sum=0x40000004
R3=0
R4=0
R5=0x3E8=1000
运算结果
R3=0x40B=1035
R4=0x2D=45
[0x40000000]=0x0000002D
[0x40000004]=0x0000040B
3 numbers
流程图
总体流程图
流程图1
流程图2
流程图3
流程图4
代码编写
AREA numbers, CODE, READONLY ; 代码段的名字 max
ENTRY ; 程序的入口
CODE32
num EQU 17 ; 比较的次数 数组长度-1
start
LDR R0, =nums ; R0指向源数据块x
LDR R1, =max ; R1指向单元max
LDR R3, [R0] ; 将源数据块x中第一个数加载到R3中 用来保存max
LDR R5, [R0] ; 将源数据块x中第一个数加载到R5中 用来保存min
LDR R7, =0 ; R7 总和sum
LDR R8, =0 ; R8 单元avg
LDR R9, =0 ; R9 小于平均值的个数
LDR R10, =0 ; R10 等于平均值的个数
LDR R11, =0 ; R11 大于平均值的个数
;最大最小总和
LDR R2, =num ; R2作为计数器
ADD R7,R3 ; 加第一项
ADD R0, R0, #4 ; 跳过第一项
numbersloop
LDR R4, [R0],#4 ; 依次将源数据块x中下一个数加载到R4中
ADD R7,R4 ; 求和R7+=R4
CMP R3, R4 ; 比较R3和R4中数的大小
MOVCC R3, R4 ; 如果R3小于R4,则将较大的数送入R3中
CMP R5, R4 ; 比较R5和R4中数的大小
MOVCS R5,R4 ; 如果R5大于R4,则将较小的数送入R5中
SUBS R2, R2, #1 ; 计数器值减1
BNE numbersloop ; 如果不为0,那么继续跳到numsloop执行
; 如果为0,那么循环比较结束
;求平均值
LDR R8, =5 ; R8 单元avg
;统计...
LDR R0, =nums ; R0指向源数据块x
LDR R2, =num ; R2作为计数器
LDR R4, [R0] ;先比较一次
CMP R8, R4 ; 比较R8和R4中数的大小
ADDHI R9, R9, #1 ; 如果R8大于R4,则R9++
ADDEQ R10,R10,#1 ; 如果R8等于R4,则R10++
ADDCC R11, R11, #1 ; 如果R8小于R4,则R11++
ADD R0, R0, #4 ; 跳过第一项
numsloop
LDR R4, [R0],#4 ; 依次将源数据块x中下一个数加载到R4中
CMP R8, R4 ; 比较R8和R4中数的大小
ADDHI R9, R9, #1 ; 如果R8小于R4,则R9++
ADDEQ R10,R10,#1 ; 如果R8等于R4,则R10++
ADDCC R11, R11, #1 ; 如果R8大于R4,则R11++
SUBS R2, R2, #1 ; 计数器值减1
BNE numsloop ; 如果不为0,那么继续跳到numsloop执行
; 如果为0,那么循环比较结束
;多寄存器寻址
STMIA R1!,{R3,R5,R8,R9,R10,R11};
stop
MOV r0, #0x18
LDR r1, =0x20026
SWI 0x123456
AREA Data0, DATA, READONLY ;平均值5
nums DCD 1,9,2,8,3,7,4,6,5 ;8 2 8
DCD 1,9,2,8,3,7,4,6,5
AREA Data, DATA, READWRITE
max DCD 0
min DCD 0
avg DCD 0
ltavg DCD 0
eqavg DCD 0
gtavg DCD 0
END
结果分析
初始化后
R0=&nums=0xB0
R1=&max=0x40000000
R3=[R0]=nums[0]
R5=[R0]=nums[0]
R7=0
R8=0
R9=0
R10=0
R11=0
[0x000000B0]=0x00000001
计算最大最小总和
R0=0xF8 //最后一个元素地址
R3=0x09 //最大值
R5=0x01 //最小值
R7=0x5A=90 //求和结果
计算统计结果
R8=0x05 //平均值
R9=0x08 //小于平均值的个数
R10=0x02 //等于平均值的个数
R11=0x08 //大于平均值的个数
存储结果
[0x40000000]=0x00000009 //最大值
[0x40000004]=0x00000001 //最小值
[0x40000008]=0x00000005 //平均值
[0x4000000C]=0x00000008 //小于平均值的个数
[0x40000010]=0x00000002 //等于平均值的个数
[0x40000014]=0x00000008 //大于平均值的个数
最后
2023-4-14 21:26:20
你对我百般注视,并不能构成万分之一的我,却是一览无余的你。
祝大家逢考必过
点赞收藏关注哦