实验二 ARM环境下汇编语言实验

合集下载

基于arm的汇编实验报告

基于arm的汇编实验报告

竭诚为您提供优质文档/双击可除基于arm的汇编实验报告篇一:汇编实验报告实验一(1)熟悉汇编语言程序调试环境及顺序程序设计一、实验目的及要求:1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。

2.学会使用eDIT、mAsm、LInK、Debug等软件工具。

3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。

二、熟悉汇编语言程序调试环境1.汇编语言源程序的建立本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。

设定源程序的文件名为Abc。

DATAsegmenTbuFDb23h,16h,08h,20h,64h,8Ah,91h,35h,2bh,7Fh cneQu$-buFDATAenDscoDesegmenTAssumecs:coDe,Ds:DATAsTART:pushDsxoRAx,AxpushAxmoVAx,DATAmoVDs,AxmoVbx,oFFseTbuFmoVcx,cnDeccxmoVAL,[bx]IncbxLp:cmpAL,[bx]JbenexTmoVAL,[bx]nexT:IncbxDeccxJnZLpmoVAh,4chInT21hcoDeenDsenDsTART键入以下命令:c:\>eDITAbc.Asm此时屏幕的显示状态如图1所示。

1图1用eDIT编辑Abc.Asm程序窗口程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。

2.将源程序文件汇编成目标程序文件一般情况下,mAsm汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。

(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.obJ。

(3)若程序中使用了宏指令,则汇编程序将展开宏指令。

源程序建立以后,在Dos状态下,采用宏汇编程序mAsm 对源程序文件进行汇编,其操作过程如图2所示。

实验二_ARM汇编语言程序设计

实验二_ARM汇编语言程序设计

实验二ARM汇编语言程序设计实验目的1、了解ARM汇编语言程序的结构特点2、了解ARM汇编语言程序的编写方法3、掌握用ARM汇编语言设计简单程序实验仪器设备及软件ARM实验箱,计算机,ADS程序开发软件实验原理1、存储空间的格式ARM920将存储空间视为从0开始由字节组成的线性集合,字节0-3中保存了第一个字,字节4-7中保存了第二个字,依此类推。

字节还可以按小端格式或大端格式排列。

ARM实验箱中存储器的配置见附录C。

2、ARM的寄存器ARM状态下任何时刻都可以看到16个通过寄存器(r0-r15),1或2个状态寄存器(CPSR,SPSR),在特权模式下会切换到具体模下的寄存器组。

每个寄存器都是32位的,并且每个通用寄存器都可以作为数据处理的源数据或目标数据寄存器。

因此可以编写出更精简的程序。

3、ARM指令的条件执行状态寄存器中的N,Z,C,V是数据处理指令影响的标志。

几乎每条ARM指令可以根据状态位或状态位的逻辑运算有条件执行。

条件执行的指令后缀参考教材。

4、桶形移器ARM的桶形移位器,使ARM指令的中第二个操作数非常录活。

利用移位器,一条ARM 指令可以完成更多功能。

移位操作有:LSL 逻辑左移LSR 逻辑右移ASL 算术左移ASR 算术右移ROR 循环右移RRX 带扩展循环右称实验内容1、把内存中ramaddr开始的ramword个字清零(1)用后变址法ramaddr equ 0x31000000ramword equ 64clrrammov r0,#0mov r1,#ramwordldr r2,=ramaddrclrram1str r0,[r2],#4subs r1,r1,#1bne clrram1mov pc,lrLTORG(2)用前变址法clrrambakmov r0,#0mov r1,#ramwordldr r2,=ramaddr-4clrram2str r0,[r2,#4]!subs r1,r1,#1bne clrram2mov pc,lrLTORG2、把寄存器中,r0-r12的32位无符号32位数进行求和,和的低32位保存在r1中,高32位保存在r0中。

arm实验二

arm实验二

汇编语言与接口技术实验报告院系信息科学与工程学院专业班级计科1101学生姓名杜海指导教师黄向宇提交日期 2014年 4 月 9日实验二 ARM汇编语言程序设计一、实验目的●初步学会使用IAR EWARM 开发环境及ARM 软件模拟器。

●通过实验掌握简单ARM 汇编指令的使用方法。

●通过实验掌握使用ldm/stm、b、bl 等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR 的认识。

●通过实验掌握 ARM 处理器16 位Thumb 汇编指令的使用方法。

二、实验内容●利用实验参考程序学习使用ldr/str、mov 等指令访问寄存器或存储单元。

使用add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。

●编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。

最后把R4~R11 用LDMFD 指令清空赋值为0。

●新建工程,并自行编写汇编程序,分别使用ldr、str、ldmia、stmia 操作,实现对某段连续存储单元写入数据,并观察操作结果。

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

●编写程序从ARM状态切换到Thumb,在ARM 状态下把R2 赋值为0x12345678,在Thumb状态下把R2 赋值为0x87654321。

同时观察并记录CPSR、SPSR 的值,分析各个标志位。

三、实验设备1. UP-TECH S2410实验平台,ARM标准/增强型仿真器套件2. PC 操作系统WIN98 或WIN2000 或WINXP,IAR EWARM集成开发环境,仿真调试驱动程序(H-JTAG)。

四、实验参考程序#*********************************************************************************************# NAME: ARMcode1.s *# Author: Embest *# Desc: ARMcode examples *# copy words from src to dst *# History: shw.He 2005.02.22 *#*********************************************************************************************NUM EQU 20AREA ARMcode1,CODE,READONLYENTRYSTARTldr r0, =src /* r0 = pointer to source block */ldr r1, =dst /* r1 = pointer to destination block */mov r2, #num /* r2 = number of words to copy */mov sp, #0x400 /* set up stack pointer (r13) */blockcopymovs r3,r2, LSR #3 /* number of eight word multiples */beq copywords /* less than eight words to move ? */stmfd sp!, {r4-r11} /* save some working registers */octcopyldmia r0!, {r4-r11} /* load 8 words from the source */stmia r1!, {r4-r11} /* and put them at the destination */subs r3, r3, #1 /* decrement the counter */bne octcopy /* ... copy more */ldmfd sp!, {r4-r11} /* don't need these now - restore originals */ copywordsands r2, r2, #7 /* number of odd words to copy */beq stop /* No words left to copy ? */ wordcopyldr r3, [r0], #4 /* a word from the source */str r3, [r1], #4 /* store a word to the destination */subs r2, r2, #1 /* decrement the counter */bne wordcopy /* ... copy more */stopb stopALIGNsrcDCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dstDCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END五、实验步骤实验一:利用实验参考程序学习使用ldr/str、mov 等指令访问寄存器或存储单元。

ARM嵌入式实验报告

ARM嵌入式实验报告

实验一 ARM汇编指令使用实验——基本数学/逻辑运算一、实验目的1. 初步学会使用ARM ADS / Embest IDE for ARM 开发环境及ARM软件模拟器。

2. 通过实验掌握数据传送和基本数学/逻辑运算的ARM汇编指令的使用方法。

二、实验设备1. 硬件:PC机。

2. 软件:ADS 1.2 / Embest IDE 200X集成开发环境。

三、实验内容1.熟悉ADS 1.2 / Embest IDE 200X开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。

具体实验程序如下:/* armasm1a.s */.EQU X, 45 /*定义变量X,并赋值为45*/.EQU Y, 64 /*定义变量Y,并赋值为64*/.EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/.GLOBAL _START.TEXT_START: /*程序代码开始标志*/MOV SP, #STACK_TOPMOV R0, #X /*X的值放入R0*/STR R0, [SP] /*R0的值保存到堆栈*/MOV R0, #Y /*Y的值放入R0*/LDR R1, [SP] /*取堆栈中的数到R1*/ADD R0, R0, R1STR R0, [SP]STOP: B STOP /*程序结束,进入死循环*/.END2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

具体实验程序如下:/* armasm1b.s */.EQU X, 45 /*定义变量X,并赋值为45*/.EQU Y, 64 /*定义变量Y,并赋值为64*/.EQU Z, 87 /*定义变量Z,并赋值为87*/.EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/.GLOBAL _START.TEXT_START: /*程序代码开始标志*/MOV R0, #X /*X的值放入R0*/MOV R0, R0, LSL #8 /*R0的值乘以2的8次方 */MOV R1, #Y /*Y的值放入R1*/ADD R2, R0, R1, LSR #1 /*R1的值除以2再加上R0后的值放入R2*/MOV SP, #0X1000STR R2, [SP]MOV R0, #Z /*Z的值放入R0*/AND R0, R0, #0XFF /*取R0的低八位*/MOV R1, #Y /*Y的值放入R1*/ADD R2, R0, R1, LSR #1 /*R1的值除以2再加上R0后的值放入R2*/ LDR R0, [SP] /*Y的值放入R1*/MOV R1, #0X01ORR R0, R0, R1MOV R1, R2 /*Y的值放入R1*/ADD R2, R0, R1, LSR #1 /*R1的值除以2加上R0的值放入R2*/STOP: B STOP /*程序结束,进入死循环*/.END四、实验操作步骤1.新建工程。

实验二C ARM汇编指令实验

实验二C  ARM汇编指令实验

实验二ARM汇编指令实验一、实验目的1.掌握ARM数据处理指令的用法2.了解ARM汇编指令灵活的第二操作数,编写简单的汇编程序二、实验内容1.用MOV和MVN指令访问ARM通用寄存器2.使用ADD、SUB、AND、ORR、CMP和TST指令完成数据的加减运算及逻辑运算。

3.用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegister)监视运算值,打开存储器观察窗口(Memory)监视0x40003100地址处的值。

