2022年实验二ARM汇编语言编程实验共享 .pdf
实验二: 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为程序默认入口点,代码段默认起始地址为0 x800,如果需要修改可以在链接脚本文件中指定。2)标号语法:symbol: symbol 为定义的符号。说明:上述代码定义一个标号,它表示程序中当前的指令或数据地址。如果在程序中出现两个相同的标号,汇编器将会产生一个警告,且只有第一个标号有效。课程名称ARM 体系结构实验成绩指导教师冯灵霞实 验 报 告院系信息工程学院班级计算机科学与技术(嵌入式)学号姓名日期名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 2、GNU 汇编语言伪操作1).equ 伪操作语法:.equ symbol,expr expr 为基于寄存器的地址值、 程序中的标号、32位的地址常量或位的常量。 symbol 为.equ伪操作为 expr 定义的字符名称。说明:该操作符为数字常量、基于寄存器的值和程序中的标号定义一个字符名称,相当于 C语言中的宏定义。示例: .equ USERMODE,0 x10 2).global伪操作符语法:.global symbol symbol 为声明的符号的名称。它是区分大小写的。说明:该操作符声明一个可以被其它文件引用的全局符号,相当于 C语言中的全局变量。示例: .global Main 3).text伪操作符语法:.text subsection subsection为代码段子段,可选参数。说明:该操作符将操作符开始的代码编译到代码段或代码段子段中。示例: .text 4).end 伪操作符语法:.end 说明:该操作符标记当前汇编文件的结束行,即标号后的代码不作处理。示例: .end 5).ltorg伪操作符语法:.ltorg 说明:该操作符用于在当前段的当前地址产生一个文字池。示例: .ltorg 3、存储器访问指令1)LDR和 STR指令名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 说明: LDR/STR指令用于加载寄存器和存储寄存器。它们的使用比较复杂,现仅列举本实验用到的一些使用方法。示例:LDR r3,r0,#4 /* 从 r0 表示的地址中读取数据到r3 中,然后将 r0 加 4*/ STR r3,r1,#4 /* 将 r3 中的数据保存到 r1 表示的地址中,然后将r1 加 4*/ 2)LDMIA和 STMIA指令说明: LDMIA/STMIA 指令用于加载多个寄存器和存储多个寄存器。它们的使用比较复杂,现仅列举本实验用到的一些使用方法。示例:LDMIA r0!,r4-r11 /* 从 r0 表示的地址中取出8 个数据分别放到到r4-r11 中*/ STMIA r1!,r4-r11 /* 将 r4-r11 中的数据保存到 r1 表示的起始地址中 */ 4、程序分支指令1)B指令说明: B指令为 ARM 分支指令,将引起处理器转移到指定标号处执行。示例:B Label /* 处理器转移到 Label 标号处执行 */ BEQ stop /*Z 标志置位则转移到stop 标号处执行,否则继续执行下一条指令*/ BNE octcopy/*Z标志清零则转移到octcopy 标号处执行,否则继续执行下一条指令*/ 5、其它指令1)SUBS 指令说明:该指令由SUB指令加上 S后缀组成, S后缀标志根据执行结果更新条件标志码。示例:SUBS r3,r3,#1 2)MOVS 指令说明:该指令由MOV 指令加上 S后缀组成, S后缀标志根据执行结果更新条件标志码。示例:MOVS r3,r2,LSR#3 /* 将 r2 右移 3 位即除以 8,然后赋值给 r3*/ 6、链接脚本文件一个程序通过 .text、 .data 以及.bass 等伪指令设定其所属的段, 其中 text 段为代码段,data 段为已经初始化的数据段, bass 段为尚未初始化的数据段。因此,程序编写好以后,必须告诉编译器怎样组织其中的各个段,各段的起始地址是多少。这些设置在软件仿真器中可能没有多少作用,但是如果该程序必须运行在具体硬件平台上就必须正确的设置到存储器(SDRAM、SRAM 或 FLASH )的地址空间。这个工作就是通过链接脚本文件完成。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 六、实验步骤1、建立一个工程。2、新建 Assemble files文件并命名为asse1,并参考如下代码编辑该文件,并加入到新建工程中。/* * 汇编语言编写实验 * 该程序实现从源地址拷贝num个字数据即 num*4个字节的内容到目的地址dst 中 */ .global _start .text .EQU num, 20 /* * 程序入口地址,传递参数并设置堆栈 */ _start: LDR r0, =src /*r0 = 源数据块地址 */ LDR r1, =dst /*r1 = 目的数据块地址 */ MOV r2, #num /*r2 = 拷贝字数量 */ MOV sp, #0 x0c700000 /*建立栈指针 (r13)*/ /* * 块拷贝:以 32 个字节( 8 个字)为单位进行拷贝 * 使用指令: LDMIA, STMIA */ blockcopy: MOVS r3,r2, LSR #3 /*r3 = r2 / 8 = 2(num = 20)*/ BEQ copywords /*少于 8 个字则跳转到 copywords 处理*/ STMFD sp!, r4-r11 /*保存工作寄存器 */ octcopy: LDMIA r0!, r4-r11 /*从源地址取出8 个字数据分别存放到r4 - r11名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 中*/ STMIA r1!, r4-r11 /*将 r4 - r11中的数据设置到目的数据块地址*/ SUBS r3, r3, #1 /*计数器累加 */ BNE octcopy /*重复拷贝 */ LDMFD sp!, r4-r11 /*回复工作寄存器 */ /* * 字拷贝:以 4 个字节( 1 个字)为单位进行拷贝 * 使用指令: LDR, STR */ copywords: ANDS r2, r2, #7 /*最多拷贝7 个,多余8 个先使用blockcopy 然后使用 copywords 拷贝*/ BEQ stop /*是否拷贝完毕,拷贝完毕则跳转到stop*/ wordcopy: LDR r3, r0, #4 /*从源地址取出 1 个字数据存放到 r3 中*/ STR r3, r1, #4 /*将 r3 中的数据设置到目的数据地址*/ SUBS r2, r2, #1 /*计数器累加 */ BNE wordcopy /*重复拷贝 */ stop: B stop /*死循环,程序结束 */ /* * 文字池:定义源地址数据以及目标地址 */ .ltorg src: .LONG 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst: .LONG 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - .end 3、新建 MISC files文件并命名为asse1,并参考如下代码编辑该文件,并加入到新建工程中。SECTIONS . = 0 x30000000; .text : *(.text) Image_RO_Limit = .; Image_RW_Base = .; Image_RO_Base = .; Image_RW_Limit = .; .data : *(.data) .rodata : *(.rodata) Image_ZI_Base = .; .bss : *(.bss) Image_ZI_Limit = .; _bss_start_ = .; _bss_end_ = .; _EH_FRAME_BEGIN_ = .; _EH_FRAME_END_ = .; PROVIDE (_stack = .); end = .; _end = .; .debug_info 0 : *(.debug_info) .debug_line 0 : *(.debug_line) .debug_abbrev 0 : *(.debug_abbrev) .debug_frame 0 : *(.debug_frame) 4、设置工程:设置调试设备为“SoftSim ” ,即软件仿真器,同时选择右下角的USB 。如下图所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 5、设置链接脚本文件。6、编译工程。7、调试工程,下载程序后,单步执行程序,执行过程中打开寄存器观察窗口和存储器观察窗口观察寄存器和存储器的变化,并理解各条汇编指令。七、实验报告要求1、按上述步骤调试程序。2、编写程序实现从1 开始连续 5 个奇数累加和。.global _start .text _start: MOV R0,#0 MOV R1,#0 MOV R2,#5 L: ADD R0,R0,R1 ADD R1,R1,#2 SUBS R2,R2,#1 BNE L 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - stop: B stop .end 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -