实验1-ARM汇编指令基础
基于arm的汇编实验报告
基于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
第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汇编程序的编写以及启动代码的分析一、实验目的:练习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架构和指令集的理解,并掌握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
第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 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。
实验一 ARM汇编指令实验
大连理工大学软件学院《嵌入式系统原理与设计》实验报告(每组一份,打印)姓名:刘华一学号: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 汇编指令一、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汇编指令实验.
b ledloop1
mov pc,lr ;返回
END ;程序结束符
示例:
LDMIA r0!,{r4---r11}//从r0表示的地址中顺利取出8个字数据分别存放到r4-r11中。
2).程序分支指令
B指令
说明:B指令为ARM的分支指令,将引起处理器转移到制定标号处执行。
示例:
B Label //处理器转移到Label标号处执行
BEQ stop//Z标记置位,则跳转到stop标号处执行;否则继续下一条指令
1).LDR/STR指令
说明:LDR/STR指令用于加载/存储寄存器。举例说明:
示例:
LDR r3,[r0],#4 //从r0表示的地址中读取数据分别存放到r3中,然后将r0加4。
STR r3, [r1],#4 //将r3中的数据保存到r1表示的地址中,然后将r1加4。
LDMIA/STMIA指令
说明:LDM/STM指令用于加载/存储多个寄存器,举例
示例:
MOVS r3,r2,LSB#3//将r2右移3位即除以8,然后赋值给r3。
5、实验相应寄存器说明
GPFCON-端口配置寄存器。
GPFDAT-端口数据寄存器
GPFUP-端口上拉电阻使能寄存器
6、实验电路图
7.实验程序实现
利用ARM汇编语言实现跑马灯程序
/* asm.s */
GPFCON EQU 0x56000050
实验1ARM汇编指令实验
1、实验目的:
熟悉ADS开发环境和wiggler调试环境。
掌握简单的ARM汇编指令的使用方法。
2、实验设备
arm汇编语言编程实验报告
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汇编基础
arm汇编基础这⾥需要提到的是ARM处理器的汇编语⾔编程的⼀些内容,在嵌⼊式ARM系统的程序设计中往往离不开ARM汇编语⾔编程。
正如⼤家所熟知的处理器初始化部分的代码通常都是⽤汇编来编写的,还有⼀些操作协处理器的代码,以及部分中断处理程序⼀样也是⽤汇编语⾔写成的。
在开始介绍ARM处理器汇编语⾔编程之前建议读者先阅读⼀些有关ARM指令集的资料,主要是指ARM指令集、Thumb指令集及ARM宏汇编部分。
有关ARM指令集和Thumb指令集这⾥就不做具体介绍,只从ARM汇编伪指令、模块化汇编语⾔程序设计、混合语⾔编程等⼏个⽅⾯对ARM处理器汇编语⾔做⼀些简单介绍。
ARM汇编伪指令介绍在ARM处理器汇编语⾔程序设计⾥,有⼀些特殊的指令助记符。
这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作⽤是为完成汇编程序做各种准备⼯作的,这些伪指令仅在汇编过程中起作⽤,⼀旦汇编结束,伪指令的使命就完成了。
在ARM处理器的汇编程序中,⼤体有如下⼏种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令及其他伪指令。
伪操作符可以分为以下⼏类。
1)数据定义伪操作符数据定义伪操作符主要包括LTORG、MAP、DCB、FIELD、SPACE、DCQ、DCW等,主要⽤于数据表定义、⽂字池定义、数据空间分配等。
常⽤的有DCB/DCQ/DCW分配⼀段字节/双字/字内存单元,并且将它们初始化。
2)符号定义伪操作符符号定义伪操作符包括GBLA、GBLL、GBLS、LCLA、CN、CP、DN、FN、RLIST、SETA等,⽤于定义ARM汇编程序的变量,对变量进⾏赋值,以及定义寄存器名称等。
其中⽤于全局变量声明的GBLA、GBLL、GBLS和局部变量声明的LCAL、LCLL、LCLS伪指令较为常⽤。
3)报告伪操作符报告伪操作符包括ASSERT、INFO、OPT等,主要⽤于汇编报告等。
实验1 ARM 指令实验
2012-5-17
深圳市优龙科技有限公司
数据处理指令 数据处理指令可分为数据传送指令、算术逻 辑运算指令和比较指令等。 数据传送指令用于在寄存器和存储器之间进 行数据的双向传输。 算术逻辑运算指令完成常用的算术与逻辑的 运算,该类指令不但将运算结果保存在目的寄 存器中,同时更新CPSR中的相应条件标志位。 比较指令不保存运算结果,只更新CPSR中 相应的条件标志位。
加载/存储指令 加载 存储指令 ARM微处理器支持加载/存储指令用于在寄存器和存 储器之间传送数据,加载指令用于将存储器中的数据传 送到寄存器,存储指令则完成相反的操作。 常用的加载存储指令如下: ------ LDR 字数据加载指令 ------LDRB 字节数据加载指令 ------LDRH 半字数据加载指令 ------STR 字数据存储指令 ------STRB 字节数据存储指令 ------STRH 半字数据存储指令 在本实验中主要用到了LDR和STR指令,下面将介 绍这两条指令的用法:
2012-5-17 深圳市优龙科技有限公司
上面是关于该实验涉及到的部分函数,完整的 代码请看光盘目录的exp文件夹下相应实验的工程 目录。 1.7 练习题 编写一个汇编代码,让LED灯D13不停的闪烁, 同时可以通过调节延迟时间来控制D13闪烁的频率。
2012-5-17
深圳市优龙科技有限公司
2012-5-17 深圳市优龙科技有限公司
1.6 ARM汇编程序编程实例 汇编程序编程实例 1.参考汇编代码程序 参考汇编代码程序,主要实现LED灯D14的不停 闪烁的功能,主要代码如下: ;汇编指令实验 ;定义端口E寄存器预定义 rGPFCON EQU 0x56000050 rGPFDAT EQU 0x56000054 rGPFUP EQU 0x56000058 AREA Init,CODE,READONLY ;该伪指令 定义了一个代码段,段名为Init,属性只读 ENTRY ;程序的入口点标识 ResetEntry
ARM-汇编的基础指令
d e s t=!o p_1M V N从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。
不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。
这是逻辑非操作而不是算术操作,这个取反的值加 1 才是它的取负的值:SUB : 减法(Sub traction)S U B{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1-o p_2S U B用操作数one 减去操作数 two,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD : 加法(Add ition)A D D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1+o p_2A D D将把两个操作数加起来,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:AND : 逻辑与(logical AND)A N D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D o p_2A N D将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ORR : 逻辑或(logical O RR)A N D{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D o p_2A N D将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:BIC : 位清除(Bi t C lear)B I C{条件}{S}<d e s t>,<o p1>,<o p2>d e s t=o p_1A N D(!o p_2)B I C是在一个字中清除位的一种方法,与 OR 位设置是相反的操作。
常用ARM指令及汇编【一】
常用ARM指令及汇编【一】常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集介绍3、伪指令4、ARM汇编程序设计5、C与汇编混合编程ARM处理器寻址方式1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作MOV R1, R2 ;R2->R1SUB R0, R1,R2 ;R1-R2 -> R02、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBS R0,R0,#1 ;R0-1 -> R0MOV R0,#0xff00 ;0xff00 -> R0注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作MOV R0,R2,LSL #3 ;R2的值左移3位,结果存入R0,即R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1寄存器偏移寻址可采用的移位操作如下(1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0(2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0(3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位(5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDR R1,[R2] ;将R2中的数值作为地址,取出此地址中的数据保存在R1中SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
arm汇编编程(示例)
一、arm的认知及基本概念(一).arm的基本概念1.什么是armarm是一家英国电子公司的名字,全名是Advanced RISC Machine这家企业设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器,ARM公司只设计芯片而不生产,它将技术授权给世界上许多公司和厂商。
目前采用arm技术知识产权内核的微处理器,即通常所说的arm微处理器所以arm也是对一类微处理器的通称。
arm指令集体系版本号(软件)为V1 ~ V7目前V1 ~ V3已很少见。
从V4版不再与以前的版本兼容。
arm的CPU系列(硬件)主要有ARM7 ~ ARM112.典型的嵌入式处理器arm 占市场79.5%ARMmips 占市场13.9%MIPSmicroSPARC 占市场3.1%SUNPowerPc 占市场2.8%IBM其它占市场0.8%3. arm的应用范围:工业控制:如机床、自动控制等无线通信:如手机网络应用:如电子产品:如音视频播放噐、机顶盒、游戏机、数码相机、打印机其它各领域:如军事、医疗、机器人、xx等4.计算机体系结构见图:xx.xx计算机体系图xx.xx体系结构处理器使用同一个存储器,经由同一个总线传输完成一条指令需要3个步骤:即取指令->指令译码->执行指令指令和数据共享同一总线的结构哈佛体系结构将程序指令存储和数据存储分开中央处理器首先到程序指令存储器中读取程序指令。
解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。
5.复杂指令集与精简指令集CISC 复杂指令集:采用冯.诺依曼体系结构。
数据线和指令线分时复用(只能通过一辆车)。
存储器操作指令多汇编程序相对简单指令结束后响应中断CPU电路丰富面积大功耗大RISC 精简指令集:采用哈佛体系结构。
数据线和指令线分离(同时能通过多辆车)。
对存储器操作有限汇编程序占空间大在适当地方响应中断CPU电路较少体积小功耗低ARM采用RISC精简指令集Thumb是ARM体系结构中一种16位的指令集。
实验1-ARM基础编程仿真(Keil)
/*ASM file*/
AREA asmfile, CODE, READONLY
EXPORT fun 导出函数名
fun
MOV R1,#1
STR R1,[R0]
MOV PC,LR
返回语句
END
19
有缘学习更多+谓ygd3076考证资料或关注桃报:奉献教育(店铺)
3、C调用汇编实现字符串拷贝功能(必做)
/*C file, called by asmfile */ int cFun(int a,int b) {
return a-b; }
22
4、汇编调用C实现实现求和1+2+...+N(必做)
实验步骤: 1、建立新工程,加入实验1.4文件夹中的sum.c和testfile.s( 同一个工程下添加两个文件一起编译)。 2、补充完成源代码中缺失的部分,通过调用c函数g()实现 1+2+3+glovb1,结果存在R8中。 3、运行Debug进行调试
YES YES
SUM_END
NO
R1自增1
R1=R1+1
17
3、C调用汇编实现字符串拷贝功能(必做)
C中调用汇编的函数原理: 在C中调用汇编文件中的函数,主要工作有两个: a. 在C中声明函数原型,并加extern关键字; b. 在汇编中用EXPORT导出函数名,并用该函数名作为汇 编代码段的标识。这样就可以在C中使用该函数了。 注:EXPORT伪指令用于在程序中声明一个全局的标号, 该标号可在其他的文件中引用。
18
3、C调用汇编实现字符串拷贝功能(必做)
C中调用汇编示例:
/*C file*/ extern void fun (int *p); 声明函数原型 int main()
ARM_汇编指令实验一
【实验名称】ARM 汇编指令实验一【实验目的】1.初步学会使用µVision IDE for ARM 开发环境及ARM 软件模拟器;2 。
通过实验掌握简单ARM 汇编指令的使用方法【实验环境】1 硬件:PC机一台;2软件:µVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP 【实验内容】1.熟悉开发环境的使用并使用ldr/str,mov 等指令访问寄存器或存储单元;2.使用add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算。
3.完成表达式z-(x/4+3)-y*8的运算,并自己对x,y,x分别赋值【源程序清单】;********************************************************** ********************; NAME: asm1_a.s ;Author: JMB //程序开头的说明文档; Desc: ARM instruction examples //描述;********************************************************** ********************//常量定义x EQU 4 ; x=4y EQU 1 ; y=1z EQU 13 ;z=13stack_top EQU 0x30200000 ; 定义一个堆栈的站顶指针export Reset_Handler //定义一个程序的入口;/* code */ AREA text,CODE,READONLY //定义一个代码段exportReset_Handler ; code start */ ldr sp, =stack_top //获取堆栈头指针的地址mov r0, #x //将x的值放入到寄存器r0中 ;mov r1, #3 //将立即数3放入到寄存器r1中ADD r2,,r1,r0,LSR #2; //实现运算 X/4+3的运算运算结果赋给 r2mov r1,#z //将z的值赋给寄存器r1SUB r1,r2 //实现将r1值减去r2 最后赋给r1 (z-x/4+3)mov r3,y //实现将y的值赋给r3寄存器SUB r1,r1,r3,LSL #3 // 寄存器r3乘以3再加上r1得到的值再付给 r1//z-(x/4+3)-y*8;str r1,[sp] //将程序的最后结果赋给堆栈Stop //程序结束b stop ; end the code ,cyclingend。
实验1-ARM汇编指令基础
实验一 ARM 汇编指令基础学号: 姓名:一、实验目的● 初步学会使用Embest IDE for ARM 开发环境及ARM 软件模拟器;● 通过实验掌握简单ARM 汇编指令的使用方法。
二、实验原理ARM 处理器共有37个寄存器:● 31个通用寄存器,包括程序计数器(PC )。
这些寄存器都是32位。
● 6个状态寄存器。
这些寄存器也是32位,但只使用了其中的12位。
1. ARM 通用寄存器通用寄存器(R0~R15)可分为3类。
1) 不分组寄存器R0~R7R0~R7是不分组寄存器。
在所有处理器模式下,它们都能被访问。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2) 分组寄存器R8~R14R8~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 字地址8 4 0 8 4低地址3.GNU 基础知识Embest IDE 集成了GNU 汇编器as 、编译器gcc 和链接器ld 。
arm实验1 汇编指令实验
实验1 汇编指令实验一、实验目的:1.掌握ADS1.2集成开发环境及ARMulator软件仿真2.了解ARM汇编指令用法,并能够编写简单的汇编程序3.掌握指令的条件执行,掌握LDR/STR指令,完成存储器的访问4.掌握使用多寄存器传送指令进行数据复制二、实验设备:1.硬件PC机SeaARM5.02.软件ADS1.2、AXD三、实验内容:1.用LDR指令读取0x40003100地址上的数据,将该数据加1,若结果大于10,把0写入原地址, 否则使用STR指令将结果写入原地址。
2.用SrcData表示源数据地址,DstData表示目标地址,用LDMIA指令加载32字节(即8个字)数据到寄存器R2~R9;用STMIA将寄存器R2~R9中数据存到目标地址。
四、实验步骤1.启动ADS1.2,使用ARM Executable Image工程模板建立一个工程。
如Test12.建立汇编源文件Tset1.s3.设置工程连接地址R0 Base 0x40000000, RW Base 0x40003000。
4.设置调试入口地址Image Entry point 为0x40000000。
5.编译、连接工程,选择Project Debug ,启动AXD软件仿真调试。
6.打开寄存器窗口(ProcessorRegister,监视R0、R1的值,,打开存储器观察窗口(Memory)设置观察地址0x40003100,显示方式为32bit,监测0x40003100上的值。
7.可以单步运行程序,可以设置、取消断点,或者全速运行,停止运行,调试时观察寄存器0x40003100上的值,运行结果见图1。
8.仿照上述步骤1-6做实验内容中第个2题目。
图1 ARM实验内容1的运行结果五、实验参考程序内容1:AREA TEST1, CODE,READONLYENTRYCODE32STARTLDR R1,=COUNTMOV R0,#0STR R0,[R1]LOOPLDR R1,=COUNTLDR R0,[R1]ADD R0,R0,#1CMP R0,#10MOVHS R0,#0STR R0,[R1]B LOOPCOUNT EQU 0X40003100END内容2:AREA TEST2, CODE, READONLYENTRYCODE32START LDR R0,=SrcData ; 设置源数据地址LDR R1,=DstData ; 设置目标地址LDMIA R0,{R2-R9} ; 加载32字节(即8个字)数据到寄存器R2~R9STMIA R1,{R2-R9} ; 存储寄存器R2~R9到目标地址B.AREA Example2_dat, DATA, READWRITESrcData DCD 0, 1, 2, 3, 4, 5, 6, 7DstData SPACE 32END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一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参考程序:。