实验二 ARM指令系统试验

合集下载

实验五 ARM 指令系统实验二

实验五 ARM 指令系统实验二

实验五ARM指令系统实验二注意:本实验在模拟环境下进行,请不要打开实验箱电源!!一、实验目的:1、掌握MDK开发环境下多文件编程的方法;二、实验原理我们编程时会以工程为单位来解决一个问题,为了解决问题的复杂性和人脑的局限性之间的矛盾,编程人员常常把把一个大问题分解成若干过小问题,每个小问题的解决方法在一个文件中实现,把每个文件解决问题的方法综合起来就够成了解决了大问题的方法。

这些文件之间是存在一定关系的,如果一个文件与其他文件不发生任何关系,那么就没有在工程中存在的必要了!从ARM汇编程序员的角度理解这种关系为:一个文件有标号被其他文件引用,另一个文件应用了其他文件的标号;这用引用与被应用的关系分别通过import和export实现。

例如:三、实验任务下面文件中的定义的数据为某科目学生成绩,试编程找出最高分数的放在maxscore,score.s的内容如下:;score.sarea score,data,readwritescoresdcb65,78,92,47,77,83,59,93,82,97;学生成绩numofstudentdcb10;学生人数maxscoredcb0;存放最高分数end四、实验步骤;A.s……export labellabel……;B.s……import label bl label……说明标号label可以被其他文件引定义了标号label说明标号label可以被其他文件引引用了标号label1、用自然语言描述解决给问题的算法,可以尽可能的抽象!2、建立工程并建立源文件score.s并把输入(复制)上面内容,并将该文件添加到工程;3、建立文件maxoftwo.s,在文件中实现子程序getmax,调用者传入的参数位于r0、r1中,要求找出r0、r1中的较大值,并把较大值保存在r0当中,该文件架构如下:;maxoftwo.s;两个要比较的数在r0,r1中;比较所得的最大数放在r0当中area max,code,readonlygetmaxend4、建立文件init.s,通过调用maxoftwo.s和score.s完成任务,自己编写代码,注意下页有该文件的参考代码,但希望同学在实验课上尽量不看参考代码或少看代码!import scoresimport numofstudentimport maxscoreimport getmaxarea init,code,readonlyentryldr r2,=scores;指向学成成绩ldr r3,=numofstudentldrb r3,[r3];获取学生人数ldrb r0,[r2];获取第一个学生的成绩,并暂时认为它是最大的loopcmp r3,#0beq exit;判断是否比较结束ldrb r1,[r2],#1;获取要比较的数bl getmaxsub r3,r3,#1;人数减一b loopexitldr r1,=maxscorestrb r0,[r1];将结果保存在maxscore中b.end。

ARM嵌入式实验报告

ARM嵌入式实验报告

实验一ARM 汇编指令使用实验——基本数学/ 逻辑运算一、实验目的1. 初步学会使用ARM ADS / Embest IDE for ARM 开发环境及ARM 软件模拟器。

2. 通过实验掌握数据传送和基本数学/ 逻辑运算的ARM 汇编指令的使用方法。

二、实验设备1. 硬件:PC机。

2. 软件:ADS 1.2 / Embest IDE 200X 集成开发环境。

三、实验内容1 .熟悉ADS 1.2 / Embest IDE 200X 开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。

具体实验程序如下:/* armasm1a.s */• EQU X, 45 /*定义变量X,并赋值为45*/.EQU Y, 64 /*定义变量Y,并赋值为64*/.EQU STACK_TOP, 0X1000 /* 定义栈顶0X1000*/.GLOBAL _START.TEXT_START: /* 程序代码开始标志*/MOV SP, #STACK_TOPMOV R0, #X/*X 的值放入R0*/STR R0, [SP]/*R0 的值保存到堆栈*/MOV R0, #Y/*Y 的值放入R0*/LDR R1, [SP]/* 取堆栈中的数到R1*/STRR0, [SP] STOP: B STOP/* 程序结束,进入死循环 */.END等指令,完成基本数学 / 逻辑运算。

具体实验程序如下:/* armasm1b.s */ .EQU X, 45 /*定义变量X ,并赋值为45*/ .EQU Y, 64 /*定义变量Y ,并赋值为64*/ .EQU 乙87/*定义变量Z ,并赋值为87*/.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*/ADDR0, R0, R1 2.使用 ADD/SUB/LSL/LSR/AND/ORR .EQU STACK_TOP, 0X1000 /* 定义栈顶 0X1000*/1.新建工程。