三、预备知识1、用ARM ADS集成开发环境,编写和调试程序的基本过程。

2、ARM指令的使用四、实验设备及工具(包括软件调试工具)硬件:PC机Pentium100以上。

软件:PC机Windows操作系统、ARM ADS 1.2集成开发环境、AXD五、实验步骤1.启动ADS1.2,使用ARM Executable Image工程模板建立一个工程。

如SY22.建立汇编源文件Test2.s,然后加入工程中。

3.编译、连接工程,选择Project Debug ,启动AXD软件仿真调试。

4.打开寄存器窗口,监视寄存器的值。

5.可以单步运行程序,可以设置、取消断点,或者全速运行,停止运行,调试时观察寄存器的值,运行结果见图2-1。

图2-1 ARM实验2的运行结果六、实验参考程序X EQU 11Y EQU 8BIT23 EQU (1<<23) ;BIT23 = 0X00800000AREA test2,CODE,READONL YENTRYCODE32START;MOV,ADD, R8=R3=X+YMOV R0,#XMOV R1,#YADD R3,R0,R1MOV R8,R3;MVN,SUB, R5= 0X5FFFFFF8 -R8*8MVN R0,#0XA0000007SUB R5,R0,R8,LSL #3;CMP, 5*Y/2 > 2*X ? R5=R5&0XFFFF0000,R5=R5|0X000000FFMOV R0,#YADD R0,R0,R0,LSL #2MOV R0,R0,LSR #1MOV R1,#XMOV R1,R1,LSL #1CMP R0,R1LDRHI R2,=0xFFFF0000ANDHI R5,R5,R2ORRLS R5,R5,#0x000000FF;TST,BIC:BIT23 =1?BIT6 = 0:1TST R5,#BIT23BICNE R5,R5,#0x00000040B STARTEND。

ARM汇编指令实验

ARM汇编指令实验

ARM 汇编指令实验一一. 实验目的1.初步学会使用μVision IDE for ARM 开发环境及ARM 软件模拟器;2.通过实验掌握简单 ARM 汇编指令的使用方法。

二. 实验设备1.硬件:PC 机一台;2.软件:μVision IDE for ARM 集成开发环境,Windows 98/2000/NT/XP。

三. 实验内容1.熟悉开发环境的使用并使用 ldr/str,mov 等指令访问寄存器或存储单元;2.使用 add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算。

四. 实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。

这些寄存器都是32 位的;6 个状态寄存器。

这些寄存器也是32 位的,但是只是使用了其中的12 位。

1. ARM 通用寄存器通用寄存器(R0-R15)可分为三类:1)不分组寄存器 R0~R7不分组寄存器R0~R7 在所有处理器模式下,它们每一个都访问一样的32 位寄存器。

它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。

2)分组寄存器 R8~R14分组寄存器R8~R14 对应的物理寄存器取决于当前的处理器模式。

