实验一 ARM汇编实验指令
基于arm的汇编实验报告
竭诚为您提供优质文档/双击可除基于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所示。
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。
设置调试入口地址Image Entry point 为0x40000000。
4.编译、连接工程,选择Project Debug ,启动AXD软件仿真调试。
5.打开寄存器窗口(ProcessorRegister,监视R0、R1的值,,打开存储器观察窗口(Memory)设置观察地址0x40003100,显示方式为32bit,监测0x40003100上的值。
6.可以单步运行程序,可以设置、取消断点,或者全速运行,停止运行,调试时观察寄存器0x40003100上的值,运行结果见图1。
7.仿照上述步骤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,READONL YENTRYCODE32START 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。
实验一 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 服务程序是如何进入的。
第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与嵌入式技术实验报告专业班级:10通信工程1班姓名:万洁学号:100103011125实验日期:2013年5月28日指导老师:郑汉麟1、 通过实验掌握ARM 指令的特点和寻址方式;2、 掌握简单的ARM 汇编语言的程序设计;3、 了解集成开发环境 Embest IDE 及其开发软件的应用;、实验环境Embest IDE 应用于嵌入式软件开发的新一代图形化的集成开发环境,它包括一套完备 的面向嵌入式系统的开发和调试工具。
其开发软件 Embest IDE for ARM 是集编辑器、编译 器、调试器、工程管理器( projectma nager )于一体的高度集成的窗口环境,用户可以在Embest IDE 集成开发环境中创建工程、编辑文件、编译、链接、运行,以及调试嵌入式应 用程序。
三、实验步骤1)新建工程:运行Embest IDE 集成开发环境,选择菜单项 File 宀New Workspace ,如图一,系统弹出一个对话框,键入文件名“ wj ”,如图二,点击 0K 按钮。
将创建一个新工程,并同时创 建一个与工程名相同的工作区。
此时在工作区窗口将打开该工作区和工程 .。
(老师提醒:不要放入Bin 文件夹中)■ Emb«t QE Pre 亠 Educat「販]£dii_VwwBuid frtbug D if** Qri+W 诊 Open-"Qrl*O2)建立源文件:点击菜单项 File T New ,如图三,系统弹出一个新的文本编辑窗,输入源文件代码。
编辑完后,保存文件“ wj.s ”后缀,如图三,四。
Hr*Open Workspace.・图一■■ rflJO IUU rl jil rd f rfl,rlClop: h Ho. .end图tut vUrl:3)添加源文件:选择菜单项Project T Add To Project Files,在工程目录下选择刚才建立的源文件.s 后缀文件,如图五,图六,图七。
汇编指令实验
实验三汇编指令实验一实验目的1.熟悉ADS1.2软件开发环境;2.掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序;3.掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。
4.掌握ARM乘法指令的使用方法;5.了解子程序编写及调用。
二实验内容1.使用LDR指令读取0x30003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。
2.使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(Processor Registers)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003100上的值。
3. 使用STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算X n的值。
X n= X*X*X ……*X,其中相乘的X的个数为n个。
先将X的值装入R0和R1,使用寄存器R2进行计数,循环n-1次R0=R0*R1,运算结果就保存在R0中。
(不考虑溢出问题)注意:若n=0,则运算结果直接赋1;若n=1,则运算结果直接赋X。
三预备知识1.ARM指令系统内容;2.ADS1.2工程编辑和AXD调试的内容。
四实验设备硬件:PC机一台。
软件:Windows98/XP/2000系统,ADS1.2集成开发环境。
五实验步骤1. 实验内容1和实验内容2的步骤如下:(1)启动ADS1.2,使用ARM Executable Image工程模板建立一个工程arm1.mcp。
(2)建立汇编源文件arm1.s,编写实验程序,然后添加到工程中。
(3)设置工程连接地址RO Base为0x30000000,RW Base为0x30003000,如图3.1所示。
设置调试口地址Image entry point为0x30000000。
图3.1 设置工程连接地址图3.2 设置调试口地址(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。
arm选做实验汇编指令编程C语言编程_图文.
实验二汇编指令编程实验目的1 掌握ARM汇编指令编程2 掌握Thumb汇编指令编程需要完成的任务完成A部分和B部分实验A部分ARM 汇编指令编程方法1 建立工程启动ADS1.2 使用ARM Executable Image 工程模板建立一个Instruetion1。
关于ADS 工具的使用方法可参照前面的实验。
2 编写源代码COUNT EQU 0x30001010 ;定义一个变量,地址在0x30001010AREA Example1,CODE,READONLY ;声明代码段Example1ENTRY ;标识程序入口CODE32 ;声明31 位ARM 指令START LDR R1,=COUNT ;R1<=COUNTMOV R0,#0 ;R0<=0STR R0,[R1] ;[R1]<=R0, 即设置COUNT 为0LOOP LDR R1,=COUNT LDR R0,[R1] ;R0<=[R1]ADD R0,R0,#1 ;R0<=R0+1CMP R0,#10 ;R0 与10 比较,影响条件码标志MOVHS R0,#0 ;若R0>=10,则此指令执行R0<=0STR R0,[R1] ;[R1]<=R0 ,即保存COUNTB LOOP3设置编译选项设置工程连接地址RO Base 为0X30000000,RW Base 为0X30001000 。
设置调试入口地址Image entry point 为0X30000000 。
编译、调试编译连接工程,选择Project Debug ,启动AXD 进行软件仿真调试。
4查看寄存器,内存打开寄存器窗口(Processor Registers),选择Current 项监视R0 和R1 的值。
本实验代码使用LDR 指令读取0x30001010 地址上的数据,将数据加1。
若结果小于10,则使用STR 指令把结果写回原地址;若结果大于等于10,则把0 写回原地址。
第四章_ARM指令系统实验
第四章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汇编基础实验任课教师 XXX 实验教师 XXX姓名黑XX学号2012XXXXXXXXX 实验地点 XXXXXXX 分组号 X组时间 XXXX年 X月X日XX:XX~XX:XX一、实验目的1.掌握ARM汇编指令。
2.学习掌握C与汇编混合编程基础。
3.熟练使用ARM调试工具RVDS进行调试操作。
二、实验内容1.熟悉ARM汇编。
2.用ARM汇编实现1+2+...+N。
3.C调用汇编实验(实现字符串拷贝功能)。
4.汇编调用C实验。
5.ARM汇编实现冒泡算法(选做)三、实验步骤1)用ARM汇编实现1+2+….n的运算。
在sum.s文件中,添加如下代码:SUN_L1ADD R0,R1BVS SUM_ENDCMP R1,R2BHS SUM_ENDADD R1,#1B SUN_L12)理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。
在汇编文件testfile1. s中添加两行汇编代码,实现:拷贝源字符串的一个字节到R2中,将拷贝的字节复制到目标空间。
关键代码如下:strcopy;------------------------------------------;用汇编实现字符串拷贝LDRB R2,[R1],#1 ;R1对应源字符串首地址,利用寄存器间接寻址读取字符到R2STRB R2,[R0],#1 ;R0对应目的字符串首地址,利用寄存器间接寻址保存字符CMP R2,#0BNE strcopyMOV PC,LR;------------------------------------------END ;文件结束3)在汇编中调用C函数。
在汇编文件testfile2.s中相应位置添加汇编代码,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。
关键代码如下:STR LR,[SP,#-4]!MOVS R0,#1MOVS R1,#2MOVS R2,#3LDR R4,=glovb1LDR R3,[R4] ;传递参数BL gMOV R8,R0ADD sp,sp,#4LDR pc,[sp],#4中,通过伪指令EQU,定义N的值。
ARM中的汇编指令
ARM中的汇编指令BIC:ARM 指令,对某些位,清零。
先取反再相与。
asm(“BIC r2, r2,#0x1f”); ##对R2 的低5 位清零。
ORR:ARM 指令,逻辑或asm(“ORR r2, r2, #0x10”); ##R2 逻辑与0x10。
MRS:asm(“MRS r2, CPSR”); ##将CPSR 的值加载到R2 中。
MSR:asm(“MSR CPSR, r2”); ##将R2 的值加载到CPSR 中。
asm(“ SWI 0x0”); ##跳转到软件中断函数,并转换为SVC 模式。
LDR:{条件}目的寄存器存储器寄存器。
将存储地址所指的4 个字节数据传送到寄存器,其中寻址方式会有很多种。
asm(“ldr r0,=0xddeeaabb”); ##在这里ldr 是一个伪指令,相当于move 指令。
asm(“ldr r0, [r1]”);##将存储器地址为r1 的一个字的数据加载到r0 中。
MRC 与MCR:在处理器寄存器与协处理器寄存器之间交换数据。
MRC {cond} coproc, opcode1, Rd, CRn, CRm {,opcode2}asm(“mrc p15,0,r0,c1,c1,0”); ##在CRn, CRm 均为c1, opcode 均为0 时,表示SCR(Secure Configuration Register),表示将c1 的值赋值给r0.asm(“mcr p15,0,r0,c1,c1,0”); ##将r0 的值赋值给c1.asm(“mcr p15,0,r0,c12,c0,0”);##将r0 的值赋值给c12,此时c12 表示VBAR,Vector Base Address Register,存放异常时的入口地址。
SMC:(Secure Monitor Call). asm(“SMC 0x0”);##将ARM core 切换到Trust Zone 模式。
嵌入式实验报告
实验一 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汇编指令
2021-8-17
1/57
ARM处理器寻址方式
寻址方式是根据指令中给出的地址码 字段来实现寻找真实操作数地址的方式。
ARM处理器具有几种基本寻址方式:
1. 立即寻址
2. 寄存器直接寻址、寄存器移位寻址
3. 寄存器间接寻址、基址变址寻址
4. 多寄存器直接寻址
5. 相对寻址
6. 堆栈寻址
2/57
立即寻址
9/57
寄存器移位寻址
1. 操作数存放在寄存器中;
2.指令地址码字段给出寄存器编号(名)及移
位表达式;
3.指令执行时取出寄存器值并移位,再将结果
作为源操作数;
寄存器寻址
MOV R0, R2, LSL #3
; R0<=R2×8
逻辑左移3位
R2 0x01
0x08
R0 0x5058
LSL、LSR ASR
前;R索1引=>[R0-4], R0<=R0-4 后;R索0引<=[R1],R1<=R1+4
;R0<=[R1+R2]
12/57
多寄存器直接寻址
内存单元 0x40000000
0xAA
R2 0x40000000 R0 00xxA55A
实验一 ARM 汇编指令
实验一ARM 汇编指令1.1 实验目的初步学会使用Embest IDE for ARM 开发环境及ARM 软件模拟器;通过实验掌握简单ARM 汇编指令的使用方法。
1.2 实验设备硬件:PC 机软件:Embest IDE Pro ARM 集成开发环境,Windows 98/2000/NT/XP。
1.3 实验内容熟悉开发环境的使用并使用ldr/str,mov 等指令访问寄存器或存储单元。
使用add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。
1.4 实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。
这些寄存器都是32 位的。
6 个状态寄存器。
这些寄存器也是32 位的,但是只是使用了其中的12 位。
这里简要介绍通用寄存器,关于状态寄存器的介绍,请参照下一节。
1. ARM 通用寄存器通用寄存器(R0~R15)可分为3 类:不分组寄存器R0~R7;分组寄存器R8~R14;程序计数器R15;1) 不分组寄存器R0~R7;R0~R7 是不分组寄存器。
这意味着在所有处理器模式下,它们每一个都访问一样的32 位寄存器。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2) 分组寄存器R8~R14R8~R14 是分组寄存器。
它们每一个访问的物理寄存器取决于当前的处理器模式。
若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。
寄存器R8~R12 没有任何指定的特殊用途。
只是使用R8~R14 来简单地处理中断。
寄存器R13,R14各有6 个分组的物理寄存器。
1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。
寄存器R13 通常用做堆栈指针,称为SP。
每种异常模式都有自己的R13。
寄存器R14 用作子程序链接寄存器,也称为LR。
3) 程序计数器R15寄存器R15 用做程序计数器 (PC)。
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。
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位的指令集。
arm实验代码
arm实验代码1.寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。
AREA TEST, CODE,READONL YENTRYSTARTMOV R0,#3MOV R1,#4MOV R2,#5CMP R0,R1BHI EXIBLS EXTEXICMP R0,R2BHI AXIBLS AXYAXIMOV R3,R0EXTCMP R1,R2BHI AXTBLS AXYAXTMOV R3,R1AXYMOV R3,R2END2.用汇编语言设计程序实现10!AREA TEST, CODE,READONL YENTRYSTRA TMOV R13 ,#0X1000MOV R0,#0X01MOV R1,#0X02MOV R2,#0X03STMFD R13,{R0,R2,R1}MOV R7,#&FFLDMFD R13!,{R3-R5}MOV R8,#&55END3.实现字符串的逆序复制TEXT1=HELLO=>TEXT2=0LLEH AREA invstring, CODE, READONL YstartADR R1,TEXT1ADR R2,TEXT2MOV R3, #0LOOP LDRB R0,[R1], #1ADD R3,R3,#1CMP R0,#0BNE LOOPSUB R1,R1,#2LOOP1 LDRB R0,[R1], #-1STRB R0,[R2], #1SUB R3,R3, #1CMP R3,#1BNE LOOP1MOV R5,#&55NOPTEXT1 =“HELLO”,0ALIGNTEXT2 =“OELLH”END4.用调用子程序的方法实现1!+2!+3!+ (10) asmp.sAREA JC, CODE, READONL YEXPORT JCPENTRY JCPADD R3, R0, #1MOV R2, #1MOV R1, #1LOOP MUL R0, R1, R2MOV R1, R0ADD R2, R2, #1CMP R2, R3BNE LOOPNOPNOPMOV PC, LRENDPROGC.c#includeExtern int JCP(int N)int main() {int res=0;int m=10;int i;for (i=1;i<=m;i++)res=res+JCP(i);printf(“The result =%d\”,res);return 0; }1.线程创建线程创建所需的头文件:#include线程创建函数:pthread_create()函数原型:int pthread_create ((pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)) 其中thread:线程标识符attr:线程属性设置(常为空)start_routine:线程函数的起始地址arg:传递给start_routine的参数函数返回值成功:0 出错:-12.线程退出所需头文件:#include线程退出函数:pthread_exit();函数原型:void pthread_exit(void *retval)函数传入值retval: pthread_exit()调用者线程的返回值,可由其他函数如pthread_join 来检索获取3. 线程等待,资源释放所需头文件#include等待线程退出并释放资源pthread_join()函数原型:int pthread_join ((pthread_t th, void **thread_return))函数传入值th:要等待退出的线程标识符thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL 时)函数返回值成功:0 出错:-1实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一ARM汇编实验指令
一、实验目的
1、初步学会使用ADS开发环境及AXD环境下汇编语言的调试过程。
2、通过实验掌握简单ARM汇编指令的使用方法。
二、实验设备
1、硬件:PC机
2、ADS集成开发环境,winxp/win7
三、实验内容
1、熟悉开发环境的使用并使用ldr、str、mov等指令访问寄存器或存储单元。
2、使用add、sub、lsl、lsr、and、orr等指令完成基本数学/逻辑运算。
四、程序代码
实验(1)代码如下:
.equ x, 45 /*定义变量x,并赋值为45*/
.equ y, 64 /* 定义变量y,并赋值为64*/
.equ stack_top, 0x1000 /* 定义栈顶0x1000*/
.global
_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)代码如下:
.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
五、实验结果
打开memory窗口,观察两个地址的内容
实验(1)运行界面:
单步运行
实验(2)运行界面:
单步运行
六、实验小结
实验开发环境不同程序编码和显示界面有很大差异,ADS和AXD环境
要更简洁方便。
通过这次试验,我们初步学会使用ADS开发环境及AXD环境下汇编语言的调试过程。
并且通过本次实验掌握了简单ARM汇编指令的使用方法。