ARM实验1
ARMv8指令学习(1)

如果x0 !=0 , then jumpto label位置处执行
LDUR/LDURB/LDURSB/LDURH/LDURSH/LDURSW/STUR/
STURB / STURH
它们都属于Load-StoreSingle Register(unscaledoffset)
unscaledoffset :指的是”Baseaddr+一个立即数”
w0中的其它字节:用此byte的符号位扩展得到.
(4) ldurh
类似ldurb,不过:这次取halfword(2 bytes)
(5) ldursh
类似ldursb,不过:这次取halfword(2 bytes)
(6) ldursw
类似ldursb,不过:这次取word(4 bytes)
(7) sturx0,[base,#simm9]
把x0保存到[base+#simm9]指向的内存位置
(8) sturb x0,[base,#simm9]
把x0中的一个byte,保存到[base+#simm9]指向的内存位置
(9) sturh x0,[base,#simm9]
把x0中的一个half-word(2 bytes),保存到[base+#simm9]指向的内存位置
(1) ldur x0,[base,#simm9]
x0 = [base+simm9]指向的内容
(2) ldurb w0,[base,#simm9]
从[base+simm9]指向的内容中:取出一个byte,赋给w0.
w0中的其它字节:用0扩展得到.
(3) ldursbw0,[base,#simm9]
韦东山最新热门课程推荐:《ARM裸机1期加强版》

韦东山最新热门课程推荐:《ARM裸机1期加强版》
在您的单片机学习或工作过程中,是否会遇到过这样的问题?
1. 有单片机开发经验,无Linux操作基础、无硬件知识,如何学习嵌入式?
2. 在学校,学C51太简单没有竞争力怎幺办?一直玩C51裸机跑程序,没做过什幺东西,怎幺学习嵌入式开发?
3. 找不到有完整例程的书,无法系统地学习ARM裸机编程?
4. 如何快速掌握一个陌生的外设功能模块?
电子发烧友学院联合韦东山老师推出最新一期《ARM裸机开发实战》课程,能帮你把以上问题一扫而光!。
第1天-ARM汇编指令MOV-MVN

第1天-ARM汇编指令MOV/MVN
MOV : 传送(Move)
MOV{条件}{S} , dest = op_1MOV 从另一个寄存器、被移位的寄存器、或一
个立即值装载一个值到目的寄存器。
你可以指定相同的寄存器来实现NOP 指
令的效果,你还可以专门移位一个寄存器:MOVR0, R0; R0 = R0... NOP 指令MOVR0, R0, LSL#3; R0 = R0 * 8 如果R15 是目的寄存器,将修改程序计数器或标志。
这用于返回到调用代码,方法是把连接寄存器的内容传送到R15:
MOV PC, R14 ; 退出到调用者MOVS PC, R14 ; 退出到调用者并恢复标志位MVN : 传送取反的值
(MoveNegative)
MVN{条件}{S} , dest = !op_1MVN 从另一个寄存器、被移位的寄存器、或一
个立即值装载一个值到目的寄存器。
不同之处是在传送之前位被反转了,所以
把一个被取反的值传送到一个寄存器中。
这是逻辑非操作而不是算术操作,就
是二进制的取反,比如二进制是0B11001100,取反就是0B00110011,转换为10 进制就是,这个取反的值加 1 才是它的取负的值:
MVN R0, #4 ; R0 = -5 MVN R0, #0 ; R0 = -1tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
ARM9无操作系统实验(一)LED部分

开始
设置 GPB5 为输出状态
置位 GPB5,LED0 熄灭
设置 GPB 端口禁止上拉
清零 GPB5,点亮 LED0
结束
将程序加载到开发板上,就可以看实验的结果了,其它 LED 灯的控制和 LED0 一样,只是 寄存器的设置值不同罢了。
实验二、流水灯 终于能点亮一个 LED 灯了,那么它有什么用呢?它的主要用途在于一些状态的显示上,
GPB5 LED0 GPB6 LED1 GPB8 LED2 GPB10 LED3 ********************************************/
/*---------地址声明----------*/
#include "2440addr.h"
注释:在本程序的开头,引入一个 2440addr.h 的头文件,该文件中定义了我们要常用的 寄存器的地址,以后的程序中,只需引入即可。引入的方法是将这个头文件直接放在 ADS 安装文件的 include 中就行了。
S3C2440 无操作系统实验——LED 部分
S3C2440 无操作系统实验(一)——LED 部分
小小达摩 2011-6-23
硬件:飞凌 FL2440 开发板 软件:ADS1.2
拿到 ARM 开发板,应该从哪儿开始学习呢?困扰了很多初学者,当然也正在困扰我, 因为我也是初学者。所以我想与其困惑,还不如先做些自己能做的,将会做的做熟悉了,也 许就找到学习的方向了吧。那么从哪儿入手呢,想来想去,那就从点亮一个 LED 灯作为学 习的起点。虽然很多人,不推荐用学习单片机的模式来学习 ARM,但是我感觉基础还是重 要的,再说高级的学习暂时也不会呀,呵呵。虽然这样学习会慢点,但是总比开发板落厚厚 一层灰要划得来吧(开发板买了快 2 年了,拿来玩的时间不超过 2 个月,也许很多朋友都有 这样的经历吧)。所以,把它拿出来,开始学习吧。
嵌入式系统实验一 存储器实验

嵌入式系统实验一存储器实验嵌入式系统实验一-存储器实验2022春季嵌入式系统课程实验报告《嵌入式系统》课程实验报告学生姓名:班级:讲师:记分及评价:项目满分:5分一、实验名称记忆实验二、实验目的了解S3C2410X处理器的内部存储空间分配;掌握存储区域配置方法;掌握对存储区进行读写访问的方法。
三、实验内容熟练使用命令脚本文件对arm存储控制器进行正确配置。
使用c语言编程,实现对ram的读写访问。
四、实验原理s3c2410a的存储器控制器提供访问外部存储器所需要的存储器控制信号,具有以下特性:●支持小/大端(通过软件选择)。
●地址空间:每个bank有128mb(总共有8个bank,共1gb)。
●除bank0只能是16/32位宽之外,其他bank都具有可编程的访问位宽(8/16/32位)。
●总共有8个存储器bank(bank0~bank7):一其中6个用于rom,sram等;一剩下2个用于rom,sram,sdram等。
●7个固定的存储器bank(bank0~bank6)起始地址。
●最后一个bank(bank7)的起始地址是可调整的。
●最后两个bank (bank6和bank7)的大小是可编程的。
● 所有内存库的访问周期都是可编程的。
● 可以通过插入外部等待来延长总线访问周期。
● 支持SDRAM的自刷新和断电模式。
《嵌入式系统》课程实验报告2021年春季五、实验结果超级终端上显示一下信息:六、练习编写程序对sram进行字节的读写访问。
#包括\voidmemory_test(void){因蒂;uint16tdata;intmemerror=0;uint16t*pt;2022春季嵌入式系统课程实验报告uart_printf(\0x00e00000,_ram_startaddress+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e0000);//记忆书写while((uint32t)pt<(_ram_startaddress+0x00f00000)){*pt=(uint16t)pt;pt++;}//memoryreaduart_uuuprintf(\memorytest(%xh-%xh):rd\\n\uuu内存_uuuu起始地址+0x00e00000,uuu内存_uuu起始地址+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e00000);而((uint32t)pt<(_ram_startaddress+0x00f00000)){data=*pt;如果(数据!=(uint16t)pt){memerror=1;uart_uPrintf(\break;}pt++;}if(memerror==0)uart_printf(\}。
arm电源管理(1)——apm.c

arm电源管理(1)--apm.c -- 内核版本比较旧了由于arm系统中没有bios设备, 所以只能为arm系统创建一个虚拟的字符设备与用户空间进行通讯.这就是/arch/arm/kernel/amp.c1. 工作原理:这个apm中实现一个misc设备,实质上也是一个字符设备, misc设备的主设备号是10, 而apm_bios作为一个misc设备, 次设备号是134. 定义为:/** The apm_bios device is one of the misc char devices.* This is its minor number.*/#define APM_MINOR_DEV 134这个apm_bios设备通过ioctl系统调用和用户空间进行通讯, 即当用户进程通过ioctl发来suspend命令时, 它就传给内核, 使系统进入suspend状态.2. 初始化static int __init apm_init(void){int ret;if (apm_disabled) {printk(KERN_NOTICE "apm: disabled on user request.\n");return -ENODEV;}if (PM_IS_ACTIVE()) {printk(KERN_NOTICE "apm: overridden by ACPI.\n");return -EINVAL;}pm_active = 1;//创建一个线程, 用于处理事件队列, 工作函数是kapmd//这个线程好像在arm中没有作用?ret = kernel_thread(kapmd, NULL, CLONE_KERNEL);if (ret < 0) {pm_active = 0;return ret;}//通过proc向用户空间输出apm信息#ifdef CONFIG_PROC_FScreate_proc_info_entry("apm", 0, NULL, apm_get_info); #endif//注册misc设备ret = misc_register(&apm_device);if (ret != 0) {remove_proc_entry("apm", NULL);pm_active = 0;wake_up(&kapmd_wait);wait_for_completion(&kapmd_exit);}return ret;}注册的结构为:static struct file_operations apm_bios_fops = {.owner = THIS_MODULE,.read = apm_read,.poll = apm_poll,.ioctl = apm_ioctl,.open = apm_open,.release = apm_release,};static struct miscdevice apm_device = {.minor = APM_MINOR_DEV,.name = "apm_bios",.fops = &apm_bios_fops};3. 结构函数的实现当一个用户进程打开apm_bios设备时, 它就会调用这个函数static int apm_open(struct inode * inode, struct file * filp){struct apm_user *as;//分配一个apm_user结构, 来表示一个用户进程as = (struct apm_user *)kmalloc(sizeof(*as), GFP_KERNEL);if (as) {memset(as, 0, sizeof(*as));/** XXX - this is a tiny bit broken, when we consider BSD* process accounting. If the device is opened by root, we* instantly flag that we used superuser privs. Who knows,* we might close the device immediately without doing a* privileged operation -- cevans*///读写等权限设置as->suser = capable(CAP_SYS_ADMIN);as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE;as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ;//将这个用户加入用户队列down_write(&user_list_lock);list_add(&as->list, &apm_user_list);up_write(&user_list_lock);//这是一个传递私有数据的一个通用方式filp->private_data = as;}return as ? 0 : -ENOMEM;}当用户空间进程去读这个设备时, 这个函数就会被调用.这个函数的主要作用是将事件读出到用户空间static ssize_t apm_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) {struct apm_user *as = fp->private_data;apm_event_t event;int i = count, ret = 0;if (count < sizeof(apm_event_t))return -EINVAL;//队列空, 且进程非阻塞读, 立刻返回if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK) return -EAGAIN;//否则等待到队列非空为止,wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue));//将队列中的事件复制给用户空间while ((i >= sizeof(event)) && !queue_empty(&as->queue)) { event = queue_get_event(&as->queue);ret = -EFAULT;if (copy_to_user(buf, &event, sizeof(event)))break;//设置状态if (event == APM_SYS_SUSPEND || event == APM_USER_SUSPEND) as->suspend_state = SUSPEND_READ;buf += sizeof(event);i -= sizeof(event);}if (i < count)ret = count - i;return ret;}//这个poll/select的后端实现, 用于查询有没有数据可读static unsigned int apm_poll(struct file *fp, poll_table * wait){struct apm_user *as = fp->private_data;poll_wait(fp, &apm_waitqueue, wait);return queue_empty(&as->queue) ? 0 : POLLIN | POLLRDNORM;}//这个是这个设备的核心函数, 用于内核与用户空间交互/** apm_ioctl - handle APM ioctl** APM_IOC_SUSPEND* This IOCTL is overloaded, and performs two functions. It is used to:* - initiate a suspend* - acknowledge a suspend read from /dev/apm_bios.* Only when everyone who has opened /dev/apm_bios with write permission * has acknowledge does the actual suspend happen.*/static intapm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg){struct apm_user *as = filp->private_data;unsigned long flags;int err = -EINVAL;if (!as->suser || !as->writer)return -EPERM;switch (cmd) {case APM_IOC_SUSPEND:as->suspend_result = -EINTR;if (as->suspend_state == SUSPEND_READ) {/** If we read a suspend command from /dev/apm_bios,* then the corresponding APM_IOC_SUSPEND ioctl is* interpreted as an acknowledge.*/as->suspend_state = SUSPEND_ACKED;suspends_pending--;} else {/** Otherwise it is a request to suspend the system.* Queue an event for all readers, and expect an* acknowledge from all writers who haven't already* acknowledged.*/queue_event(APM_USER_SUSPEND, as);}/** If there are no further acknowledges required, suspend* the system.*/if (suspends_pending == 0)apm_suspend(); //系统进入suspend状态//从suspend中返回/** Wait for the suspend/resume to complete. If there are* pending acknowledges, we wait here for them.** Note that we need to ensure that the PM subsystem does* not kick us out of the wait when it suspends the threads.*/flags = current->flags;current->flags |= PF_NOFREEZE;/** Note: do not allow a thread which is acking the suspend* to escape until the resume is complete.*/if (as->suspend_state == SUSPEND_ACKED)wait_event(apm_suspend_waitqueue,as->suspend_state == SUSPEND_DONE);elsewait_event_interruptible(apm_suspend_waitqueue,as->suspend_state == SUSPEND_DONE);current->flags = flags;err = as->suspend_result;as->suspend_state = SUSPEND_NONE;break;}return err;}4. 事件队列函数static void queue_event(apm_event_t event, struct apm_user *sender) {struct apm_user *as;down_read(&user_list_lock);//将事件加入其他USER,除自己外list_for_each_entry(as, &apm_user_list, list) {if (as != sender && as->reader)queue_event_one_user(as, event);}up_read(&user_list_lock);//唤醒等待读的进程wake_up_interruptible(&apm_waitqueue);}static void queue_event_one_user(struct apm_user *as, apm_event_t event) {if (as->suser && as->writer) {switch (event) {case APM_SYS_SUSPEND:case APM_USER_SUSPEND:/** If this user already has a suspend pending,* don't queue another one.*/if (as->suspend_state != SUSPEND_NONE)return;as->suspend_state = SUSPEND_PENDING;suspends_pending++;break;}}queue_add_event(&as->queue, event);}static void queue_add_event(struct apm_queue *q, apm_event_t event) {q->event_head = (q->event_head + 1) % APM_MAX_EVENTS;if (q->event_head == q->event_tail) { //满了static int notified;if (notified++ == 0)printk(KERN_ERR "apm: an event queue overflowed\n");q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS;}q->events[q->event_head] = event; 加入队头}在来看一个出队的函数://在队尾出列static inline apm_event_t queue_get_event(struct apm_queue *q) {q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS;return q->events[q->event_tail];}/** APM event queue management.*/static inline int queue_empty(struct apm_queue *q){return q->event_head == q->event_tail;}//队列的结构/** Maximum number of events stored*/#define APM_MAX_EVENTS 16struct apm_queue {unsigned int event_head;unsigned int event_tail;apm_event_t events[APM_MAX_EVENTS];};5. apm_suspend()这里才是整个设备想做的事情--将系统转入suspend状态static void apm_suspend(void){struct apm_user *as;//调用体系无关的接口,将系统转入suspend状态int err = pm_suspend(PM_SUSPEND_MEM);//从suspend返回/** Anyone on the APM queues will think we're still suspended.* Send a message so everyone knows we're now awake again.*///发送一个resume事件queue_event(APM_NORMAL_RESUME, NULL);/** Finally, wake up anyone who is sleeping on the suspend.*/down_read(&user_list_lock);list_for_each_entry(as, &apm_user_list, list) {as->suspend_result = err;as->suspend_state = SUSPEND_DONE; //suspend完成}up_read(&user_list_lock);//唤醒睡眠进程wake_up(&apm_suspend_waitqueue);}。
重庆工商大学嵌入式实验考试题目答案

一、汇编指令实验一:(实验1~3无法调试结果但是基本上是正确的)(1)使用LDR 指令读取0x40003100上的数据,将数据加2 ,若结果小于20则使用STR 指令把结果写回原地址,若结果大于等于20,则把0 写回原地址。
然后再次读取0x40003100上的数据,将数据加2 ,判断结果是否小于20……周而复始循环FunLDR R0 , #0x40003100ADD R0 , #2CMP R0 , #20MOVGE R0 , #0STRLT R0 , #0x40003100B Fun二、汇编指令实验二:(1 )使用MOV和MVN指令访问ARM通用寄存器。
(2 )使用ADD、SUB 、AND、ORR、CMP、TST 等指令完成数据加减运算及逻辑运算。
(1)、(2)这个很简单就按照相应的操作(如:MOV和MVN) 的语法格式就行三、汇编指令实验三:(任选两题作答)(1 )使用ARM汇编指令实现if 条件执行, for 循环结构, while循环结构和while循环结构。
If条件执行:MOV R0 , 0 #R0初始化为0CMP R0 , 0 #比较R0与0的大小MOVEQ R0 , 1 #如果R0等于0 则修改R0为1For循环结构:MOV R5 , 10MOV R1 , #0 #求和MOV R2 , #1 #循环变量FORCMP R5 , R2 #进入for循环先判断BEQ ENDADD R1 , R1 ,R2ADD R2 , R2 ,#1B FORENDDo……while循环结构MOV R5 , 10MOV R1 , #0 #求和MOV R2 , #1 #循环变量DOWHILEADD R1 , R1 ,R2ADD R2 , R2 ,#1CMP R5 , R2 #do_while循环先执行后判断BEQ ENDB DOWHILEENDWhile循环结构MOV R5 , 10MOV R1 , #0 #求和MOV R2 , #1 #循环变量WHILECMP R5 , R2 #进入while循环的时候先判断BEQ ENDADD R1 , R1 ,R2ADD R2 , R2 ,#1B WHILEEND四、c语言程序实验:C 程序使用加法运算来计算1+2+3+...+(99-1)+100的值。
1_ARM开发环境

接口资源Biblioteka 启动模式6410开发板选择了其中两种启动方式,nand flash启动和SD卡启动:
• 拨动S2 开关到SDBOOT标识一侧时,系统将从SD卡启动:引导程序固 化在SD卡中
• 拨动S2 开关到Nand标识一侧时,系统将从Nand Flash 启动:引导程 序固化在Nand中
什么是引导程序
ARM处理器系列
• 处理器系列是共享相同硬件特性的一组处理器的具体实现 如ARM7TDMI、ARM740T、ARM720T都属于ARM7系列
• 系列划分是基于ARM7,ARM9,ARM10和ARM11内核的
后缀数字7,9,10,11表示不同的内核设计,升序说明了性能和复杂 性的提高
• ARM7系列:冯.诺伊曼体系结构,3级流水线,执行ARMv4指令集, 1995年提出的ARM7TDMI是目前非常流行的内核
RVDS配置源码工程
8、清除已有编译目标
RVDS编译源码工程
1:编译工程,构造程序(F7)
RVDS编译源码工程
2:proj工程目录内下生成6410.bin程序映像
将6410.bin通过tftp下载到开发板0x50000000地址, go 50000000运行
RVDS在线调试
RVDS上集成的ADX在线调试功能需要用到JLINK仿真器,通过JTAG接口与CPU 连接实现硬件仿真:在线调试在以后课程中介绍
ARM产品
ARM产业链
ARM技术
ARM架构命名
| ARMv | n | variants | x(variants) |
ARMv:固定字符,即ARM Version n :指令集版本号。迄今为之,ARM架构版本发布了7个版本,n=[1:7] variants:变种 x(variants):排除x后指定的变种
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM技术原理与应用
实验报告
专业电子信息工程班级
学生姓名
学号
指导教师
2017年4月12 日
一、实验目的
(1)掌握ADS集成开发环境的创建;
(2)掌握ADS环境下工程创建;
(3)掌握ADS环境下汇编语言源程序创建、编辑、修改;
(4)掌握ADS环境下汇编语言源程序的汇编操作;
(5)掌握AXD环境下汇编语言程序的调试。
二、实验要求
1、实验必须在在ADS1.2环境下进行。
2、工程名、汇编语言源文件名按照下面规则命名:
工程名:pj+学号最后4位+其它字符
汇编语言源文件名:p+学号最后4位+其它字符+.s
例如:张维智同学学号最后4位是3134
因此,pj3134、pj3134a、pj31341等都是允许的工程名;而 p3134a.s、p3134b.s等都是允许的源文件名。
3、实验报告中需要说明实验中在ADS、AXD环境下进行的实际操作;
4、实验报告中应给出实际的实验操作及计算机的调试观察结果;
5、按照规定格式打印实验报告。
三、实验任务
1、在自己的笔记本电脑上安装ADS1.2ARM集成开发环境。
同时,操作实验室台式机上ADS1.2以便熟悉实验室的ADS1.2集成开发环境。
2、参考课件文档:ARM汇编语言程序设计实验环境与工具的使用-笔记本电脑版-v2.doc,创建pjxxxx工程。
3、创建pxxxx.s汇编语言源程序。
然后严格按照下面格式输入源程序。
AREA Example, CODE, READONLY
Entry
才ode32
START:
Mov R0,#5
MOV R2,#5 ;r2
MOV R0,0
mov R1,#0
LOOP:
CUP R1,R2
BHI ADD_END
ADD R0,R0 R1
ADD R1,R1,#1
B LOOP
ADD_end
B START
End
在实验报告中列出上面自己创建的pxxxx.s汇编语言源程序。
4、将pxxxx.s汇编语言源程序添加到pjxxxx工程中。
记录实验步骤和结果。
5、选Project->Make操作,对pxxxx.s汇编语言源程序进行汇编。
记录错误数,出错行的
行号。
6、修改pxxxx.s汇编语言源程序的语法错误,直到汇编成功为止。
在实验报告中列出最终正确的pxxxx.s汇编语言源程序。
7、单击工具栏中图标,进入AXD调试环境,对pxxxx进行调试。
选择Options→Configur Target…,将Configure配置Processor 为ARM920T。
8、点击Current前面的加号,展开当前模式寄存器组。
选Memory图标打开内存显示窗口,在下图下拉框中输入0x8000,代码从0x8000处存放。
观察实验现象。
9、熟悉工具条。
(1)单步执行10次,观察每次单步执行结果。
(2)在B LOOP语句处设置断点,点GO,执行程序。
观察实验现象。
(3)将光标移到B START语句处,点Run To Cursor,运行到光标处停下。
观察
实验结果。
(4)根据调试结果,说明pxxxx.s汇编语言源程序的功能。
四、实验步骤及结果
(要求根据实验内容,记录操作过程和实验现象、给出实验结果)
1、创建文件工程,工程名:pj3101a
2、创建源文件,命名为p3101.s,并在工程中添加源文件。
3、在源文件中写入程序代码,然后运行make,显示有错误
4、修改错误的程序代码,运行make,直到显示没有错误,然后点击Debug,打开AXD,进行AXD软件调试
5、进入AXD,开始设置AXD的运行调试环境,将Configure配置Processor 为ARM920T
6、代码从0x8000处存放
7、点击单步执行STEP,寄存器r0显示0x5
8、单步执行到11,寄存器r0的值为0x00,r1的值为0x00,r3的值为0x5
9、单步执行STEP到10
10、B LOOP语句处设置断点,执行go,寄存器r0的值为0x1,r1的值为0x2.
11、R0寄存器存放1+2+3+4+5的累加和
程序代码:
AREA EXAMPLE, CODE, READONLY
ENTRY
CODE32
START
MOV R0,#5; 立即数5送寄存器R0
MOV R2,#5; 立即数5送寄存器R1
MOV R0,#0; 立即数5送寄存器R0
MOV R1,#0; 立即数0送寄存器R1
LOOP
CMP R1,R2; 0跟5做比较
BHI ADD_end; 如果0>5,跳转ADD_end
ADD R0,R0,R1; 如果0<5,执行R1的值加R0的值送R0 ADD R1,R1,#1 ;R1的值加1送R1
B LOOP; 跳转到LOOP
ADD_end
B START; 跳转到START
END;结束
程序实现的功能:1+2+3+4+5=15的累加和
五、实验体会
1、运用软件,可以在软件上面看到寄存器存放的值,可以很明显地看到每单步执行一次程序的结果的值,可以方便我们清楚地了解到程序的每一步操作与每一步算法的结果,提高理解程序的能力。
2、借用调试软件,在很大的程度上,我们可以快速地检测程序代码是否出现了错误,从而进行修改加以修正,加快我们写程序代码的速度,以及节省了时间。