02实验二 ARM汇编语言程序设计

02实验二 ARM汇编语言程序设计

实验二 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汇编语言程序设计

实验二_ARM汇编语言程序设计

实验二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中。

实验二C ARM汇编指令实验

实验二C  ARM汇编指令实验

实验二ARM汇编指令实验一、实验目的1.掌握ARM数据处理指令的用法2.了解ARM汇编指令灵活的第二操作数,编写简单的汇编程序二、实验内容1.用MOV和MVN指令访问ARM通用寄存器2.使用ADD、SUB、AND、ORR、CMP和TST指令完成数据的加减运算及逻辑运算。

3.用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegister)监视运算值,打开存储器观察窗口(Memory)监视0x40003100地址处的值。

三、预备知识1、用ARM ADS集成开发环境,编写和调试程序的基本过程。

2、ARM指令的使用四、实验设备及工具(包括软件调试工具)硬件:PC机Pentium100以上。

软件:PC机Windows操作系统、ARM ADS 1.2集成开发环境、AXD五、实验步骤1.启动ADS1.2,使用ARM Executable Image工程模板建立一个工程。

如SY22.建立汇编源文件Test2.s,然后加入工程中。

3.编译、连接工程,选择Project Debug ,启动AXD软件仿真调试。

4.打开寄存器窗口,监视寄存器的值。

5.可以单步运行程序,可以设置、取消断点,或者全速运行,停止运行,调试时观察寄存器的值,运行结果见图2-1。

图2-1 ARM实验2的运行结果六、实验参考程序X EQU 11Y EQU 8BIT23 EQU (1<<23) ;BIT23 = 0X00800000AREA test2,CODE,READONL YENTRYCODE32START;MOV,ADD, R8=R3=X+YMOV R0,#XMOV R1,#YADD R3,R0,R1MOV R8,R3;MVN,SUB, R5= 0X5FFFFFF8 -R8*8MVN R0,#0XA0000007SUB R5,R0,R8,LSL #3;CMP, 5*Y/2 > 2*X ? R5=R5&0XFFFF0000,R5=R5|0X000000FFMOV R0,#YADD R0,R0,R0,LSL #2MOV R0,R0,LSR #1MOV R1,#XMOV R1,R1,LSL #1CMP R0,R1LDRHI R2,=0xFFFF0000ANDHI R5,R5,R2ORRLS R5,R5,#0x000000FF;TST,BIC:BIT23 =1?BIT6 = 0:1TST R5,#BIT23BICNE R5,R5,#0x00000040B STARTEND。

湖南工业大学ARM实验报告

湖南工业大学ARM实验报告

ARM嵌入式系统原理及应用开发实验报告学院:电气与信息工程学院班级:电子信息1204指导老师:谭会生姓名:学号:实验一:ARM汇编指令使用实验——基本数学/逻辑运算一、实验目的1.初步学会使用ARM ADS / Embest IDE for ARM 开发环境及ARM软件模拟器。

2.通过实验掌握数据传送和基本数学/逻辑运算的ARM汇编指令的使用方法。

二、实验设备1.硬件:PC机。

2.软件:ADS 1.2 / Embest IDE 200X集成开发环境。

三、实验内容熟悉ADS 1.2 / Embest IDE 200X开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。

具体实验参考程序如下:四.实验操作步骤1.新建工程。

先建立一个实验文件夹,如E\ARMSY\armasm1;然后运行Embest IDE 集成开发环境,选择File→New Workspace菜单项,弹出一个对话框,输入工程名armasm1a/armasmlb等相关内容;最后单击OK按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。

此时在工作区窗口将能打开该工作区和工程。

2.建立源文件。

选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。

编辑完后,保存文件armasmla. s。

1)armasmla. s源程序:/* armasm1a.s */.EQU X, 45 /*定义变量X,并赋值为45*/.EQU Y, 64 /*定义变量Y,并赋值为64*/.EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/.GLOBAL _START.TEXT_START: /*程序代码开始标志*/MOV SP, #STACK_TOPMOV R0, #X /*X的值放入R0*/STR R0, [SP] /*R0的值保存到堆栈*/MOV R0, #Y /*Y的值放入R0*/LDR R1, [SP] /*取堆栈中的数到R1*/ADD R0, R0, R1STR R0, [SP]STOP: B STOP /*程序结束,进入死循环*/.END2).使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