若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。

寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。

寄存器R8~R12 没有任何指定的特殊用途,只是在作快速中断处理时使用。

寄存器R13,R14 各对应6 个分组的物理寄存器,1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。

寄存器R13 通常用做堆栈指针,称为SP;寄存器R14 用作子程序链接寄存器,也称为LR。

3)程序计数器 PC寄存器R15 用做程序计数器(PC)。

在本实验中,ARM 核工作在用户模式,R0~R15 可用。

2. 存储器格式ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。

ARM实验报告ARM

ARM实验报告ARM

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告西安工业大学实验报告一丶实验目的初步学会使用Embest IDE for ARM开发环境及ARM软件模拟器。

通过实验掌握简单ARM汇编指令的使用方法。

二、实验内容熟悉开发环境的使用并使用ldr/str,mov等指令访问寄存器或存储单元。

使用add/sub/lsl/lsr/and/orr等指令,完成基本数学/逻辑运算。

三、实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。

这些寄存器都是32 位的。

6 个状态寄存器。

这些寄存器也是32 位的,但是只是使用了其中的12 位。

ARM 通用寄存器通用寄存器(R0~R15)可分为3 类:不分组寄存器R0~R7;分组寄存器R8~R14;程序计数器R15;1) 不分组寄存器R0~R7;R0~R7 是不分组寄存器。

这意味着在所有处理器模式下,它们每一个都访问一样的32 位寄存器。

它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。

2)分组寄存器R8~R14R8~R14 是分组寄存器。

它们每一个访问的物理寄存器取决于当前的处理器模式。

若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。

寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。

寄存器R8~R12 没有任何指定的特殊用途。

只是使用R8~R14 来简单地处理中断。

寄存器R13,R14 各有6 个分组的物理寄存器。

1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。

寄存器R13 通常用做堆栈指针,称为SP。

每种异常模式都有自己的R13。

寄存器R14 用作子程序链接寄存器,也称为LR。

3) 程序计数器R15寄存器R15 用做程序计数器(PC)。

在本实验中,我们认为ARM 核工作在用户模式,R0~R15 可用。

四、实验过程1)打开Embest IDE Pro软件,选择菜单项File-->New Workspace,系统弹出对话框,点击OK创建名为TEXT的新工程,并同时创建一个与工程名相同的工作区。

实验二ARM汇编语言实验

实验二ARM汇编语言实验

x .long 0xaa88 Y .long 0x77aa z .long 0x123489ab
.text global _start _start:
MOV R0 , #0x55
实验设备: 宿主机:PC机
wait: B wait .end
目标机:IDE内置的软件模拟器
3、实验操作步骤
1)运行EmbestIDE
2)新建工作区
3)新建一个文件, 另存为以.s为扩展名的文件
4)在文件中编辑程序
5)把编辑好的源文件添加到工程中
6)设置工程属性
选择编译工具 调试配置 连接方式(SIM) 下载符号表文件 调试目标文件Fra bibliotek 下载内存地址
3、实验操作步骤
8)构建工程 可以单独编译一个文件,也可采用build实现编译、连
实验二 ARM汇编语言实验
2019/8/1
1
1 实验目的与要求 2 实验内容 3 实验操作步骤 4 测试数据与实验结果
1、实验目的与要求
目的: 1)熟练使用EmbestIDE集成开发环境。 2)基本掌握 ARM 汇编语言
要求: 1)独立完成程序设计、编码与调试 2)编写实验报告
2、实验内容
按照GNU汇编程序文件格式,用ARM汇编语言编写程序, 求三个数(x、y、z)中的最大值与最小值,分别存放在寄 存器R6、R7中。三个数用伪操作定义如下:
接一起完成。 如果编译过程出错,需要修改错误,直到构建成功。
9)调试 连接目标机 下载 运行(打开源文件、设置断点) 浏览(寄存器、内存)

arm程序设计实验报告

arm程序设计实验报告

arm程序设计实验报告ARM程序设计实验报告一、引言ARM(Advanced RISC Machine)是一种精简指令集计算机(RISC)架构。

在本次实验中,我们将学习和实践ARM程序设计的基本知识和技巧。

本报告将介绍实验的目标、步骤和结果,并对所学内容进行总结和思考。

二、实验目标本次实验的主要目标是通过编写ARM汇编程序,实现简单的功能。

具体来说,我们将学习如何使用ARM汇编语言编写程序,了解寄存器、指令和内存的基本概念,以及如何进行程序的调试和优化。

三、实验步骤1. 环境准备:安装ARM开发工具链,并配置开发环境。

2. 编写程序:根据实验要求,编写ARM汇编程序,实现指定的功能。

3. 调试与测试:使用模拟器或硬件平台,调试和测试编写的程序,确保程序的正确性和稳定性。

4. 优化改进:根据实验结果和性能要求,对程序进行优化改进,提高程序的效率和可靠性。

四、实验结果在本次实验中,我们成功完成了以下任务:1. 实现了一个简单的计算器程序,可以进行加减乘除运算,并输出结果。

2. 编写了一个字符串反转程序,可以将输入的字符串逆序输出。

3. 设计了一个简单的游戏程序,用户需要通过按键控制角色移动,避开障碍物。

通过以上实验,我们掌握了ARM汇编语言的基本语法和指令,了解了寄存器和内存的使用方法,以及如何进行程序的调试和优化。

同时,我们还学习了如何与外部设备进行交互,实现更复杂的功能。

五、实验总结通过本次实验,我们深入了解了ARM程序设计的基本原理和技巧。

ARM架构的精简指令集使得程序设计更加高效和灵活,适用于各种嵌入式系统和移动设备。

同时,ARM处理器的低功耗特性也使得其在无线通信、物联网等领域有着广泛的应用前景。

然而,ARM程序设计也存在一些挑战和难点。

首先,由于ARM汇编语言与高级语言相比,语法更为底层和复杂,需要更加深入地理解计算机硬件结构。

其次,ARM处理器的架构和指令集不同于传统的x86架构,需要重新学习和适应。

实验二 ARM汇编器ARMASM实验

实验二  ARM汇编器ARMASM实验

