文章和代码已归档至【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程序
startMOV SP, #0x400     ; 设置堆栈地址为0x400LDR R0, =Src        ; 先将原字符串地址加载到R0LDR R1, =Dst        ; 将目的字符串地址加载到R1MOV R3,#0         ; 定义R3中的内容为0
strcopyLDRB R2,[R0],#1     ; 将R0的内容读入寄存器R2,并将R0R0+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设计编程(二) 字符串拷贝相关推荐

  1. 嵌入式ARM设计编程(一) 简单数据搬移

    文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 熟悉实验开发环境,掌握简单ARM ...

  2. 嵌入式ARM设计编程(三) 处理器工作模式

    文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 (1) 通过实验掌握学会使用ms ...

  3. 嵌入式ARM设计编程(四) ARM启动过程控制

    文章和代码已归档至[Github仓库:hardware-tutorial],需要的朋友们自取.或者公众号[AIShareLab]回复 嵌入式 也可获取. 一.实验目的 (1) 掌握建立基本完整的ARM ...

  4. 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)

    文章目录 0x00. 整数加减乘除 0x01. 一维数组按某种规律求和 0x01.1 求 1~100 之和 0x01.2. 求一维数组的和 0x01.2. 求一维数组的所有奇数的和 0x02. 二维数 ...

  5. FPGA设计编程(二) 8-3线优先编码器与3-8线译码器

    目录 [实验要求] [实验软件工具] [实验一]设计一个8-3线优先编码器(74LS148) 1. 实验内容与原理说明 2. 实验模块程序代码和激励代码 (1)设计模块代码 (2)激励模块代码 3. ...

  6. SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理...

    程序的大部分代码都可以在必要的时候才加载到内存去执行,运行完后可以被直接丢弃或者被其他代码覆盖.我们PC上同时跑着很多的应用程序,每个应用程序使用的虚拟地址空间几乎可以整个线性地址空间(除了部分留给操 ...

  7. SoC嵌入式软件架构设计

    内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...

  8. SoC嵌入式软件架构设计之中的一个:系统内存需求评估

    内存是SoC(System on Chip,片上系统)集成设计的重要模块.是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必需要在成本和效率中取得平衡,做到 ...

  9. SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...

最新文章

  1. 提高cube性能的一些方法(一)
  2. Python正则表达式之元字符详解(1)
  3. 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
  4. 非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制
  5. MVVM Template
  6. matlab 双音多频 接收端检测到的号码,信号语音论文,关于基于MATLAB的双音多频信号识别相关参考文献资料-免费论文范文...
  7. 第六十四期:聊聊原子变量、锁、内存屏障那点事
  8. java中自动装箱的问题
  9. wireshark: there are no interfaces on which a capture can be done
  10. 小区移动基站安全吗?会杀人于无形吗?
  11. 多线程中抛异常的这个面试题你会吗?
  12. java日期减去天数得日期_Java日期添加天数,减去天数,日历
  13. 推荐两款很好用的听书APP
  14. QQ透明头像通用设置教程!不仅简单而且免费!
  15. 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
  16. 大数据对人们的好处_大数据给人们生活带来哪些好处?
  17. linux制作剪刀石头布游戏,C#实现剪刀石头布游戏
  18. 【AI好书】不想被AI降维打击?美国“四院院士”写的这本深度学习科普书了解一下...
  19. 不可错过的javascript迷你库 1
  20. iOS 6:动态下载字体

热门文章

  1. S4 BP供应商批导
  2. 没有gpedit.msc这个文件获取管理员权限
  3. TERMIOS详解【转】
  4. 登录和第三方授权(Cookie和Authorization)
  5. 自定义UDF、UDAF、UDTF函数
  6. 如何解决IAR不能设置断点的问题
  7. 大数据Impala系列之初识Impala
  8. Composing Photos Like a Photographer_2021_CVPR论文笔记
  9. 5 MATLAB参数估计与假设检验-参数估计
  10. 【思路整理】凑数问题