ARM处理器工作模式实验报告

ARM处理器工作模式实验报告

肇庆学院电子信息与机电工程学院实验日期: 2015 年 11 月 30 日班级:12电气1班姓名:李俊杰学号: 19 老师评定:____ _ 实验二:ARM处理器工作模式实验一、实验目的通过实验掌握学会使用MSR/MRS指令实现ARM处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU结构的理解。

通过实验掌握ld中如何使用命令行指定代码段起始地址。

二、实验设备硬件:PC机。

软件:Embest IDE Pr0 2004集成开发环境,Windows 98/2000/NT/XP。

三、实验内容通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别。

掌握ARM不同模式的进入与退出。

四、实验原理1.ARM处理器模式ARM体系结构支持表3-2所列的7种处理器模式。

在软件控制下可以改变模式,外部中断或异常处理也可以引起模式发生改变。

大多数应用程序在用户模式下执行。

当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常发生。

这允许适当编写操作系统来控制系统资源的使用。

图2-1除用户模式外的其他模式称为“特权模式”,它们可以自由地访问系统资源和改变模式。

其中的5种称为“异常模式”,即FIQ(Fast Interrupt Request)、IRQ(lnterrupt Request)、管理(Supervisor)、中止(Abort)和未定义(Undefined)。

当特定的异常出现时,进入相应的模式。

每种模式都有某些附加的寄存器,以避免异常出现时用户模式的状态不可靠。

剩下的模式是“系统模式”。

仅ARM体系结构V4以及以上的版本有该模式。

不能由于任何异常而进入该模式。

它与用户模式有完全相同的寄存器,但它是特权模式,不受用户模式的限制。

它供需要访问系统资源的操作系统任务使用,但希望避免使用与异常模式有关的附加寄存器。

避免使用附加寄存器保证了当任何异常出现时,都不会使任务的状态不可靠。

第四章_ARM指令系统实验

第四章_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实验报告

ARM实验报告

ARM 实验报告学院:计算机科学与工程学院班级: 070603 学号: 070603115 姓名:张鑫实验一:工程配置一、处理器配置选择菜单项Project > Settings…或快捷键Alt+F7,弹出工程设置对话框。

在工程设置对话框中,选择Processor设置对话框,如下图,可进行目标板所用处理器的配置。

图1 处理器配置对话框用户选择对应的工程文件名进行相应的配置。

图中各项设置定义如下:处理器模块(CPU Module)选择当前所使用的处理器模块,不同的处理器模块将支持不同的处理器系列,目前Embest IDE for ARM 支持ARM7、ARM9核系列处理器。

处理器系列(CPU Family)选择用户使用的处理器所属处理器系列。

处理器成员(CPU Member)设置处理器系列中具体的处理器成员。

字节排列方式(Endian)设置该处理器当前所支持的存储区字节排列方式是大字节结尾(Big Endian)还是小字节结尾方式(Little Endian)。

处理器制造商(Peripheral Maker)选择处理器生产厂家。

处理器型号(Peripheral Chip)选择相应的处理器型号。

编译工具(Build Tools)设置该处理器对应的编译链接器。

Embest IDE for ARM 支持ARM核系列处理器。

开发ARM7核系列处理器,按照图5-11中设置;开发ARM9核系列处理器,可依照图5-11设置作相应的改变。

二、仿真器配置选择菜单项Project>Settings…,弹出工程设置对话框。

在工程设置对话框中,选择Remote设置对话框,如下图,可进行仿真器的连接配置。

图2 仿真器的连接配置在该对话框中,有两项设置:远程连接设备(Remote device)设置连接的调试设备,例如Embest IDE for ARM支持英蓓特公司的Embest Emulator for ARM和Embest PowerICE for ARM。

实验二 ARM嵌入式系统应用 汇编语言编程一

实验二   ARM嵌入式系统应用   汇编语言编程一

实验二
实验项目名称:ARM处理器寻址方式:
实验目的和要求:对ARM处理器的六种寻址方式进行练习。

