嵌入式ARM设计编程(二) 字符串拷贝
2023-06-13 09:17:01 时间
文章和代码已归档至【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程序
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,并将R0R0+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和寄存器中数据变化。
通过存储器可见,内容正在逐渐地进行拷贝。过程如下:
直到拷贝过程结束,实验结束后存储单元中的内容如下:
相关寄存器中的具体内容如下所示:
练习题:
编写程序循环对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
实验初始时,寄存器中内容如下:
实验结束后,寄存器中的内容如下:
相关文章
- 嵌入式小知识 | Cortex-M3咬尾中断与晚到中断
- ARM基础了解_arm编程架构
- 嵌入式入门必看!调试工具安装——基于 AM64x核心板
- 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
- 如何学习嵌入式Linux_韦东山
- 嵌入式ARM设计编程(一) 简单数据搬移
- 嵌入式ARM设计编程(四) ARM启动过程控制
- 嵌入式状态机的编程优点
- 【2023全球半导体IC新品盛宴】一年一度Embedded World全球顶级嵌入式会展结束,盘点各大软硬件厂商带来的新品(2023-03-17)
- 如何成为高级嵌入式硬件工程师?
- 一些不错的单片机,嵌入式Linux书籍推荐
- 探索嵌入式Linux编程之旅(嵌入式linux编程)
- 嵌入式Linux编程完全指南(嵌入式linux书)
- 建设国家强大的嵌入式Linux(国嵌嵌入式linux)
- 嵌入式Linux编程宝典(嵌入式linux经典书籍)
- 让嵌入式Linux掌控你的科技世界(嵌入式linuxc)
- Linux嵌入式程序设计:开启全新的编程旅程(linux嵌入式程序设计)
- 编程嵌入式Linux串口编程技术实现新空间(嵌入式linux串口)
- 嵌入式Linux开发实战(嵌入式linux开发书籍)
- 拥抱Linux嵌入式,缤纷学习体验(学linux嵌入式)
- 管理嵌入式Linux系统中的进程管理(嵌入式linux进程)
- 教程Linux嵌入式开发视频快速入门!(linux嵌入式开发视频)
- 迈向精通嵌入式Linux编程(精通嵌入式linux编程)
- Linux C与嵌入式汇编编程精要(linuxc嵌入汇编)
- 如何进行 Linux 嵌入式移植?(linux嵌入式移植)
- Linux下SDCC编译器:高效开发嵌入式系统的利器(linuxsdcc)
- 编程Linux嵌入式C语言编程实践(linux 嵌入式c)
- 嵌入式 Linux知识享给你,来参加我们的培训班!(嵌入式 linux培训班)