嵌入式ARM设计编程(二) 字符串拷贝
文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复 嵌入式 也可获取。
一、实验目的
通过实验掌握使用 LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学习使用条件码
二、实验环境
硬件:PC机
软件:ADS1.2 集成开发环境
三、实验内容
熟悉开发环境的使用并完成一块存储区的拷贝。
完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
四、实验要求
- 按照2.3节介绍的方法, 在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。
- 在指令后面加上适当注释,说明指令功能。
- 指出程序执行完成后各相关寄存器及存储器单元的具体内容。
五、实验完成情况:
1、实验源代码(含注释):
AREA Init,CODE,READONLY ;定义CODE片段Init 只读ENTRY ;进入程序CODE32 ;以下为32位的ARM程序
startMOV SP, #0x400 ; 设置堆栈地址为0x400LDR R0, =Src ; 先将原字符串地址加载到R0LDR R1, =Dst ; 将目的字符串地址加载到R1MOV R3,#0 ; 定义R3中的内容为0
strcopyLDRB R2,[R0],#1 ; 将R0的内容读入寄存器R2,并将R0R0+1CMP R2,#0 ; 比较R2和0是否相等,主要检测字符串是否结束BEQ endcopy ; 等于0则跳转至endcopySTRB R2,[R1],#1 ; 先将R2中的字节数据写入R1中,并把地址R1+1的值存入R1ADD R3,R3,#1 ; R3自加一,用于记录字符个数B strcopy ; 循环
endcopyLDR R0, =ByteNum ; 将字符数的地址加载到R0STR R3,[R0] ; 将R3的内容存在R0中B .AREA Datapool,DATA,READWRITE ; 定义DATA类型的Datapool
Src DCB "string",0 ; 初始化字符串的存储空间
Dst DCB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 目的字符串存储空间
ByteNum DCD 0 ; 初始化字符数END
2、实验过程(含结果截图及相应文字解释):
定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。
通过存储器可见,内容正在逐渐地进行拷贝。过程如下:
直到拷贝过程结束,实验结束后存储单元中的内容如下:
相关寄存器中的具体内容如下所示:
练习题:
编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把 R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。最后把R4~R11清空赋值为0。
提示:多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。如:
LDMIA R0!, {R4-R11}
STMIA R1!, {R4-R11}
编写实验代码如下:
AREA Init,CODE,READONLY ;定义CODE片段Init 只读ENTRY ;进入程序CODE32 ;以下为32位的ARM程序
main NOP
NUM EQU 8 ; 定义NUM为8,即一共经过8次循环
startMOV SP,#0X800 ;设置栈顶指针为0X800LDR R0,=src ; 将src的地址加载到R0MOV R2,#NUM ; 将循环次数赋给R2MOV R4,#1 ; 设置寄存器R4的初始值MOV R5,#2 ; 设置寄存器R5的初始值MOV R6,#3 ; 设置寄存器R6的初始值MOV R7,#4 ; 设置寄存器R7的初始值MOV R8,#5 ; 设置寄存器R8的初始值MOV R9,#6 ; 设置寄存器R9的初始值MOV R10,#7 ; 设置寄存器R10的初始值MOV R11,#8 ; 设置寄存器R11的初始值
loopADD R4,R4,#1 ; 将寄存器的值加一,下同ADD R5,R5,#1ADD R6,R6,#1ADD R7,R7,#1ADD R8,R8,#1ADD R9,R9,#1ADD R10,R10,#1ADD R11,R11,#1 STMFD SP!,{R4-R11} ;多寄存器寻址,把R4~R11的内容放入SP栈中SUBS R2,R2,#1 ;将R2的内容,即循环次数减一BNE loop ;如果不为0则跳转到loop继续循环 LDMIA R0!,{R4-R11} ;将以R0起始地址的值存入R4-R11,即把R4~R11清空赋值为0.
StopB StopLTORG ; 声明数据缓冲池
src DCD 0,0,0,0,0,0,0,0 ; 初始化END
实验初始时,寄存器中内容如下:
实验结束后,寄存器中的内容如下:
嵌入式ARM设计编程(二) 字符串拷贝相关推荐
- 嵌入式ARM设计编程(一) 简单数据搬移
文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 熟悉实验开发环境,掌握简单ARM ...
- 嵌入式ARM设计编程(三) 处理器工作模式
文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 (1) 通过实验掌握学会使用ms ...
- 嵌入式ARM设计编程(四) ARM启动过程控制
文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 (1) 掌握建立基本完整的ARM ...
- 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
文章目录 0x00. 整数加减乘除 0x01. 一维数组按某种规律求和 0x01.1 求 1~100 之和 0x01.2. 求一维数组的和 0x01.2. 求一维数组的所有奇数的和 0x02. 二维数 ...
- FPGA设计编程(二) 8-3线优先编码器与3-8线译码器
目录 [实验要求] [实验软件工具] [实验一]设计一个8-3线优先编码器(74LS148) 1. 实验内容与原理说明 2. 实验模块程序代码和激励代码 (1)设计模块代码 (2)激励模块代码 3. ...
- SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理...
程序的大部分代码都可以在必要的时候才加载到内存去执行,运行完后可以被直接丢弃或者被其他代码覆盖.我们PC上同时跑着很多的应用程序,每个应用程序使用的虚拟地址空间几乎可以整个线性地址空间(除了部分留给操 ...
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计之中的一个:系统内存需求评估
内存是SoC(System on Chip,片上系统)集成设计的重要模块.是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必需要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
最新文章
- 提高cube性能的一些方法(一)
- Python正则表达式之元字符详解(1)
- 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
- 非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制
- MVVM Template
- matlab 双音多频 接收端检测到的号码,信号语音论文,关于基于MATLAB的双音多频信号识别相关参考文献资料-免费论文范文...
- 第六十四期:聊聊原子变量、锁、内存屏障那点事
- java中自动装箱的问题
- wireshark: there are no interfaces on which a capture can be done
- 小区移动基站安全吗?会杀人于无形吗?
- 多线程中抛异常的这个面试题你会吗?
- java日期减去天数得日期_Java日期添加天数,减去天数,日历
- 推荐两款很好用的听书APP
- QQ透明头像通用设置教程!不仅简单而且免费!
- 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
- 大数据对人们的好处_大数据给人们生活带来哪些好处?
- linux制作剪刀石头布游戏,C#实现剪刀石头布游戏
- 【AI好书】不想被AI降维打击?美国“四院院士”写的这本深度学习科普书了解一下...
- 不可错过的javascript迷你库 1
- iOS 6:动态下载字体