实验原理:根据不同寻址方式,运行ARM指令,观察运行结果。

主要仪器设备:台式计算机、windows操作系统、应用软件等。

实验方法与步骤:1、根据6种寻址方式,输入ARM指令。

2、运行软件例程,观察结果。

实验数据记录、处理及结果分析:
寄存器寻址方式(P37---P40 每种寻址方式写出一条指令即可)
1、寄存器寻址:
2、立即寻址:
3、寄存器间接寻址:
4、变址寻址:
5、寄存器移位寻址:
6、多寄存器寻址:
综合练习:
(P43 指令示例运行结果观察:共8条指令选4条指令)
LDR R3, [R4] ;写出目标寄存器中的结果,如R3=0x?
…….
LDR R3, [R1], R2, LSL #3。

实验二ARM汇编语言实验

实验二ARM汇编语言实验

x .long 0xaa88 Y .long 0x77aa z .long 0x123489ab
.text global _start _start:
MOV R0 , #0x55
实验设备: 宿主机:PC机
wait: B wait .end
目标机:IDE内置的软件模拟器
3、实验操作步骤
1)运行EmbestIDE
2)新建工作区
3)新建一个文件, 另存为以.s为扩展名的文件
4)在文件中编辑程序
5)把编辑好的源文件添加到工程中
6)设置工程属性
选择编译工具 调试配置 连接方式(SIM) 下载符号表文件 调试目标文件Fra bibliotek 下载内存地址
3、实验操作步骤
8)构建工程 可以单独编译一个文件,也可采用build实现编译、连
实验二 ARM汇编语言实验
2019/8/1
1
1 实验目的与要求 2 实验内容 3 实验操作步骤 4 测试数据与实验结果
1、实验目的与要求
目的: 1)熟练使用EmbestIDE集成开发环境。 2)基本掌握 ARM 汇编语言
要求: 1)独立完成程序设计、编码与调试 2)编写实验报告
2、实验内容
按照GNU汇编程序文件格式,用ARM汇编语言编写程序, 求三个数(x、y、z)中的最大值与最小值,分别存放在寄 存器R6、R7中。三个数用伪操作定义如下:
接一起完成。 如果编译过程出错,需要修改错误,直到构建成功。
9)调试 连接目标机 下载 运行(打开源文件、设置断点) 浏览(寄存器、内存)

arm实验报告

arm实验报告

实验二:编写程序将R2的高8位传送到R3的低8位(一),程序代码:.global _start.text_start:mov r2,#0x33000000mov r3,#0x00000022mov r1,r2,LSR#24ORR r3,r1,r3,LSL#8stop:b stop.end(每一条的指令分析如下)(二),实验结果及分析:按F11单步跟踪,看寄存器中内容的变化:1,将寄存器R2赋值0x33000000 :2,将0x00000022写入寄存器R3中:3,将R2的内容右移24位,将结果写入R1,R2保持不变4,将R3的值左边移动8位与R1逻辑或,再将结果放到R3中实验结果:实验三实验64位的加法运算:要求[R1:R0]+[R3:R2]结果放到[R1:R0](一),程序代码.global _start.text_start:mov r0,#0x10000000mov r1,#0x11000000mov r2,#0x22000000mov r3,#0x20200000ADDS R0,R0,R2ADC R1,R1,R3stop:b stop.end(二),实验结果及分析1,给R0赋值2,给R1赋值3,给R2赋值4,给R3赋值5,R0与R2相加,结果写入R06,再将R1与R3带进位位相加,把结果写入R1。

R2R3寄存器的内容不变实验结果:实验7:编写一段程序实现10!(一),程序代码.global _start.text_start:ldr r0,=10 @ 将R0赋值为十进制的10mov r1,r0 @将R0的内容写进R1 ,R0的内容保持不变lable: sub r1,r1,#1 @R1的内容减去1 ,结果送回R0 mul r0,r1,r0 @将R0与R1寄存器的内容相乘,结果写入R0。