实验二:ARM汇编器ARMASM实验指导教师:覃志东一实验目的●掌握ARM汇编语言程序的基本组织结构●掌握ARMASM的命令行格式使用方法二实验内容本次实验要求学生配置好实验环境;然后使用ADS 的命令行汇编器armasm汇编一个汇编语言源程序,并连接、执行、调试。

需要学生查看相关的帮助文档,并完成实验报告的撰写。

三实验设备及工具●硬件:本次实验不用开发箱。

●软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境。

四基础知识请大家先阅读,了解汇编器。

五实验过程1认识命令行格式的汇编器(1)、进入dos命令行。

进入到ADS1.2的bin目录。

如图1-3.图1 进入DOS图2 进入ADS(可以观测其目录结构)图3 进入bin目录(可以观测其中有很多的工具)(2)、在bin>下输入:armasm –help,查看armasm的帮助。

如图4,5。

图4 armasm的帮助图5 armasm的帮助2对汇编源程序进行汇编(1)、把实验用的arm汇编源程序strcopy.s拷贝到bin>目录。

待编译的汇编图6 确定路径(2)然后在命令窗口键入:armasm –g strcopy.s并回车。

如图7所示。

想想该命令是什么意思?然后可以在bin目录下看见生成的对象文件。

图7 进行汇编汇编生成的对象文件图8 汇编生成3连接在命令行bin>下键入armlink strcopy.o –o strcopy.axf并回车,如图9所示。

具体步骤如下:图9 连接4调试执行(1)在命令行bin>下键入:armsd strcopy.axf并回车,如图11所示。

这就用命令行调试器加载了可执行文件。

(2)在armsd命令提示符下键入go.程序就执行,如图12所示。

图11 执行(2)推出arm符号调试器armsd。

可以在armsd:下键入quit。

如图12所示。

图12 退出六实验报告请阅读ADS1.2在线帮组文档,了解armsd的使用方法,完成本实验程序的调试。

大学ARM嵌入式实验报告范文

大学ARM嵌入式实验报告范文

大学ARM嵌入式实验报告范文《嵌入式系统》实验报告姓名:学号:班级:2022年4月实验一ARM汇编指令实验1一、实验目的1.初步学会使用ADS1.2开发环境及ARM软件模拟器;2.通过实验掌握简单ARM汇编指令的使用方法。

二.实验设备1.硬件:PC机;2.软件:ADS1.2集成开发环境。

Window98/2000/NT/某P。

三.实验内容1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。

2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四.实验原理ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。

1.ARM通用寄存器通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。

2.存储器格式ARM体系结构将存储器看作是从零地址开始的字节的线性组合。

字节0~3存放第一个字,字节4~7存放第2个字,以此类推。

ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

五.实验程序1.实验A参考程序某EQU45:定义变量某,并赋值为45YEQU64:定义变量y,并赋值为64STACK_TOPEQU0某1000:定义栈顶0某1000AREAE某ample,CODE,READONLY:声明代码段ENTRY:标识入口STARTMOVSP,#STACK_TOPMOVR0,#某:某的值放入R0STRR0,[SP]:R0的值保存到堆栈MOVR0,#Y:y的值放入R0LDRR1,[SP]:取堆栈中的数到R1ADDR0,R0,R1STRR0,[p]STOPBSTOP:死循环END:结束2.实验B参考程序某EQU45:定义变量某,并赋值为45YEQU64:定义变量y,并赋值为64ZEQU87:定义变量z,并赋值为87STACK_TOPEQU0某1000:定义堆栈顶0某1000AREAHU某IANG,CODE,READONLY:声明代码段,只读ENTRY:标识入口STARTMOVR0,#某:某的值放入R0MOVR0,R0,LSL#8:R0的值乘以2的8次方MOVR1,#Y:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2MOVSP,#0某1000STRR2,[SP]MOVR0,#Z:z的值放入R0ANDR0,R0,#0某FF:取R0的低八位MOVR1,#Y:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2LDRR0,[SP]:y的值放入R1MOVR1,#0某01ORRR0,R0,R1MOVR1,R2:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2STOPBSTOP:死循环END:结束六.实验结果及分析1.程序A的实验结果截图如下:实验分析;本实验使用LDR、STR、MOV等指令访问寄存器和存储单元,使用堆栈和寄存器R0,R1存储变量。

arm实验汇编语言编程技巧实验.

arm实验汇编语言编程技巧实验.

大连理工大学软件学院《嵌入式系统结构》实验报告组号: 552 实验箱编号: 21008552实验时间: 12 年10 月 11日实验室:嵌入式实验室实验台:Embest Edukit-III平台指导教师:邱铁成绩:实验2:汇编语言编程技巧实验一、实验目的和要求通过本次实验对ARM汇编语言编程的技巧进行训练,提高编写代码的速度与效率。

二、实验原理和内容1. 编写程序实现20!,将得到的64位结果送入[R9:R8]中。

原理:由1开始64位累乘(UMULL),高位存于R9中,低位存于R8中,每次用乘数对R8内数进行64位乘法,对R9进行普通乘法将R9乘后的值与原值相加继续存于R9,累乘20次。

2. 判断下列情况是否能够实现:如果能实现请写出程序代码1N=1,C=1,V=12N=0,C=1,V=13N=1,C=0,V=14Z=1,C=1,V=1原理:算数,逻辑等运算出的结果对标志位的影响3. 实现寄存器的高位和低位的互换,例如第0位和第31位互换……。

原理:R1内存有原值,每次让其与上#1得到最后一位的值,若为1则在原为空的R4的相应位上赋值1,之后R1右移一位,重复操作。

