1 / 39

实验一 ARM 汇编基础实验

实验一 ARM 汇编基础实验. 1. 一、实验目的. 1. 掌握 ARM 汇编指令 2. 学习掌握 C 与汇编混合编程基础 3. 熟练使用 ARM 调试工具 RVDS 进行调试操作. 2. 二、实验内容. 1 .熟悉 ARM 汇编 2 .用 ARM 汇编实现 1+2+...+N 3 . C 调用汇编实验(实现字符串拷贝功能) 4 .汇编调用 C 实验 5 . ARM 汇编实现冒泡算法(选做). 3. 三、预备知识. 1. ARM 汇编、 C 语言 2. RVDS 工具. 4. 四.实验设备与工具. 硬件: PC 机 Pentium100 以上

xena
Download Presentation

实验一 ARM 汇编基础实验

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 实验一 ARM汇编基础实验 1

  2. 一、实验目的 1.掌握ARM汇编指令 2.学习掌握C与汇编混合编程基础 3.熟练使用ARM调试工具RVDS进行调试操作 2

  3. 二、实验内容 • 1.熟悉ARM汇编 • 2.用ARM汇编实现1+2+...+N • 3.C调用汇编实验(实现字符串拷贝功能) • 4.汇编调用C实验 • 5.ARM汇编实现冒泡算法(选做) 3

  4. 三、预备知识 1. ARM汇编、 C语言 2. RVDS工具 4

  5. 四.实验设备与工具 • 硬件:PC 机Pentium100 以上 • 软件:Windows操作系统,RVDS软件 5

  6. 五、实验原理 ARM中的C和汇编混合编程: 1.在汇编中使用C定义的全局变量 2.在汇编中调用C的函数 3.在C中调用汇编的函数 6

  7. 汇编语言中使用C定义的全局变量 1.在汇编中使用C定义的全局变量 在汇编和C之间进行一些数据的传递,最简便的办法就是使用全局变量。 在汇编中调用C中定义的全局变量,需要在汇编中IMPORT 对应的全局变量。 IMPORT 伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义 。 例如:汇编文件asmfile.s想调用C文件cfile.c中定义的全局变量a,则在汇编文件asmfile.s前面要添加: IMPORT a 7

  8. 汇编中调用C函数 2.在汇编中调用C的函数 要在汇编中调用C文件中定义的函数,主要做两方面的工作: 首先:需要在汇编中IMPORT 对应的C函数名。 其次:在调用该C函数之前还需要通过汇编语言传递该函数的 参数。 C和汇编之间的参数传递是通过ATPCS(ARM Thumb Procedure Call Standard)的规定来进行的。简单的说就是如果函数有不多于四个参数,对应的用ARM寄存器R0-R3来进行传递,多于4个时借助栈。函数的返回值通过R0来返回。 8

  9. /*asmfile */ AREA asmfile, CODE, READONLY IMPORT cFun ENTRY MOV R0, #22 MOV R1, #11 BL cFun MOV R4,R0 (函数返回值保存在R0中) END /*C file, called by asmfile */ int cFun(int a,int b) { return a-b; } 9

  10. C中调用汇编函数 3.在C中调用汇编的函数 在C中调用汇编文件中的函数,要做的主要工作有两个: 一:是在C中声明函数原型,并加extern关键字; 二:是在汇编中用EXPORT导出函数名,并用该函数名作为汇 编代码段的标识,最后用mov pc,lr返回。然后,就可以 在C中使用该函数了。 EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。 10

  11. C中调用汇编函数 /*C file*/ extern void fun (int *p);声明函数原型 int main() {int i;fun(&i);printf("%d\n", i);return 0; } /*ASMFILE*/ AREA asmfile, CODE, READONLY EXPORT fun导出函数名 fun MOV R1,#1 STR R1,[R0] MOV PC,LR返回语句 END

  12. RVDS简单使用介绍

  13. 创建新工程 点击CodeWarrior for RVDS进入CodeWarrior IDE主窗口,选择File->New进入新建工程/文件选项卡,在选项卡中选择ARM Executable Image ,并在Project name中输入新建工程的名字,在Location中选择工程文件的存放地址,如图35所示,按下确定后,RVDS将生成用户指定名称的工程。

  14. 14 图35

  15. 添加文件到工程 选择File->New进入新建工程/文件选项卡,点击选项卡中的File选项,选择Text File,在File name中填写要添加的文件名,在Location中选择源文件的存放目录,并选择Add to Project 选项,接着在下面的Project选项中选择上一步新建的工程,并在Targets选项中选择Debug和Release,具体如图36所示

  16. 图36 16

  17. 设置工程配置选项 选择Edit->Debug Settings或是按“ALT+F7”进入工程配置界面,如图37所示 17 图37

  18. 设置工程配置选项 选择配置界面下的Language Setting->Realview Assembler对RVDS下的汇编器进行配置,主要选择Architecture 18 图38

  19. 设置工程配置选项 选择配置界面下的Language Setting->Realview Compiler对RVDS下的C编译器进行配置,主要选择Architecture 图39 19

  20. 设置工程配置选项 选择配置界面下的Linker->Realview Linker对RVDS下的连接器进行配置,主要配置RO Base,设置生成的可执行程序的下载地址 图40 20

  21. 设置工程配置选项 选择配置界面下的Debugger->Realview Debugger对RVDS下的调试器进行配置,主要配置是选择RVD还是ADS环境下的调试器AXD进行调试 图41 21

  22. 编译并连接 选择Project->Make或是快捷键“F7”对工程中的源文件进行编译并连接,生成带调试信息的可执行文件.axf文件 图42 22

  23. 调试 选择Project->Debug或是快捷键“F5”启动RVD调试器,并调用生成带调试信息的可执行文件.axf文件 图43 23

  24. RVD调试器界面 图44即为进入的RVD调试界面,选择Target->Connect to target进入仿真器的选择,如图35所示,选择ARMulator即为选择软件仿真,选择H-JTAG即为选择硬件调试 图44 24

  25. 图45 25

  26. 单步调试和运行 选择Debug->Step Into或是“F11”即可选择单步运行,可以对源程序进行单步调试,选择Debug->Run或是“F5”选择直接运行该程序。 图46 26

  27. 观察寄存器和内存 选择View->Registers就可以调用ARM寄存器界面,可以在调试过程中随时查看ARM寄存器的值;选择View->Memory可以调用内存界面,可以在调试过程中随时查看内存中的值。 图47 27

  28. 六、实验内容 1、运行RVDS,建立工程文件,单步运行演示示例程序(/我的文档/实验一 汇编实验/熟悉ARM汇编目录下)深刻理解每一条指令,观察寄存器,内存空间的变化。 此处提供六个示例实验: ARM数据处理指令寻址方式实验和ARM内存访问指令寻址方式实验为必做实验。 ARM堆栈指针寄存器实验、ARM程序计数器实验、ARM程序状态寄存器实验、ARM工作模式切换实验为选做部分,剩余时间或课后完成此部分选做内容。

  29. 寄存器读写实例 R0 LDR指令执行前R0存放00000000 LDR指令执行后R0存放001000000

  30. 大端模式与小端模式 • 小端模式: CPU对操作数的存放 采用低地址存放低字节,高地址存放高字节。 • 大端模式 CPU对操作数的存放 采用低地址存放高字节,高地址存放低字节。 本实验采用小端模式。

  31. 内存读写实例 写内存,STMIA指令执行前 写内存,STMIA指令把 R1-R3写到R0开始的地址

  32. 寄存器读写实例 双击该位置,输入地址,查看对应地址存储值 寄存器赋值前 寄存器赋值后

  33. 内存读写实例 LDMIA指令执行前 把R0(0x210000)开始的6个字读到R1-R5,R7

  34. 实验一 2、用ARM汇编实现1+2+….n的运算。 在sum.s文件中,用汇编实现算法核心部分,需添加的代码参考流程图如下: R0暂存累加和 R1自增1 34

  35. 实验二 3、理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。 在汇编文件testfile1.s中添加两行汇编代码,分别实现: 拷贝源字符串的一个字节到R2中 将拷贝的字节复制到目标空间 注意事项: 1.C文件和汇编文件都必须加到工程中去,否则编译会报错。 2.C文件和汇编文件要拷贝到工程目录下。 35

  36. 实验三 4、在汇编中调用C函数。 在汇编文件testfile2.s中相应位置添加汇编代码,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。 36

  37. 实验四(选做) 5、用ARM汇编实现冒泡算法。(选做) 这种方法的基本思想:是将待排序的元素看作是竖着排列的“气泡”,较大的元素比较重,从而要往下沉。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自上向下检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最重”的元素就沉到了最低位置;处理二遍之后,“次重”的元素就沉到了次低位置。在作第二遍处理时,由于最低位置上的元素已是“最重”元素,所以不必检查。一般地,第i遍处理时,不必检查第i低位置以下的元素,因为经过前面i-1遍的处理,它们已正确地排好序。 37

  38. 冒泡排序算法流程图(参考)-----较小的数值排放到后面冒泡排序算法流程图(参考)-----较小的数值排放到后面

  39. 七、思考题 1、add替换成adds ,sub替换成subs有什么影响。 2、mov替换成movne有什么影响? 3、STMIA换成STMIB ,STMIA换成STMDA有什么区别。 4、思考用ARM汇编实现1+3+5+….+(2n+1)或者2+4+6+…..+2n。 5、实验4中如果去除汇编代码中的“EXPORT strcopy”会有什么现象,为什么? 6、实验5中如果去除汇编代码中的“IMPORT …..” 会有什么现象,为什么? 39

More Related