嵌入式ARM设计编程(二) 字符串拷贝

码途琉璃狩
• 阅读 720
文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复 嵌入式 也可获取。

一、实验目的

通过实验掌握使用 LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学习使用条件码

二、实验环境

硬件:PC机

软件:ADS1.2 集成开发环境

三、实验内容

熟悉开发环境的使用并完成一块存储区的拷贝。

完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。

四、实验要求

  1. 按照2.3节介绍的方法, 在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。
  2. 在指令后面加上适当注释,说明指令功能。
  3. 指出程序执行完成后各相关寄存器及存储器单元的具体内容。

五、实验完成情况:

1、实验源代码(含注释):

AREA Init,CODE,READONLY ;定义CODE片段Init 只读
 ENTRY                ;进入程序
 CODE32              ;以下为32位的ARM程序
start
  MOV SP, #0x400     ; 设置堆栈地址为0x400
  LDR R0, =Src        ; 先将原字符串地址加载到R0
  LDR R1, =Dst        ; 将目的字符串地址加载到R1
  MOV R3,#0         ; 定义R3中的内容为0
strcopy
  LDRB R2,[R0],#1     ; 将R0的内容读入寄存器R2,并将R0R0+1
  CMP R2,#0         ; 比较R2和0是否相等,主要检测字符串是否结束
  BEQ endcopy       ; 等于0则跳转至endcopy
  STRB R2,[R1],#1     ; 先将R2中的字节数据写入R1中,并把地址R1+1的值存入R1
  ADD R3,R3,#1       ; R3自加一,用于记录字符个数
  B strcopy           ; 循环
endcopy
  LDR R0, =ByteNum   ; 将字符数的地址加载到R0
  STR 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和寄存器中数据变化。

通过存储器可见,内容正在逐渐地进行拷贝。过程如下:

嵌入式ARM设计编程(二) 字符串拷贝

嵌入式ARM设计编程(二) 字符串拷贝

直到拷贝过程结束,实验结束后存储单元中的内容如下:

嵌入式ARM设计编程(二) 字符串拷贝

相关寄存器中的具体内容如下所示:

嵌入式ARM设计编程(二) 字符串拷贝

练习题:

编写程序循环对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次循环           
start
 MOV SP,#0X800    ;设置栈顶指针为0X800
 LDR R0,=src            ; 将src的地址加载到R0
 MOV R2,#NUM         ; 将循环次数赋给R2
 MOV 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的初始值    
loop
 ADD R4,R4,#1            ; 将寄存器的值加一,下同
 ADD R5,R5,#1
 ADD R6,R6,#1
 ADD R7,R7,#1
 ADD R8,R8,#1
 ADD R9,R9,#1
 ADD R10,R10,#1
 ADD 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.
Stop
 B Stop
 LTORG                   ; 声明数据缓冲池
src DCD 0,0,0,0,0,0,0,0       ; 初始化
 END

实验初始时,寄存器中内容如下:

嵌入式ARM设计编程(二) 字符串拷贝

嵌入式ARM设计编程(二) 字符串拷贝

实验结束后,寄存器中的内容如下:

嵌入式ARM设计编程(二) 字符串拷贝


欢迎关注公众号【AIShareLab】,一起交流更多相关知识,前沿算法,Paper解读,项目源码,面经总结。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Irene181 Irene181
4年前
60行Python代码开发在线markdown编辑器
本文转载自公众号【python大数据分析】,详情可以点击上方卡片,关注该公众号,获取更多好文推荐。❝本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes❞1简介这是我的系列教程「PythonDash快速web应用开发」的第六期,在上一期的文章中,我们完成了对
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
山东彭于晏 山东彭于晏
4年前
ARM架构简单认识
什么是ARM架构定义(来自百度百科)ARM架构,曾称进阶精简指令集机器(AdvancedRISCMachine)更早称作AcornRISCMachine,是一个32位精简指令集(RISC)处理器架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的OMAP系列。对于ARM架构解释较好的博文参考博文1:参考博文2:
Stella981 Stella981
3年前
ARM MIPS PowerPC X86 四大常见处理架构比较
目录1、ARM(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fqidicloud.blog.csdn.net%2Farticle%2Fdetails%2F104992919%231%25E3%2580%2581ARM)1.1ARM历史(https://www.os
Wesley13 Wesley13
3年前
Oracle ADG究竟是否收费?
!(https://oscimg.oschina.net/oscnet/faaf5c218b3045fe9a38ffa00c48a996.png)前两天微信群中,有位朋友问了,OracleDatabaseStandardEdition11gR2标准版支持activedataguard么?可能平时
Stella981 Stella981
3年前
48 JS
1•历史对象:用以存储客户端最近访问的网址清单。格式:•history.属性history.方法(参数)<ahref"js9.jsp"单击</a<ahref""onclick"history.back();returnfalse;"返回</a注:一定要有returnfalse
Stella981 Stella981
3年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
可莉 可莉
3年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
码途琉璃狩
码途琉璃狩
Lv1
有的东西终究还是要失去,那我宁愿从来都未拥有过。
文章
4
粉丝
0
获赞
0