当前位置:文档之家› 实验二 ARM环境下汇编语言实验

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

实验二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窗口中看到寄存器和存储器中的值的变化。

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

相关主题