三、主要仪器设备及软件编程环境主要仪器设备:PC机软件编程环境:Embest IDE 2004集成开发环境,Windows 98/2000/NT/XP四、实验步骤与编程第一题:.global _start.text_start:MOV R9,#0MOV R8,#1MOV R0,#2MOV R1,#0mov r2,#0LOOP:UMULL R2,R1,R8,R0 MOV R8,R2MLA R9,R0,R9,R1 ADD R0,R0,#1CMP R0,#21BNE LOOPEND:B END.END第二题:.global _start.text_start:MOV R9,#0MOV R8,#0MOV R7,#1MOV R0,#2MOV R1,#0MOV R2,#0MOV R3,#0UMULL R2,R1,R7,R0 MOV R7,R2UMULL R3,R2,R8,R0 ADDS R8,R3,R1MUL R9,R0,R9ADC R9,R9,R2ADD R0,R0,#1CMP R0,#24BNE LOOPEND:B END.END第三题:(1).global _start.text_start:MOV R0,#0X80000000 ADDS R1,R0,#0X80000000 TEQ R0,#0X12B END.END(3).global _start.text_start:MOV R0,#-0XBFFFFFFF MOV R1,#-0XBFFFFFFF ADDS R2,R1,R0 END:B END.END(2)(4).global _start.text_start:MOV R0,#1MOV R1,#1MOV R0,R0,ROR #1 MOV R1,R1,ROR #1 ADDS R2,R1,R0 END:B END第四题:.global _start.text_start:LDR R0,=0x55555555 MOV R2,#1MOV R3,#32MOV R8,#1MOV R9,#0MOV R10,#2MOV R5,#1LOOP1:MOV R1,R0AND R1,R1,R8 MOV R6,R5LOOP2:MOV R1,R1,ROR #1 SUBS R6,R6,R2 BNE LOOP2ADD R5,R5,R10 ORR R4,R4,R1 MOV R8,R8,LSL #1 SUBS R3,R3,R2 BNE LOOP1 END:B END.END。

嵌入式实验简单ARM汇编编程实验

嵌入式实验简单ARM汇编编程实验

实验报告
题目1-3:实现程序:根据r0中存放的数据N,实现1+2+3……+N.
图1-3(1)
图1-3(2)
图1-3(3)
题目1-4:实现程序:使用LDR指令读取0x30003000地址上的数据,测试该数据的符号,若为正数,则利用STR指令向0x30003100单元写入1;
若为负数,则向该单元写入-1;若为0,则向该单元写入0。

图1-4(1)
图1-4(2)
图 1-4(3)
图1-4(4)
题目1-6:测试下列指令:(记录调试过程中,寄存器/地址寄存器的变化情况)
①MOV r0,#0x12345678;指令是否正确
②LDR r0, 0x1234和LDR r0,=0x1234;
③MOVS R15,#0x8000; 测试执行情况
④ MOV R0,0x30001000
LDR R1,[R0+4]
LDR R1,[R0+4]!
LDR R1,[R0]+4 ; 测试/理解LDR以上几种寻址工作过程;
图1-6(1)
图1-6(2)
图1-6(3)
题目1-7:下面是一个逆序拷贝程序,请将下面的C代码转换为汇编代码。

数组a和b分别存放在以0x30004000和0x30005000为起始地址的存储区内,类型为long(32位)。

for(i=0;i<7,i++)
{a[i]=b[7-i]};
1-7(1)
1-7(2)
1-7(3)
1-7(4)。

ARM汇编及接口设计-实验报告

ARM汇编及接口设计-实验报告
while (i--);
}
int main()
{
int i ;
LedConfig();
//跑马灯
while(1)
{
for(i=0;i<6;i++)
{
iLedOn(i);
delay();
}
for(i=0;i<6;i++)
{
iLedOff(i);
delay();
}
delay();
}
return 0;
}
步骤2:编译
5.3 LED流水灯设计实验
本实验要求使用arm-linux-gcc编译。备注,控制LED1的GPIO口为GPM0
步骤1:编写代码
参看相关实验样例,编写LED1报警灯代码,实现LED1以1秒左右的时间进行闪烁,要求LED驱动代码编写在leddrv.c中,功能代码编写在main.c文件中,启动代码文件和Makefile文件参照实验样例代码来设计。
编译步骤为:
打开linux终端,输入cd命令进入以上各程序文件所在目录,输入make命令进行编译。
步骤3:加载到内存中运行
步骤为:
将实验板用micro usb数据线于微机相连,安装好驱动后用相应软件加载到内存中运行。
实验箱断电后再重新加电,能否再次观察到LED1不停闪烁现象____A____(A.不能 B.能)。
5.4 参照相关参考样例,将5.3实验嵌入式看门狗驱动代码,完成硬件看门功能
则启动代码文件内容:
#ifndef __LEDDRV__H
#define __LEDDRV__H
void LedConfig(void);
void iLedOn(unsigned int iLed);

arm开发环境搭建实验报告实验内容

arm开发环境搭建实验报告实验内容

ARM开发环境搭建实验报告一、实验目的本实验旨在帮助学生了解和掌握ARM开发环境的搭建过程,包括交叉编译环境的搭建、嵌入式系统开发环境的搭建、ARM Linux操作系统的搭建以及应用软件的开发与部署。

通过本次实验,学生将能够熟悉ARM开发的基本流程,为后续的ARM开发打下基础。

二、实验内容1. 开发环境介绍本部分将介绍ARM开发环境的基本概念、组成和搭建流程。

重点讲解ARM架构的特点、开发板的选择以及开发工具链的组成。

通过本部分的学习,学生将能够对ARM开发环境有基本的了解和认识。

2. 交叉编译环境搭建交叉编译是指在一种平台上生成另一种平台上的可执行文件。

本部分将介绍如何搭建ARM交叉编译环境,包括交叉编译工具链的安装、配置和使用。

同时,学生将通过实践操作,掌握交叉编译的基本方法。

3. 嵌入式系统开发环境搭建嵌入式系统是指专为特定应用而设计的计算机系统。

本部分将介绍如何搭建嵌入式系统开发环境,包括开发板的连接、调试工具的安装以及嵌入式操作系统的选择和烧写。

通过本部分的学习,学生将能够掌握嵌入式系统开发的基本流程。

4. ARM Linux 操作系统搭建ARM Linux操作系统是一种针对ARM架构的开源操作系统。

本部分将介绍如何搭建ARM Linux操作系统,包括操作系统的下载、烧写以及启动过程。

同时,学生将学习如何在ARM Linux上安装软件、配置网络等操作,以便进行后续的应用软件开发。

5. 应用软件开发与部署本部分将介绍如何进行ARM应用软件开发与部署。

首先,学生将学习如何使用交叉编译工具链编译应用程序;其次,学生将学习如何将应用程序部署到ARM设备上,并进行测试和调试。

通过本部分的学习,学生将能够掌握ARM应用软件开发的整个流程。

三、实验步骤1. 安装交叉编译工具链,并配置环境变量;2. 连接开发板,并安装调试工具;3. 下载并烧写嵌入式操作系统;4. 安装ARM Linux操作系统;5. 编写应用软件源代码;6. 使用交叉编译工具链编译应用软件;7. 将应用软件部署到ARM设备上;8. 进行测试和调试。

实验二 ARM指令系统试验

实验二 ARM指令系统试验

实验二ARM指令系统试验讲师:杨行【实验目的】1、了解ARM汇编语言2、掌握简单C语言嵌套ARM汇编语言编程;3、了解APCS规范;【实验原理】一、介绍APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。

最显著的一点是对这些例程来自哪里没有明确的限制。

它们可以编译自C、Pascal、也可以是用汇编语言写成的。

APCS 定义了:对寄存器使用的限制。

使用栈的惯例。

在函数调用之间传递/返回参数。

可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。

APCS 不一个单一的给定标准,而是一系列类似但在特定条件下有所区别的标准。

例如,APCS-R (用于RISC OS)规定在函数进入时设置的标志必须在函数退出时复位。

在32 位标准下,并不是总能知道进入标志的(没有USR_CPSR),所以你不需要恢复它们。

如你所预料的那样,在不同版本间没有相容性。

希望恢复标志的代码在它们未被恢复的时候可能会表现失常...如果你开发一个基于ARM 的系统,不要求你去实现APCS。

但建议你实现它,因为它不难实现,且可以使你获得各种利益。

但是,如果要写用来与编译后的C 连接的汇编代码,则必须使用APCS。

编译器期望特定的条件,在你的加入(add-in)代码中必须得到满足。

一个好例子是APCS 定义a1 到a4 可以被破坏,而v1 到v6 必须被保护。

二、C语言嵌套ARM汇编语言int (*my_printf)(const char *format, ...);int main(void){int n = 5;int m = 1;int ret;my_printf = (void *)0x33f963a8;// 1 + 2 * 3 - 5__asm__ __volatile__(/*汇编程序*/"mov r0, %1\n""mov r1, %2\n""sub r2, r0, r1\n""mov %0, r2\n":"=r"(ret) /*输出部,=代表输出*/:"r"(n),"r"(m) /*输入部,r代表和寄存器相关联*/:"r0","r1","r2" /*保护部*/);my_printf("[ ret = %d]\n", ret);return 0;}三、汇编语言编程.text.global _start_start: @这个是裸板程序的入口函数@lr寄存器是程序链接寄存器,是pc的备份stmfdsp!,{r0-r12,lr} @函数跳转的时候,保存现场bl mainldmfdsp!,{r0-r12,pc} @函数跳转的时候,恢复现场【实验仪器】1、装有Linux操作系统的PC机一台;2、mini2440实验开发平台一套【实验内容】1、在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的和,通过串口输出;以下是输入两个个位数然后计算其和;int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;ch=my_getc();my_printf("a= %c\n",ch);a=ch-48;ch=my_getc();my_printf("b= %c\n",ch);b=ch-48;__asm__ __volatile__("mov r0,%1\n""mov r1,%2\n""add r2,r1,r0\n""mov %0,r2\n":"=r"(c):"r"(a),"r"(b):"r0","r2","r3");my_printf("%d+%d=%d\n",a,b,c);return 0;}2、在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的积,通过串口输出;以下是计算两个个位数积的源程序int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;inta,b,c;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;ch=my_getc();my_printf("a= %c\n",ch);a=ch-48;ch=my_getc();my_printf("b= %c\n",ch);b=ch-48;__asm__ __volatile__("mov r0,%1\n""mov r1,%2\n""mul r2,r1,r0\n""mov %0,r2\n":"=r"(c):"r"(a),"r"(b):"r0","r2","r3");my_printf("%d*%d=%d\n",a,b,c);return 0;}3、在u-boot命令行输入一个数,先写入0x30008000地址然后从从0x30008000地址读出数据。

实验二 ARM汇编语言编程实验.doc

实验二 ARM汇编语言编程实验.doc

实验二:ARM 汇编语言编程实验一、实验目的1、掌握ADT IDE ARM 开发环境中基本的工程设置以及程序编译方法。

2、掌握ADT IDE ARM 开发环境中基本的程序调试方法。

3、掌握基本的ARM 汇编语言编程方法。

二、实验内容用汇编语言编写一个程序实现如下目的:从源地址拷贝num 个字(num*4个字节)的数据到目的地址dst 中。

三、预备知识1、ARM 汇编语言的基础知识。

2、程序调试的基础知识和方法。

四、实验设备1、硬件:JXARM9-2440教学实验箱、PC 机。

2、软件:PC 机操作系统Windows 98(2000、XP)+ADT IDE 开发环境。

五、基础知识ADT IDE 集成了GNU 汇编器arm-elf-as 、编译器arm-elf-gcc 和链接器arm-elf-ld 。

在ADT IDE 中编写的程序必须符合GNU 的语法规则。

下面介绍一些基本的GNU 汇编知识以及本实验用到的ARM 汇编指令。

1、GUN 汇编语言语法及规则1)_start_start 为程序默认入口点,代码段默认起始地址为0x800,如果需要修改可以在链接脚本文件中指定。

2)标号语法:symbol:symbol 为定义的符号。

说明:上述代码定义一个标号,它表示程序中当前的指令或数据地址。

如果在程序中出现两个相同的标号,汇编器将会产生一个警告,且只有第一个标号有效。

课程名称 ARM 体系结构 实验成绩 指导教师 冯灵霞实 验 报 告 院系 信息工程学院班级计算机科学与技术(嵌入式) 学号 姓名 日期2、GNU汇编语言伪操作1).equ伪操作语法:.equ symbol,exprexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或位的常量。

symbol为.equ 伪操作为expr定义的字符名称。

说明:该操作符为数字常量、基于寄存器的值和程序中的标号定义一个字符名称,相当于C语言中的宏定义。

示例:.equ USERMODE,0x102).global伪操作符语法:.global symbolsymbol为声明的符号的名称。

3.2 ARM汇编指令实验二

3.2 ARM汇编指令实验二
32arm汇编指令实验二实验操作步骤实验原理实验内容实验设备实验目的一实验目的通过实验掌握使用ldmstmbbl等指令完成较为复杂的存储区访问和程序分支学习使用条件码加强对cpsr的认识
3.2 ARM汇编指令实验二
1
实验目的
2
实验原理
实验操作步骤
一、实验目的
通过实验掌握使用LDM/STM,b,bl 等指令完成较为复杂的存储区访问和 程序分支,学习使用条件码,加强对 CPSR的认识。
二、实验设备
硬件:PC机 软件:Embest IDE 2003集成开发环境, Windows 98/2000/NT/XP
三、实验内容
熟悉开发环境的使用并完成一块存储 区的拷贝。 完成分支程序设计,要求判断参数, 根据不同参数,调用不同的子程序。
四、实验原理
ARM程序状态寄存器
CPSR与SPSR的格式 ARM工作模式
10. 11.
五、实验操作步骤
实验B步骤
1.
2. 3.
ARM汇编指令实验一和实验参考程序,在当 前工作区添加新工程asm1_b。 参照实验A的步骤完成目标代码的生成与调 试。 理解和掌握实验后,完成实验练习题。
4. 5. 6. 7.
五、实验操作步骤
实验A步骤
8. 9. 打开memory窗口,观察地址0x8054~0x80A0的内 容,与地址0x80A4~0x80f0的内容; 单步执行程序并观察和记录寄存器与memory的值 变化,注意观察步骤8里面的地址的内容变化,当 执行STMFD,LDMFD,LDMIA和STMIA指令的 时候,注意观察其后面参数所指的地址段或寄存 器段的内容变化; 结合实验内容和相关资料,观察程序运行,通过 实验加深理解ARM指令的使用; 理解和掌握实验后,完成实验练习题。

ARM汇编指令实验

ARM汇编指令实验

ARM 汇编指令实验一一. 实验目的1.初步学会使用μVision IDE for ARM 开发环境及ARM 软件模拟器;2.通过实验掌握简单 ARM 汇编指令的使用方法。

二. 实验设备1.硬件:PC 机一台;2.软件:μVision IDE for ARM 集成开发环境,Windows 98/2000/NT/XP。

三. 实验内容1.熟悉开发环境的使用并使用 ldr/str,mov 等指令访问寄存器或存储单元;2.使用 add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算。

四. 实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。

这些寄存器都是32 位的;6 个状态寄存器。

这些寄存器也是32 位的,但是只是使用了其中的12 位。

1. ARM 通用寄存器通用寄存器(R0-R15)可分为三类:1)不分组寄存器 R0~R7不分组寄存器R0~R7 在所有处理器模式下,它们每一个都访问一样的32 位寄存器。

它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。

2)分组寄存器 R8~R14分组寄存器R8~R14 对应的物理寄存器取决于当前的处理器模式。

若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。

寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。

寄存器R8~R12 没有任何指定的特殊用途,只是在作快速中断处理时使用。

寄存器R13,R14 各对应6 个分组的物理寄存器,1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。

寄存器R13 通常用做堆栈指针,称为SP;寄存器R14 用作子程序链接寄存器,也称为LR。

3)程序计数器 PC寄存器R15 用做程序计数器(PC)。

在本实验中,ARM 核工作在用户模式,R0~R15 可用。

2. 存储器格式ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。

实验2基于ARM的汇编语言程序设计

实验2基于ARM的汇编语言程序设计

实验2基于ARM的汇编语⾔程序设计实验⼆基于ARM的汇编语⾔程序设计⼀、实验⽬的了解ARM汇编语⾔的基本框架,学会使⽤ARM的汇编语⾔编程。

⼆、实验设备标准硬件。

三、实验内容⽤汇编语⾔编写“连续发送128个ASCII字符”的应⽤程序。

四、实验原理ARM汇编语⾔程序中,是以程序段为单位来组织代码。

段是相对独⽴的指令或数据序列,具有特定的名称。

段可以分为代码段和数据段,代码段的内容为执⾏代码,数据段存放代码运⾏时所需的数据。

⼀个汇编程序⾄少应该有⼀个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成⼀个可执⾏⽂件。

因此在进⾏汇编时除了要了解其书写规范外,还要能理解段的应⽤。

下⾯是⼀个代码段的⼩例⼦,实现数据的装载AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]…END上述程序,在汇编程序中,⽤AREA指令定义⼀个段,并说明定义段的相关属性,其格式为AREA 段名,属性1,属性2,…,属性n。

本例中定义了段名为Init的属性为代码段,只读。

ENTRY伪指令标识程序的⼊⼝,即代码从此处开始执⾏,程序的末尾为END指令,该伪指令告诉编译器源⽂件的结束,每⼀个汇编⽂件都要以END结束。

AREA DataArea, DATA, NOINIT, ALIGN=2DISPBUF SPACE 200RCVBUF SPACE 200…DATA为数据段的标识。

本程序段名为DataArea,属性数据段,不含初始化,采⽤align表达式对其⽅式2表达式次⽅。

五、实验步骤1.打开ADS1.2开发环境,打开\基础实验\实验五\asm.mcp项⽬⽂件,然后进⾏compile和make⽣成*.axf⽂件。

2.编译通过后,进⼊ADS1.2调试界⾯,加载\基础实验\实验五\asm_Data\Debug中的映象⽂件asm.axf。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二ARM环境下汇编语言实验一、实验目的1、掌握基本的ARM汇编语言编程方法;2、深入理解ARM开发环境的体系结构;3、巩固使用AXD调试的方法二、实验内容1、单独使用ARM汇编语言编写一个工程,在AXD下调试,观察结果三、实验设备1、硬件:DM2410B+实验系统,PC机2、软件:PC机操作系统(WINDOWS 2000),ARM Developer Suite v1.2四、预备知识1、掌握在ADS开发环境下建立工程与调试程序的方法(参考“ADS开发环境实验”与“JTAG 下载和调试实验”);2、熟悉ARM汇编语言;3、熟悉S3C2410芯片结构系统和实验系统的硬件资源(参考《DM2410实验系统使用手册》)五、基础知识ADS IDE开发坏境集成了CodeWarri or编译器和AXD Debugger调试器。

