试验二ARM汇编语言程序设计
- 格式:pdf
- 大小:75.77 KB
- 文档页数:3
竭诚为您提供优质文档/双击可除基于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所示。
第4章ARM汇编语言程序设计本章介绍如何编写ARM和thumb汇编语言程序。
同时介绍ARM汇编编译器armasm的使用方法。
4.1伪操作ARM 汇编语言源程序中语句由指令、伪操作和宏指令组成。
在ARM中伪操作称为derective,这里为保持和国内在IBM PC汇编语言中对名词翻译的一致性derective称为伪操作;同样在ARM中宏指令被称为pseudo-instructlon,这里将其称为宏指令,宏指令也是通过伪操作定义的。
本节介绍伪操作和宏指令。
伪操作不像机器指令那样在计算机运行期间由机器执行,它是在汇编程序肘源程序汇编期间由汇编程序处理的。
宏是一段独立的程序代码。
在程序中通过宏指令调用该宏。
当程序被汇编时,汇编程序将对每个宏调用作展开,用宏定义体取代源程序中的宏指令。
本节介绍以下类型的ARM伪操作和宏指令。
●符号定义(Symbol definition伪操作。
●数据定义(Data definition)伪操作。
●汇编控制(Assembly control)伪操作。
●框架描述(Frame description)伪操作。
●信息报告(Reporting)伪操作。
●其他(Miscellaneous)伪操作。
4.1.1符号定义伪操作符号定义(Symbol definition)伪操作用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称。
包括以下伪操作。
●GBLA、GBLL及GBLS声明全局变量。
●LCLA.LcLL及LCLS 声明局部变量。
●SETA.SETL及SETS 给变量赋值。
●RLIST为通用寄存器列表定义名称。
●CN为协处理器的寄存器定义名称。
●CP为协处理器定义名称。
●DN及SN为VFP的寄存器定义名称。
FN为FPA的浮点寄存器定义名称。
1 GBLA GBLL及GBLSGBLA GBLL及GBLS伪操作用于声叫个ARM程序中的全局变量,并将其初始化。
GBLA伪操作声明一个全局的算术变量,并将其初始化成0。
实验二 ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编指令二、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。
2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。
三、汇编语言简介1.ARM汇编的一些简要的书写规范ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。
ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。
在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。
注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。
详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。
2. ARM汇编语言程序的基本结构在ARM汇编语言程序中,是以程序段为单位来组织代码。
段是相对独立的指令或数据序列,具有特定的名称。
段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。
可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。
◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。
◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。
源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。
3. 简单的小例子下面是一个代码段的小例子AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]……END在汇编程序中,用AREA指令定义一个段,并说明定义段的相关属性,本例中定义了一个名为Init的代码段,属性为只读。
实验二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汇编语言程序实验一、实验目的1.掌握ARM7TDMI汇编语言指令的用法,能编写简单的ARM汇编语言程序。
2.掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。
二、实验设备硬件:PC机软件:Windows98/XP/2000系统,ADS1.2集成开发环境三、实验内容使用LDR指令读取0x400031000上的数据,将数据加1,若结果小于10,则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。
使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(Processor Registers )监视R0、R1的值,打开存储器窗口(Memory )监视0x400031000的值。
四、实验预习要求1.仔细阅读教材第四章中ARM指令系统的内容;2.熟悉ADS1.2工程编辑和AXD调试的内容。
五、实验步骤1.启动ADS1.2,使用ARM Executable Image工程模板建立一个工程,工程名称ADS2。
2.建立ARM汇编源程序LJZ2.S,编写实验程序,然后添加到工程中。
3.设置工程连接地址RO Base 为0x400000000,RW Base 为0x400030000。
设置调试入口地址Image entry point 为0x400000000。
4.编译连接工程,选择[Project]-〉[Debug],启动AXD进行软件仿真调试。
5.打开寄存器窗口((Processor Registers )选择Current项监视R0、R1的值,打开存储器窗口(Memory )设置观察地址为0x400031000,显示方式Size为32位,监视0x400031000的值。
6.可以单步运行程序,可以设置断点/取消断点,或者全速运行程序,停止程序运行,调试时观察寄存器和0x400031000的值,运行结果分别如图4-1到4-7所示。
图4-1 Memory 窗口设置图4-2 Memory 窗口显示格式设置图4-3 Register 窗口设置图4-4 单步调试开始窗口画面图4-5 单步调试第一循环画面图4-6 单步调试第三循环画面图4-7 单步调试第十次循环结果六、实验参考程序程序清单4-1 ARM指令实验程序LJZ2.S; 文件名:LJZ2.S; 功能:使用LDR、STR指令对变量NumCount进行加1操作; 说明:使用ARMulate软件仿真调试NumCount EQU 0x40003100 ; 定义变量NumCountAREA Example2,CODE,READONLYENTRYMAIN LDR R1,=NumCount ;使用LDR伪指令装载NumCount的地址;到R0。
实验一 ARM汇编语言程序设计一、实验目的1.了解IAR Embedded Workbench 集成开发环境2.掌握ARM汇编指令程序的设计及调试二、实验设备1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序三、实验内容1.熟悉IAR Embedded Workbench 集成开发环境2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F程序代码:AREA Examl, CODE,READONLY ;定义一个代码段ENTRY ;程序入口MOV R0,#0;设置R0寄存器的值为0MOV R8,#0;设置R8寄存器的值为0ADR R2,N;将R2寄存器的值设为数据域N的地址LDR R1,[R2];将以R2的值为地址的数据读入R1MOV R2,#0;设置R2的值为0ADR R3,C; 将R3寄存器的值设为数据域C的地址ADR R5,X; 将R5寄存器的值设为数据域X的地址LOOPLDR R4,[R3,R8];将R3+R8的数据读入R4LDR R6,[R5,R8];将R5+R8的数据读入R6MUL R9,R4,R6;R9 = R4*R6ADD R2,R2,R9;R2 = R2+R9ADD R8,R8,#4;R8 = R8+4ADD R0,R0,#1;R0 = R0+1CMP R0,R1;比较R0和R1的值BLT LOOP;R0<R1的话执行循环N DCD 0X03;C DCD 0X01,0X02,0X03,0X04,0X05,0X06;X DCD 0X01,0X02,0X03,0X04,0X05,0X06;END程序结果:各个寄存器的结果执行结果如下:3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面程序代码:MOV R0,#100;设置R0寄存器的值为100LDR R2,=0X90018;设置R2寄存器指向地址0x90018MOV R1,#0;设置R1的值为0MOV R3,#0;设置R3的值为0LOOPADD R3,R3,R0;R3 = R3+R0SUB R0,R0,#1;R0 = R0-1CMP R0,R1;将R0和R1的值比较BNE LOOP;不相等的话继续执行循环STR R3,[R2];将R3的值装入到R2指向的地址块中。
实验二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 汇编语言编程实验一、实验目的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为声明的符号的名称。
实验二 C语言程序设计与调试实验一、实验目的学会在ADT IDE集成开发环境下,编写、编译和调试C语言程序。
二、实验设备及工具1 Microsoft Windows98,Windows NT,Windows 2000,Windows XP。
2 486以上CPU,建议采用Pentium II及更高的处理器。
3 64M以上内存,建议采用128M以上。
4 200M空间的可用硬盘空间。
5 CD-ROM驱动器。
6 并行打印机端口。
三、实验内容1、检查实验箱配件是否齐全,包括主板,核心板和LCD等。
2、检查JP5设置,确保跳线帽设置正确。
3、连接调试器,然后接通电源,包括JXARM9-2410-3的电源以及ADT1000的电源。
四、实验步骤及结果1、建立工程:打开ADT1000,点击“File->New菜单”,弹出New对话框,如下图所示,选择Project页,在Project页中选择调试设备,选择ARM9LPT,在工程名和位置中输入如下图所示,可以修改该目录,但注意目录和工程名中不要包含空格。
在工程类型中选择EXEC。
2、新建一个文件并保存为d:\leddemo\leddemo.c,并编辑该文件,添加如下所示代码:/*******************************************************************/ /*文件名称: LEDSEG7.C *//*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F *//* LED DEMO CODE for MBA-44B0(S3C2410X) *//*******************************************************************/ #define U8 unsigned charunsigned char seg7table[16] ={ /* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};void Delay(int time);/*******************************************************************/ /* 函数说明: EB44B0 7段构共阳数码管测试 *//* 功能描述: 依次在7段数码管上显示ABCDEF *//* 返回代码: 无 *//* 参数说明: 无 *//*******************************************************************/ void Test_Seg7(void){ int i;*((U8*) 0x) = 0x00;for( ; ; ){ /* 数码管从0到F依次将字符显示出来 */for(i=0;i<0x10;i++){ /* 查表并输出数据 */*((U8*) 0x) = seg7table[i];Delay (1000);}/* 数码管从F到0依次将字符显示出来 */for(i=0xf;i>=0x0;i--){ /* 查表并输出数据 */*((U8*) 0x) = seg7table[i];Delay (1000); } } }/*******************************************************************/ /* Function name : 循环延时子程序 *//* Description : 循环 'time' 次 *//* Return type :void *//* Argument : 循环延时计数器 *//*******************************************************************/ void Delay(int time){ int i;int delayLoopCount=1000;for(;time>0;time--)for(i=0;i<delayLoopCount;i++); }3、将leddemo.c文件加入到工程中,如下图所示:弹出文件选择对话框,选择d:\leddemo\leddemo.c文件,并点击打开4、新建一个文件并保存为d:\leddemo\ldscript,并编辑该文件,按照如下进行编辑:SECTIONS{. = 0x;.text : { *(.text) }.data : { *(.data) }.rodata : { *(.rodata) }.bss : { *(.bss) }__EH_FRAME_BEGIN__ = .;__EH_FRAME_END__ = .;PROVIDE (__stack = .);.debug_info 0 : { *(.debug_info) }.debug_line 0 : { *(.debug_line) }.debug_abbrev 0 : { *(.debug_abbrev)}.debug_frame 0 : { *(.debug_frame) }}5、如下图所示,在工作区窗口中的leddemo工程名上右键点击并选择Setting菜单项弹出工程设置对话框,选择Link页,在Link script中输入.\ldscript,然后OK。