R1保持不变cmp r1,#1 @ 将R1的值与1 相比较,看是否相等bgt lable @倘若不为1 ,则跳到lable进行循环stop: @否则停止b stop.end(二),实验结果及分析单步调试,由于寄存器的变换图比较多,只截取最后结果图实验结果:实验8:串拷贝(R0指向源数据串的首地址,R1指向目的数据串的首地址)(一),程序代码.global _start.equ num,8 @定义num= =8_start:LDR R0,=src @将src的值赋给R0LDR R1,=dst @将dst的值赋给R1mov r3,#num @ 将8赋给R3mov lr,pcB strcopystop: b stopstrcopy:LDRB R2,[R0],#1 @加载无符号字节数据STRB R2,[R1],#1 @存储无符号字节数据subs r3,r3,#1 @R3减去1 ,结果送入R3CMP R3,#0 @将R3的内容与0相比较看是否相等BNE strcopymov PC,LR.datasrc:.long 1,2,3,4,5,6,7,0 @定义srcdst:.long 2,4,3,5,6,2,5,0 @定义dst.end(二),实验结果及分析实验结果:心得体会:开始的时候,在实验中编译连接成功后,点击debug的connect后总出现warning:load symbol file failed. 找了些原因,不知道怎么回事,后来才发现在开始的设置中的setting中设置download时忘记同时设置的generate了,当设置好后就解决了该warning。

实验二 ARM汇编器ARMASM实验

实验二  ARM汇编器ARMASM实验

实验二:ARM汇编器ARMASM实验指导教师:覃志东一实验目的●掌握ARM汇编语言程序的基本组织结构●掌握ARMASM的命令行格式使用方法二实验内容本次实验要求学生配置好实验环境;然后使用ADS 的命令行汇编器armasm汇编一个汇编语言源程序,并连接、执行、调试。

需要学生查看相关的帮助文档,并完成实验报告的撰写。

三实验设备及工具●硬件:本次实验不用开发箱。

●软件:PC 机操作系统Win2000 或WinXP、ARM ADS1.2 集成开发环境。

四基础知识请大家先阅读,了解汇编器。

五实验过程1认识命令行格式的汇编器(1)、进入dos命令行。

进入到ADS1.2的bin目录。

如图1-3.图1 进入DOS图2 进入ADS(可以观测其目录结构)图3 进入bin目录(可以观测其中有很多的工具)(2)、在bin>下输入:armasm –help,查看armasm的帮助。

如图4,5。

图4 armasm的帮助图5 armasm的帮助2对汇编源程序进行汇编(1)、把实验用的arm汇编源程序strcopy.s拷贝到bin>目录。

待编译的汇编图6 确定路径(2)然后在命令窗口键入:armasm –g strcopy.s并回车。

如图7所示。

想想该命令是什么意思?然后可以在bin目录下看见生成的对象文件。

图7 进行汇编汇编生成的对象文件图8 汇编生成3连接在命令行bin>下键入armlink strcopy.o –o strcopy.axf并回车,如图9所示。

具体步骤如下:图9 连接4调试执行(1)在命令行bin>下键入:armsd strcopy.axf并回车,如图11所示。

这就用命令行调试器加载了可执行文件。

(2)在armsd命令提示符下键入go.程序就执行,如图12所示。

图11 执行(2)推出arm符号调试器armsd。

可以在armsd:下键入quit。

如图12所示。

图12 退出六实验报告请阅读ADS1.2在线帮组文档,了解armsd的使用方法,完成本实验程序的调试。

实验二 ARM指令系统试验

实验二 ARM指令系统试验

实验二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汇编语言编程实验.doc

实验二 ARM汇编语言编程实验.doc

实验二: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为声明的符号的名称。

3.2 ARM汇编指令实验二