在ADS IDE开发环境中编写的程序必须遵循CodeWarrior编译器所支持的语法规则1、基于CodeWarrior的汇编语言语法及规则:一个完整的汇编语句代码由3部分组成:1)代码的行号:行号后面不用“:”结尾;2)汇编指令或伪指令部分;3)注释部分:以“;”开头2、基于CodeWarrior的汇编语言伪操作1) AREA伪指令2)ENTRY伪指令3)END伪指令4)EQU指令3、指令的条件域当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。

当指令的执行条件满足时,指令被执行,否则指令被忽略。

每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。

条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。

在1 6种条件标志码中,只有1 5种可以使用,第16种(1111)为系统保留,暂时不能使用。

4、存储器访问指令ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。

常用的加载存储指令如下:——LDR 字数据加载指令——LDRB 字节数据加载指令——LDRH 半字数据加载指令——STR 字数据存储指令——STRB 字节数据存储指令——STRH 半字数据存储指令5、程序分支指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:——使用专门的跳转指令。

——直接向程序计数器PC写入跳转地址值。

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR, PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:——B 跳转指令——BL 带返回的跳转指令——BLX 带返回和状态切换的跳转指令——BX 带状态切换的跳转指令六、实验说明1、本实验用到的代码如下:;===============================================================;实验名称:ARM汇编语言编程实验;程序功能:实现从源地址拷贝num个字数据,到目的地址des中;===============================================================;下面是段名为Init的,只读的代码段AREA Init, CODE, READONLYnum EQU 20ENTRY ;伪指令指出程序的入口点;传递参数并设置堆栈startLDR r0, =src ;r0 = 源数据块地址LDR r1, =dst ;r1 = 目的数据块地址MOV r2, #num ;r2 = 拷贝字数量MOV sp, #0x400 ;建立栈指针(r13);块拷贝:以32个字节(8个字)为单位进行拷贝;使用指令:LDMIA,STMIAblockcopyMOVS r3, r2, LSR #3 ;r3 = r2/8 = 2(num = 20)BEQ copywords ;少于8个字则跳转到copywords处理STMFD sp!, {r4 - r11} ;保存工作寄存器octcopyLDMIA r0!, {r4 - r11} ;从源地址取出8个字数据分别存放到(r4 - r11)中STMIA r1!, {r4 - r11} ;将(r4 - r11)中的数据设置到目的数据块地址SUBS r3, r3, #1 ;计数器递减BNE octcopy ;重复拷贝LDMFD sp!, {r4 - r11} ;恢复工作寄存器;字拷贝:以4个字节(1个字)为单位进行拷贝;使用指令:LDR,STRcopywordsANDS r2, r2, #7 ;最多拷贝7个,多余8个先使用blockcopy,然后使用copywords拷贝BEQ stop ;是否拷贝完毕,拷贝完毕则跳转到stopwordcopyLDR r3, [r0], #4 ;从源地址取出1个字数据存放到r3中STR r3, [r1], #4 ;将r3中的数据设置到目的数据地址SUBS r2, r2, #1 ;计数器递减BNE wordcopy ;重复拷贝;将程序的控制权转交给调试器stopMOV r0, #0x18 ;angel_SWIreason_ReportExceptionLDR r1, =0x20026 ;ADP_Stopped_ApplicationExitSWI 0x123456 ;ARM semihosting SWI;下面是段名为BlockData的,可读写的数据段;定义源地址数据,以及目的地址数据AREA BlockData, DATA, READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END ;程序结束2、对本实验代码的分析1)第一部分中,第一句“AREA Init,CODE,READONLY’’定义了一个代码段,段名为Init,是只读段;第二句“num EQU 20’’定义一个字符num代表数值常量20;第三句“ENTRY’’标识一个代码段的入口;2)第二部分是start部分,完成的功能是传递参数并设置堆栈;3)第三部分实现的功能是块拷贝,即以32个字(8个字)为单位进行拷贝,包括“blockc opy"和“octcopy"两部分。

其中,“blockcopy”部分完成检查要拷贝的数据是否构成一个块(8个字),以及保存工作寄存器的功能;“octcopy"部分完成具体的一个块(8个字)的拷贝,并恢复工作寄存器的功能;4)第四部分实现的功能是字拷贝,即以1个字(4个字节)为单位进行拷贝,也包括两部分:“copywords"部分和“wordcopy”部分。

其中,“copywords’’部分完成的功能是:如果在“blockcopy"部分中发现要拷贝的数据不够一个块,即8个字,那么就跳转到“copywords"部分进行字的拷贝。

如果字拷贝完毕,则跳转到“stop”部分结束程序。

“wordcopy”部分完成的功能是:实现具体的一个字的拷贝;5)第五部分是“stop”部分,作用是将程序的控制权转交给调试器。

需要完成三部分的工作:①在寄存器r0中写入操作的类型。

语句“MOV r0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException,表示r1中存放程序的执行状态②在r1中写入程序的状态参数语句“LDR r1,=0x20026”将r1的值设置成ADP_Stopped_ApplicationExit,该宏表示程序正常退出③使用SWI将控制权转交给调试器语句“SWI 0x123456”结束程序,将CPU的控制权交回到调试器手中。

6)第六部分定义了一个数据段,段名是BlockData,是可读写的段。

该段中定义了源地址的数据和目的地址的数据7)第七部分是“END”语句,作用是结束程序七、实验步骤1、将光盘目录下“ADS实验指导\ADS开发环境实验\C语言与汇编语言实验\ assemble”工程复制到硬盘上,用CodeWarrior打开Assemble. mcp工程文件。

2、本实验编译使用的内存配置方式和其他的实验不完全一样,所以在设置上有其特殊性。

在DebugRel目标配置下设置:1)对编写好的ARM汇编程序进行编译链接,生成可执行的assemble. axf二进制镜像 3、打开AXD5、用AXD打开项目可执行文件“assemble. axf”,用AXD调试代码并观察寄存器和存储器的值的变化,打开AXD调试器并配置,打开Processor Registers窗口和Memory窗口,导入本实验代码的镜像文件assemble.axf。

然后,在程序中设置适当的断点,点击工具栏上的Step In按钮,就可以在左侧的Processor Registers窗口和在下方的Memory窗口中看到寄存器和存储器中的值的变化。

以下给出详细的调试框图:。

相关文档
最新文档