实验1-ARM汇编指令基础
- 格式:doc
- 大小:123.50 KB
- 文档页数:7
基于arm的汇编实验报告竭诚为您提供优质文档/双击可除基于arm的汇编实验报告篇一:汇编实验报告实验一(1)熟悉汇编语言程序调试环境及顺序程序设计一、实验目的及要求:1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。
2.学会使用eDIT、mAsm、LInK、Debug等软件工具。
3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。
二、熟悉汇编语言程序调试环境1.汇编语言源程序的建立本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。
设定源程序的文件名为Abc。
DATAsegmenTbuFDb23h,16h,08h,20h,64h,8Ah,91h,35h,2bh,7FhcneQu$-buF DATAenDs coDesegmenT Assumecs:coDe,Ds:DATA sTART:pushDsxoRAx,AxpushAxmoVAx,DATAmoVDs,AxmoVbx,oFFseTbuF moVcx,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所示。
第1天-ARM汇编指令MOV/MVN
MOV : 传送(Move)
MOV{条件}{S} , dest = op_1MOV 从另一个寄存器、被移位的寄存器、或一
个立即值装载一个值到目的寄存器。
你可以指定相同的寄存器来实现NOP 指
令的效果,你还可以专门移位一个寄存器:MOVR0, R0; R0 = R0... NOP 指令MOVR0, R0, LSL#3; R0 = R0 * 8 如果R15 是目的寄存器,将修改程序计数器或标志。
这用于返回到调用代码,方法是把连接寄存器的内容传送到R15:
MOV PC, R14 ; 退出到调用者MOVS PC, R14 ; 退出到调用者并恢复标志位MVN : 传送取反的值
(MoveNegative)
MVN{条件}{S} , dest = !op_1MVN 从另一个寄存器、被移位的寄存器、或一
个立即值装载一个值到目的寄存器。
不同之处是在传送之前位被反转了,所以
把一个被取反的值传送到一个寄存器中。
这是逻辑非操作而不是算术操作,就
是二进制的取反,比如二进制是0B11001100,取反就是0B00110011,转换为10 进制就是,这个取反的值加 1 才是它的取负的值:
MVN R0, #4 ; R0 = -5 MVN R0, #0 ; R0 = -1tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
实验ARM汇编程序的编写以及启动代码的分析一、实验目的:练习ARM汇编程序的编写,对提供的程序的启动代码进行分析,了解S3C2410初始化过程, 初始化代码主要是包含在start.s中。
二、实验原理:启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。
启动程序过程●系统硬件初始化系统上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,执行完,系统进行堆栈和存储器的初始化。
使用了外设,则需要设置相关的寄存器,确定其刷新频率、总线宽度等信息。
●代码段复制到RAM中运行需要把系统的代码复制到RAM中运行。
映像文件内部共有三种输出段:RO段、RW段和ZI段。
ARMLink同时还产生了这三种输出段的起始和终止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$RW$Limit、Image$ZI$Base和Image$$ZI$$Limit。
可以在程序中使用这些定位信息。
将ROM中的代码和数据搬移到RAM中。
●建立二级中断向量表在ARM系统中,中断向量表位于0X0开始的地址处,意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash存储器中的中断向量表里去,降低系统的运行效率。
因此在RAM中建立自己的二级中断向量表,当中断发生后,程序直接从RAM中取中断向量进入中断子程序。
尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。
三、实验内容:1.运行一个简单的串口程序,单步执行初始化代码,观察寄存器变化。
2.分析系统上电后的初始化工作包括哪些内容。
3.分析中断的处理过程,包括中断向量表的建立、中断源的识别及中断IRQ 服务程序是如何进入的。
ARM汇编实验报告一、实验目的本次实验旨在通过编写ARM汇编程序,加深对ARM架构和指令集的理解,并掌握ARM汇编程序的设计和调试技巧。
二、实验内容本次实验分为两个部分,分别是基础部分和进阶部分。
1.基础部分基础部分要求编写一个ARM汇编程序,实现输入一个整数n,并输出从1到n的所有奇数的和。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存输入的整数n。
(3)使用r1和r2寄存器保存计算中的临时变量。
(4)使用r3寄存器保存输出的结果。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现计算。
(7)使用swi指令终止程序。
2.进阶部分进阶部分要求实现一个排序算法,将从键盘输入的n个整数进行排序,并输出排序后的结果。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存排序的整数个数n。
(3)使用r1寄存器保存指向数组的指针。
(4)使用r2和r3寄存器保存计算中的临时变量。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现排序算法。
(7)使用swi指令终止程序。
三、实验步骤1.基础部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)初始化r1和r3寄存器,将计算所需的临时变量置为0。
(3)使用ldr指令读取r0寄存器的值到r2寄存器。
(4)使用循环实现奇数求和的计算,将结果保存到r3寄存器。
(5)使用str指令将r3寄存器的值保存到内存中。
(6)使用swi指令终止程序。
2.进阶部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)使用ldr指令将数组的首地址保存到r1寄存器。
(3)使用循环结构实现排序算法。
(4)使用str指令将排序后的结果保存到内存中。
(5)使用swi指令终止程序。
四、实验结果经过编写和调试,基础部分程序可以正确输入整数n,并输出从1到n的所有奇数的和。
进阶部分程序可以正确输入整数n,并对输入的n个整数进行排序,并输出排序后的结果。
第1天-ARM汇编指令LSL/LSR/ASL/ASR移位LSLASLLSRASRRORRRXARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。
你还可以使用桶式移位器影响在LDR/STR 操作中的变址值。
译注:移位操作在ARM 指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。
如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。
如果数据处理指令的第二个操作数是立即值,在指令中用8 位立即值和 4 位循环移位来表示它,所以对大于255 的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。
在逻辑类指令中,逻辑运算指令由指令中S位的设置或清除来确定是否影响进位标志,而比较指令的S 位总是设置的。
在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。
下面是给不同的移位类型的六个助记符:LSL 逻辑左移ASL 算术左移LSR 逻辑右移ASR 算术右移ROR 循环右移RRX 带扩展的循环右移ASL 和LSL 是等同的,可以自由互换。
你可以用一个立即值(从0 到31)指定移位数量,或用包含在0 和31 之间的一个值的寄存器指定移位数量。
逻辑或算术左移(Logical or Arithmetic Shift Left)Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn 接受Rx 的内容并按用n 或在寄存器Rn 中指定的数量向高有效位方向移位。
最低有效位用零来填充。
除了概念上的第33 位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
大连理工大学软件学院《嵌入式系统原理与设计》实验报告(每组一份,打印)姓名:刘华一学号:201492405 班级:软1411姓名:李军学号:201493076 班级:软日1401实验时间:16年9月30日实验室:嵌入式实验室指导教师:邱铁成绩:实验一:ARM汇编指令一、实验目的和要求1. 熟悉ARM Developer Suite v1.2集成开发环境2.ARM汇编语言指令功能训练二、实验原理和内容RAM是32位体系结构,每个内存单元是32位的,对于64位的数需要两个字才能存储。
题目:熟悉ARM Developer Suite v1.2集成开发环境逐条试验ARM汇编语言指令功能,并观寄存器\存储器的变化三、主要仪器设备及软件编程环境硬件:PC机软件:ARM Developer Suite v1.2集成开发环境,Windows 98/2000/NT/XP四、实验步骤与编程1.打开软件ARM Developer Suite v1.2,选择file中的新建,在project中选择第一个,输入project name2.在同一个界面选择file,建立一个.s文件,打开此文件后就可以在里面进行编写汇编指令3.输入示例代码后,在原有的project对话框中鼠标右键连接到你所建的工程文件下的.s文件,再点击编译。
4.在新弹出的界面中,打开左边的寄存器列表,再点击单步调试,就可以看到每条指令执行时相应寄存器的变化以及相应要执行的下一条指令。
五、实验数据与结果分析数据传送类指令:算数运算类指令:逻辑运算类指令:比较指令:乘法指令:六、讨论、建议由于对于软件尚未熟悉,且windows系统兼容性原因,在开始配置阶段浪费了较多时间,由于时间有限,只是大体练习了一遍,在批量读取及存储方面仍存在较大问题,需要回去后勤加练习。
arm 汇编指令一、arm 汇编简介1.1 什么是 arm 汇编1.2 arm 汇编的应用领域1.3 arm 汇编与高级语言的对比二、arm 汇编基础2.1 寄存器2.1.1 通用寄存器2.1.2 特殊寄存器2.2 数据传输指令2.2.1 加载指令2.2.2 存储指令2.3 算术指令2.3.1 加法指令2.3.2 减法指令三、arm 汇编进阶3.1 分支指令3.1.1 无条件分支3.1.2 有条件分支3.2 比较指令3.2.1 比较指令的作用3.2.2 比较指令的使用方法3.3 位操作指令3.3.1 与操作3.3.2 或操作3.3.3 异或操作四、arm 汇编优化技巧4.1 减少存取操作4.2 使用预处理器4.3 循环展开4.4 减少分支操作4.5 使用内联汇编五、arm 汇编的应用案例5.1 arm 汇编在嵌入式系统中的应用5.2 arm 汇编在图形处理中的应用5.3 arm 汇编在操作系统中的应用六、总结6.1 arm 汇编的优势和不足6.2 arm 汇编的未来发展6.3 arm 汇编学习的建议arm 汇编指令一、arm 汇编简介1.1 什么是 arm 汇编arm 汇编是一种底层的编程语言,用于直接操作处理器的指令集。
它与高级语言相比更接近机器语言,能够更加精细地控制硬件资源。
arm 汇编通常用于需要对性能和资源进行高度优化的场景,如嵌入式系统开发、驱动程序编写和底层图形处理等。
1.2 arm 汇编的应用领域arm 汇编广泛应用于各种领域,包括嵌入式系统、移动设备、游戏开发、图形处理、操作系统等。
由于 arm 汇编的高效性和精确性,它能够在这些领域中发挥重要作用。
例如,在嵌入式系统中,arm 汇编可以直接访问硬件资源,提供更高的执行效率和更低的资源消耗。
1.3 arm 汇编与高级语言的对比arm 汇编与高级语言相比有着明显的区别。
在高级语言中,程序员不需要关注底层的机器细节,只需要编写抽象的代码即可。
实验一 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汇编语言编程实验报告实验二ARM汇编语言编程实验.doc班级计算机科学与技术(嵌入式)学号课程名称ARM体系结构姓名实验成绩日期指导教师冯灵霞实验报告院系信息工程学院一、实验目的1、掌握ADT IDEARM开发环境中基本的工程设置以及程序编译方法。
2、掌握ADT IDEARM开发环境中基本的程序调试方法。
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为定义的符号。
说明:上述代码定义一个标号,它表示程序中当前的指令或数据地址。
如果在程序中出现两个相同的标号,汇编器将会产生一个警告,且只有第一个标号有效。
2、GNU汇编语言伪操作1).equ伪操作语法:.equ symbol,exprexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或位的常量。
symbol为.equ伪操作为expr定义的字符名称。
说明:该操作符为数字常量、基于寄存器的值和程序中的标号定义一个字符名称,相当于C语言中的宏定义。
示例:.equ USERMODE,0x102).global伪操作符语法:.global symbolsymbol为声明的符号的名称。
实验一ARM汇编指令基础
学号:姓名:
一、实验目的
●初步学会使用Embest IDE for ARM 开发环境及ARM软件模拟器;
●通过实验掌握简单ARM汇编指令的使用方法。
二、实验原理
ARM处理器共有37个寄存器:
●31个通用寄存器,包括程序计数器(PC)。
这些寄存器都是32位。
●6个状态寄存器。
这些寄存器也是32位,但只使用了其中的12位。
1.ARM通用寄存器
通用寄存器(R0~R15)可分为3类。
1)不分组寄存器R0~R7
R0~R7是不分组寄存器。
在所有处理器模式下,它们都能被访问。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2)分组寄存器R8~R14
R8~R14是分组寄存器。
被访问的物理寄存器取决于当前的处理器模式。
若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12各有两组物理寄存器:一组为FIQ模式,另一组为除了FIQ模式以外的所有模式。
R8~R12没有任何指定的特殊用途。
只是使用R8~R12来简单地处理中断。
寄存器R13和寄存器R14各有6个分组的物理寄存器,1个用于用户模式和系统模式,其他5个分别用于5种异常模式。
R13通常用作堆栈指针,称作SP。
每种异常模式都有自己
的R13。
R14用作子程序链接寄存器,也称作LR 。
3) 程序计数器R15
寄存器R15用作程序计数器(PC )。
本实验中,ARM 核工作在用户模式,R0~R15可用。
2. 存储器格式
ARM 体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
1) 大端格式
在这种格式中,字数据的高位字节存储在低地址中,而字数据的低位字节存 放在高地址中,如下所示:
高地址 31 23 22 16 15 8 7 0 字地址 低地址 2) 小
端格式
在这种格式中,字数据的高位字节存储在高地址中,而字数据的低位字节存 放在低地址中,如下所示:
高地址 31 23 22 16 15 8 7 0 字地址 低地址
3.GNU 基础知识
Embest IDE 集成了GNU 汇编器as 、编译器gcc 和链接器ld 。
因此,编写程序要符合GNU 的语法和规则。
这里简单介绍几点基本知识:
8 4 0
8 4 0
●程序默认入口点为“_start”,代码段默认起始地址为0x8000
●常用伪操作符
1).equ
为数字常量、基于寄存器的值和程序标号定义一个字符名称。
2).global及.globl
声明一个符号可以被其他文件引用,相当于声明了一个全局变量。
3).text
将操作符开始的代码编译到代码段或代码段子段(Subsection)。
4).end
标记汇编文件的结束行。
三、实验内容
●熟悉开发环境的使用并使用ldr/str,mov等指令访问寄存器或存储单元。
●使用add/sub/lsl/lsr/and/orr等指令,完成基本数学/逻辑运算。
●运行Embest IDE集成开发环境,将下面两段参考程序分别编辑输入,生成目标代
码,设置调试模块,下载目标代码到软件仿真器。
四、实验步骤
1.打开memory窗口,观察地址0x8000~0x801f与地址0x1000的内容。
2.单步执行程序并观察和记录寄存器与memory的值变化。
3.结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。
五、实验参考程序
1. 实验A参考程序:
.equ x, 45 /* 定义变量x,并赋值为45*/
.equ y, 64 /* 定义变量y,并赋值为64*/ .equ stack_top, 0x1000 /* 定义栈顶0x1000*/
.global _start
.text
_start: /*程序代码开始标志*/ MOV sp, #stack_top
MOV r0, #x /* x的值放入R0 */
STR r0, [sp] /* R0的值保存到堆栈*/
MOV r0, #y /* y的值放入R0*/
LDR r1, [sp] /* 取堆栈中的数到R1*/
ADD r0, r0, r1
STR r0, [sp]
stop:
B stop /*程序结束,进入死循环*/
.end
2. 实验B参考程序:
.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, #0x1000
STR 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, #0x01
ORR r0, r0, r1
MOV r1, R2 /* y的值放入R1*/
ADD r2, r0, r1, lsr #1 /* R1的值除以2加上R0的值放入R2*/ stop:
B stop /*程序结束,进入死循环*/
.end
运行结果截图:
A参考程序:
B参考程序:。