3.2 ARM汇编指令实验二
32arm汇编指令实验二实验操作步骤实验原理实验内容实验设备实验目的一实验目的通过实验掌握使用ldmstmbbl等指令完成较为复杂的存储区访问和程序分支学习使用条件码加强对cpsr的认识
3.2 ARM汇编指令实验二
1
实验目的
2
实验原理
实验操作步骤
一、实验目的
通过实验掌握使用LDM/STM,b,bl 等指令完成较为复杂的存储区访问和 程序分支,学习使用条件码,加强对 CPSR的认识。
二、实验设备
硬件:PC机 软件:Embest IDE 2003集成开发环境, Windows 98/2000/NT/XP
三、实验内容
熟悉开发环境的使用并完成一块存储 区的拷贝。 完成分支程序设计,要求判断参数, 根据不同参数,调用不同的子程序。
四、实验原理
ARM程序状态寄存器
CPSR与SPSR的格式 ARM工作模式
10. 11.
五、实验操作步骤
实验B步骤
1.
2. 3.
ARM汇编指令实验一和实验参考程序,在当 前工作区添加新工程asm1_b。 参照实验A的步骤完成目标代码的生成与调 试。 理解和掌握实验后,完成实验练习题。
4. 5. 6. 7.
五、实验操作步骤
实验A步骤
8. 9. 打开memory窗口,观察地址0x8054~0x80A0的内 容,与地址0x80A4~0x80f0的内容; 单步执行程序并观察和记录寄存器与memory的值 变化,注意观察步骤8里面的地址的内容变化,当 执行STMFD,LDMFD,LDMIA和STMIA指令的 时候,注意观察其后面参数所指的地址段或寄存 器段的内容变化; 结合实验内容和相关资料,观察程序运行,通过 实验加深理解ARM指令的使用; 理解和掌握实验后,完成实验练习题。

ARM基本指令实验报告书.

ARM基本指令实验报告书.

ARM基本指令实验报告书ARM基本指令实验报告书1、实验内容或题目●熟悉开发环境的使用并使用ldr/str,mov 等指令访问寄存器或存储单元。

●使用add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。

2、实验目的与要求●初步学会使用Embest IDE for ARM 开发环境及ARM 软件模拟器;●通过实验掌握简单ARM 汇编指令的使用方法。

3、实验步骤与源程序⑴ 实验步骤1) 新建工程:运行Embest IDE 集成开发环境,选择菜单项File → New Workspace,系统弹出一个对话框,输入相关内容。

点击OK 按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。

此时在工作区窗口将打开该工作区和工程。

2) 建立源文件:点击菜单项File → New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。

3) 添加源文件:选择Project → Add To Project → Files 命令,或单击工程管理窗口中的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件asm1_a.s。

4) 基本配置:选择菜单项Project → Settings…或快捷键Alt+F7,弹出工程设置对话框。

在工程设置对话框中,选择Processor 设置对话框,按照图3-2 所示,进行目标板所用处理器的配置。

5) 生成目标代码:选择菜单项Build → Build asm_a 或快捷键F7,生成目标代码。

6) 调试设置:选择菜单项Project → Settings…或快捷键Alt+F7,弹出工程设置对话框。

在工程设置对话框中,选择Remote 设置对话框,按照图3-4 所示对调试设备模块进行设置。

7) 选择Debug 菜单Remote Connect 进行连接软件仿真器,执行Download 命令下载程序,并打开寄存器窗口。

嵌入式系统实验2 ARM微处理器工作模式实验

嵌入式系统实验2 ARM微处理器工作模式实验

实验2 ARM 微处理器工作模式实验一、实验目的(1)掌握学会使用MSR/MRS 指令实现ARM 处理器工作模式的切换(2)观察不同模式下的寄存器,加深对CPU 结构的理解。

二、实验设备(1)硬件:嵌入式实验平台一套、仿真器一个、PC 机一台。

(2)软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP。

三、实验内容(1)通过ARM 汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;(2)掌握ARM 不同模式的进入与退出。

四、实验原理1.ARM 处理器模式ARM 体系结构支持7种处理器模式:(1) 用户模式USR:正常程序执行模式;(2) 快速中断模式FIQ:支持快速数据传送或通道处理;(3) 外部中断模式IRQ:用于通用中断处理;(4) 管理模式SVC:操作系统保护模式;(5) 中止模式ABT:实现虚拟存储器和/或存储器保护(6)未定义模式UND:支持硬件协处理器的软件仿真(7)系统模式SYS: 运行特权操作系统任务在软件控制下可以改变模式,外部中断或异常处理也可以引起模式发生改变。

大多数应用程序在用户模式下执行。

当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的系统资源,也不能改变模式,除非异常发生。

这允许适当编写操作系统来控制系统资源的使用。

除用户模式外的其他模式成为特权模式。

它们可以自由地访问系统资源和改变模式。

其中5 种称为异常模式,即:FIQ (Fast Interrupt Request)、IRQ (Interrupt Request)、管理(Supervisor)、中止(Abort)、未定义(Undefined)。

当特定的异常出现时,进入相应的模式。

每种模式都有某些附加的寄存器,以避免异常出现时用户模式的状态不可靠。

其余模式是系统模式。

仅ARM 体系结构V4 以及以上的版本有该模式。

不能由于任何异常而进入该模式。

大学ARM嵌入式实验报告范文

大学ARM嵌入式实验报告范文

大学ARM嵌入式实验报告范文《嵌入式系统》实验报告姓名:学号:班级:2022年4月实验一ARM汇编指令实验1一、实验目的1.初步学会使用ADS1.2开发环境及ARM软件模拟器;2.通过实验掌握简单ARM汇编指令的使用方法。

二.实验设备1.硬件:PC机;2.软件:ADS1.2集成开发环境。

Window98/2000/NT/某P。

三.实验内容1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。

2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四.实验原理ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。

1.ARM通用寄存器通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。

2.存储器格式ARM体系结构将存储器看作是从零地址开始的字节的线性组合。

字节0~3存放第一个字,字节4~7存放第2个字,以此类推。

ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

五.实验程序1.实验A参考程序某EQU45:定义变量某,并赋值为45YEQU64:定义变量y,并赋值为64STACK_TOPEQU0某1000:定义栈顶0某1000AREAE某ample,CODE,READONLY:声明代码段ENTRY:标识入口STARTMOVSP,#STACK_TOPMOVR0,#某:某的值放入R0STRR0,[SP]:R0的值保存到堆栈MOVR0,#Y:y的值放入R0LDRR1,[SP]:取堆栈中的数到R1ADDR0,R0,R1STRR0,[p]STOPBSTOP:死循环END:结束2.实验B参考程序某EQU45:定义变量某,并赋值为45YEQU64:定义变量y,并赋值为64ZEQU87:定义变量z,并赋值为87STACK_TOPEQU0某1000:定义堆栈顶0某1000AREAHU某IANG,CODE,READONLY:声明代码段,只读ENTRY:标识入口STARTMOVR0,#某:某的值放入R0MOVR0,R0,LSL#8:R0的值乘以2的8次方MOVR1,#Y:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2MOVSP,#0某1000STRR2,[SP]MOVR0,#Z:z的值放入R0ANDR0,R0,#0某FF:取R0的低八位MOVR1,#Y:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2LDRR0,[SP]:y的值放入R1MOVR1,#0某01ORRR0,R0,R1MOVR1,R2:y的值放入R1ADDR2,R0,R1,LSR#1:R1的值除以2加上r0的值放入R2STOPBSTOP:死循环END:结束六.实验结果及分析1.程序A的实验结果截图如下:实验分析;本实验使用LDR、STR、MOV等指令访问寄存器和存储单元,使用堆栈和寄存器R0,R1存储变量。

arm实验二

arm实验二

汇编语言与接口技术实验报告院系信息科学与工程学院专业班级计科1101学生姓名杜海指导教师黄向宇提交日期 2014年 4 月 9日实验二 ARM汇编语言程序设计一、实验目的●初步学会使用IAR EWARM 开发环境及ARM 软件模拟器。

●通过实验掌握简单ARM 汇编指令的使用方法。

●通过实验掌握使用ldm/stm、b、bl 等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR 的认识。

●通过实验掌握 ARM 处理器16 位Thumb 汇编指令的使用方法。

二、实验内容●利用实验参考程序学习使用ldr/str、mov 等指令访问寄存器或存储单元。

使用add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。

●编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。

最后把R4~R11 用LDMFD 指令清空赋值为0。

●新建工程,并自行编写汇编程序,分别使用ldr、str、ldmia、stmia 操作,实现对某段连续存储单元写入数据,并观察操作结果。

学习分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。

●编写程序从ARM状态切换到Thumb,在ARM 状态下把R2 赋值为0x12345678,在Thumb状态下把R2 赋值为0x87654321。

同时观察并记录CPSR、SPSR 的值,分析各个标志位。

三、实验设备1. UP-TECH S2410实验平台,ARM标准/增强型仿真器套件2. PC 操作系统WIN98 或WIN2000 或WINXP,IAR EWARM集成开发环境,仿真调试驱动程序(H-JTAG)。

四、实验参考程序#*********************************************************************************************# NAME: ARMcode1.s *# Author: Embest *# Desc: ARMcode examples *# copy words from src to dst *# History: shw.He 2005.02.22 *#*********************************************************************************************NUM EQU 20AREA ARMcode1,CODE,READONLYENTRYSTARTldr r0, =src /* r0 = pointer to source block */ldr r1, =dst /* r1 = pointer to destination block */mov r2, #num /* r2 = number of words to copy */mov sp, #0x400 /* set up stack pointer (r13) */blockcopymovs r3,r2, LSR #3 /* number of eight word multiples */beq copywords /* less than eight words to move ? */stmfd sp!, {r4-r11} /* save some working registers */octcopyldmia r0!, {r4-r11} /* load 8 words from the source */stmia r1!, {r4-r11} /* and put them at the destination */subs r3, r3, #1 /* decrement the counter */bne octcopy /* ... copy more */ldmfd sp!, {r4-r11} /* don't need these now - restore originals */ copywordsands r2, r2, #7 /* number of odd words to copy */beq stop /* No words left to copy ? */ wordcopyldr r3, [r0], #4 /* a word from the source */str r3, [r1], #4 /* store a word to the destination */subs r2, r2, #1 /* decrement the counter */bne wordcopy /* ... copy more */stopb stopALIGNsrcDCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dstDCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END五、实验步骤实验一:利用实验参考程序学习使用ldr/str、mov 等指令访问寄存器或存储单元。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二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地址读出数据。

int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;inta,b;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;my_printf("please input a number from 0 to 9\n");ch=my_getc();a=ch-48;__asm__ __volatile__("mov r0,%0\n""ldr r1,=0x30008000\n""str r0,[r1]\n""mov %0,r2\n"::"r"(a):"r0","r1","r2");my_printf("write memory number is %d\n",a);__asm__ __volatile__("ldr r0,=0x30008000\n""ldr r1,[r0]\n""mov %0,r1\n":"=r"(b):my_printf("read memory number is %d\n",b);return 0;}4、使用u-boot从命令行中输入三个数,并且写入0x30008000起始的满递减栈中,并从栈中读出,输出到命令行;int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;inta,b,c;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;my_printf("please input a \n");ch=my_getc();a=ch-48;my_printf("a=%d \n",a);my_printf("please input b \n");ch=my_getc();b=ch-48;my_printf("b=%d \n",b);my_printf("please input c \n");ch=my_getc();c=ch-48;my_printf("c=%d \n",c);__asm__ __volatile__("mov r0,%0\n""mov r1,%1\n""mov r2,%2\n""ldrsp,=0x30008000\n""stmfdsp!,{r0-r2}\n"::"r"(a),"r"(b),"r"(c):"r0","r1","r2");my_printf("write memory from 0x30008000 is %d,%d,%d\n",a,b,c);__asm__ __volatile__("ldmfdsp!,{r0-r2}\n""mov %0,r0\n""mov %1,r1\n""mov %2,r2\n"::"r0","r1","r2");my_printf("read memory from 0x30008000 is %d,%d,%d\n",a,b,c);return 0;}5、使用bl实现函数调用int (*my_getc)();int (*my_printf)(const char *format,...);void test();int _start(){my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;my_printf("hello world\n");__asm__ __volatile__("bl test\n");my_printf("after test do\n");}void test(){my_printf("hello test\n");}6、实现C语言条件判断语句if(b==0)a++;elsea--;int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;inta,b,c,d;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;my_printf("please input a \n");ch=my_getc();a=ch-48;my_printf("a=%d \n",a);my_printf("if you input 0 then output a+1 ,else a-1 \n");ch=my_getc();b=ch-48;my_printf("b=%d \n",c);__asm__ __volatile__("mov r0,%2\n""mov r1,%3\n""movs r2,r1\n""addeq r0,r0,#1\n""subne r0,r0,#1\n""mov %0,r0\n""mrs %1,cpsr\n":"=r"(c),"=r"(d):"r"(a),"r"(b):"r0","r1","r2");my_printf("output a=%d\n",c);my_printf("cpsr=%x,",d);return 0;}【思考题】1、使用u-boot自带函数与ARM汇编程序实现y=a+b*c-d操作2、函数之间共享内存传递参数,函数间寄存器传递参数;3、函数间通过堆栈传递参数;4、计算两个64位数的和;。

相关文档
最新文档