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

第4章ARM汇编语言程序设计.

第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。

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中。

第四章_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汇编语言程序设计
13
使用局部标号的例子:
例1 无作用范围字符 01 SUBS r0,r0,#1
BNE %B 01
;每次循环使r0=r0-1 ;跳转到01标号去执行
例2 作用范围字符为NAME
ROUT NAME
; NAME作用范围
01NAME SUBS r0,r0,#1
;每次循环使r0=r0-1
BNE %B 01NAME ;跳转到01NAME标号去执行
Labeladd add r0,r0,r1
;
Str1
SETS
“This is a string.”
BKPT ;断点
标签: welcomefun , strarm , Labeladd, Str1
指令/伪操作/伪指令: STMFD , DCB , add , SETS
操作数:其他部分
9
注意: ARM程序中,指令、伪指令、伪操作、寄存 器助记符可以全部为大写或小写,但大小写不能混合 使用。
; “Welcom to ARM world!”字符串
LDMFD
sp!,{pc}
;恢复寄存器值
7
Adrstrarm ;adrstrarm标签
DCD strarm ;保存strarm的地址
AREA constdatasec, DATA, READONLY,ALIGN=0
;数据段,名称为constdatasec, 属性为只读
ENDP ;函数main结束
EXPORT main
;导出main函数供外部调用
;引入三个C运行时库函数和ARM库
IMPORT _main
IMPORT __main
IMPORT _printf
IMPORT ||Lib$$Request$$armlib||, WEAK

arm汇编语言程序设计

arm汇编语言程序设计

ARM汇编语言程序设计
6、 DCQ(或DCQU)
语法格式: 标号 DCQ(或DCQU) 表达式 作用: DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存 储区域并用伪指令中指定的表达式初始化。 用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元 并不严格字对齐。 使用示例: DataTest DCQ 100 ;分配一片连续的存储单元并初始化 为指定的值。
ARM汇编语言程序设计
1、IF、ELSE、ENDIF
语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF 作用: IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行 某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1, 否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当 IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面 的指令。 IF、ELSE、ENDIF伪指令可以嵌套使用。
ARM汇编语言程序设计
1、 DCB
语法格式: 标号 DCB 表达式 作用: DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指 定的表达式初始化。其中,表达式可以为0~255的数字或字符串。 DCB也可用“=”代替。 使用示例: Str DCB “This is a test!” ;分配一片连续的字节 存储单元并初始化。
ARM汇编语言程序设计
1、IF、ELSE、ENDIF 使用示例: GBLL Test ; 声明一个全局的逻辑变量,变量名为Test ⋯⋯ IF Test = TRUE 指令序列1 ELSE 指令序列2 ENDIF
ARM汇编语言程序设计
5、 DCFS(或DCFSU)
语法格式: 标号 DCFS(或DCFSU) 表达式 作用: DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字 存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据 一个字单元。 用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单 元并不严格字对齐。 使用示例: FDataTest DCFS 2E5,-5E-7 ;分配一片连续的字存储单元 并初始化为指定的单精度数。

ARM汇编语言程序设计

ARM汇编语言程序设计

始化。
DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单
元并用指定 的数据初始化。
DCFS(DCFSU) 用于为单精度的浮点数分配一片连续的字存储单元并
用指定 的数据初始化。
DCQ(DCQU) 用于分配一片以8字节为单位的连续的存储单元并用
指定的数据初始化。
SPACE
用于分配一片连续的存储单元
ARM汇编语言程序设计
4、 RLIST
语法格式: 名称 RLIST {寄存器列表}
作用: RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该
伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中, 列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表 中的寄存器排列次序无关。
指令仅在汇编过程中起作用,一旦汇编
结束,伪指令的使命就完成
ARM汇编语言程序设计
伪指令的分类
符号定义伪指令 数据定义伪指令 汇编控制伪指令和宏指令 其他伪指令。
ARM汇编语言程序设计
符号定义(Symbol Definition)伪指令:
符号定义伪指令用于定义ARM汇编程序中的变量、 对变量赋值以及定义寄存器的别名等操作。常见的符号 定义伪指令有如下几种: — 用于定义全局变量的GBLA、GBLL和GBLS。 — 用于定义局部变量的LCLA、LCLL和LCLS。 — 用于对变量赋值的SETA、SETL、SETS。 — 为通用寄存器列表定义名称的RLIST。
ARM汇编语言程序设计
1、 GBLA、GBLL和GBLS
语法格式: GBLA(GBLL或GBLS) 全局变量名
作用: GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并 将其初始化。其中: GBLA伪指令用于定义一个全局的数字变量,并初始化为0; GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假); GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;

嵌入式实验报告

嵌入式实验报告

实验一 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指向的地址块中。

第2章3_ARM汇编程序设计

第2章3_ARM汇编程序设计
第二章_3 ARM汇编程序设计

在ARM嵌入式系统中,一般用C语言等高级语言对 各个应用接口模块功能的实现进行程序设计,但在 某些地方用汇编语言更方便、简单。 在一些关键部分,例如用来初始化电路以及用来为 软件(高级语言编写)做运行前准备的启动代码必 须用汇编语言编写。


汇编语言的代码效率很高,一般用于对硬件的直接 控制。
符号说明 (1)label lable后面要带冒号‘:’ 例如:_start: b reset_handler。
(2)给符号赋值 三种方式:= .set .equ (3)符号名 由数字、字母或‚.‛,‚_‛组成,不可以数字 开头,大小写敏感。
汇编器预定义的寄存器名称
R0~R15 A1~A4 V1~V8 SB SL FP IP SP LR PC CPSR SPSR F0~F7 S0~S31 D0~D15 P0~P15 C0~C15 ARM 处理器的通用寄存器 入口参数、处理结果、暂存寄存器;是 R0~R3 的同义词 变量寄存器,R4~R11 静态基址寄存器,R9 栈界限寄存器,R10 帧指针寄存器,R11 内部过程调用暂存寄存器,R12 栈指针寄存器,R13 链接寄存器,R14 程序计数器,R15 当前程序状态寄存器 程序状态备份寄存器 浮点数运算加速寄存器 单精度向量浮点数运算寄存器 双精度向量浮点数运算寄存器 协处理器 0~15 协处理器寄存器 0~15



GNU环境下汇编语句与编译说明
GNU环境下ARM汇编语言程序设计主要 是面对在ARM平台上进行嵌入式LINUX的开发。 GNU标准中提供了支持ARM汇编语言的 汇编器as(arm-elf-as)、交叉编译器gcc ld(arm-elfgcc)和链接器ld(arm-elf-ld)。

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

•在ARM汇编语言中,子程序调用是通过BL指令来完成的。 BL指令的语法格式如下: •BL subname •其中,subname是被调用的子程序的名称。
子程序的返回
在返回调用子程序时,转移链接指令保存到LR寄存器 (r14)中的值需要拷贝回程序寄存器PC(r15)。
跳转表思想
•在程序设计中,有时为使程序完成一定的 功能,需要调用一系列子程序中的一个,而 决定究竟调用哪一个由程序的计算值确定。 跳转表是解决该问题的有效方案。跳转表是 利用程序计数器PC在通用寄存器文件中的可 见性来实现的,如下例所示:
第二讲
ARM汇编语言程序设计
ARM汇编语言程序设计
ARM汇编中的文件格式 ARM汇编语言语句格式 ARM汇编语言程序格式 ARM汇编语言编程的重点 ARM汇编程序实例
一、ARM汇编中的文件格式
ARM 源程序文件(可简称为源文件)可以由任意一 种文本编辑器来编写程序代码,它一般为文本格式。在 ARM程序设计中,常用的源文件可简单分为以下几种:
• 这是ARM中典型的数据理指令,格式 如下所示:
ADD r0, r1, r2 ;r0 <= r1 + r2
立即数操作
• 在数据处理指令中,第二操作数除了 可以是寄存器,还可以是一个立即数,如 下所示: • ADD R3, r3,#1 ;r3 <= r3 + 1 • AND R8, r7,#0xff ;r8 <= r7[7:0] •需要特别注意的是:在32位指令编码中, 有效立即数是由一个8位的立即数循环右移 2n位得到。
• CODE32 • INTO_ARM • ADR R0,INTO_THUMB+1 • BX R0 • ….. • CODE16 • INTO_THUMB ……. • ADR R5,INTO_ARM • BX R5

ARM汇编语言程序设计教学学习教案

ARM汇编语言程序设计教学学习教案
➢ 标号域用来表示指令的地址、变 量、过程名、数据的地址和常量。
➢ 标号是一个自行设计的标识符或 名称,语句标号可以是大小写字 母混合,通常以字母开头,由字 母、数字(shùzì)、下划线等组成。
➢ 语句标号不能与寄存器名、指令 助记符、伪指令(操作)助记符、 变量名同名。
➢ 语句标号必须第8页在/共164一页 行的开头书写, 不能留空格。

8_24第175页表/共16示4页 一个八进制数。
➢ ASCII的表示:有些值可以使用
第十六页,共164页。
➢ 逻辑常量只有两种取值情况: {TRUE}和{FALSE},注意带大 括号。
➢ 字符串常量为一个固定的字符 串,一般(yībān)用于程序运行时 的信息提示。
➢ 字符常量由单引号表示,包括C 语言中的转义字符,如’\n’。
常见的符号定义伪操作有如下(rúxià) 几种:
GBLA、GBLL、GBLS LCLA、LCLL和LCLS
第20页/共164页
SETA、SETL、SETS
第二十一页,共164页。
1. 全局变量声明(shēngmíng)GBLA、 GBLL和GBLS
格 式:GBLA(GBLL或GBLS)全局变量名 功 能:GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中
第3页/共164页
第四页,共164页。
4.1.1汇编语言(huì biān yǔ yán)的基本概念
第4页/共164页
第五页,共164页。
4.1.2汇编语言(huì biān y1.ǔ 汇yá编n语)源言(程huì序biā的n yǔ组yá成n)源程
序的结构
AREA Init,CODE, READONLY
LCLS Test6 ;定义一个局部的字符串变量,变量 名为Test6 Test6 SETS “Testing” ;将该变量赋值为“Testing”

ARM汇编语言程序设计

ARM汇编语言程序设计

ARM 指令系统
4.1.1 符号定义伪指令
常见的符号定义伪指令有如下几种:
— 用于定义全局变量的GBLA、GBLL和GBLS。 — 用于定义局部变量的LCLA、LCLL和LCLS。 — 用于对变量赋值的SETA、SETL、SETS。 — 为通用寄存器列表定义名称的RLIST。
1、 GBLA、GBLL和GBLS
表达式的值为当前数据域在内存表 中所占的字节数。
FIELD伪指令常与MAP伪指令配合使用来定义结
构 化 的 内 存 表 。 MAP 伪 指 令 定 义 内 存 表 的 首 地 址 , FIELD伪指令定义内存表中的各个数据域,并可以为 每个数据域指定一个标号供其他的指令引用。
注意 MAP和FIELD伪指令仅用于定义数据结
DCD(DCDU)用于分配一片连续的字存储单元并 用指定的数据初始化。
SPACE 用于分配一片连续的存储单元
MAP 用于定义一个结构化的内存表首地址
FIELD 用于定义一个结构化的内存表的数据域
1、 DCB(DCB也可用“=”代替)
语法格式: 标号 DCB 表达式
DCB伪指令用于分配一片连续的字节 存储单元并用伪指令中指定的表达式初 始化。其中,表达式可以为0~255的数 字或字符串。
HandleReserved # 4
HandleIRQ
#4
HandleFIQ
#4
ARM 指令系统
4.1.3 汇编控制伪指令
汇编控制伪指令用于控 制汇编程序的执行流程
常用的汇编控制伪指令包括 : — IF、ELSE、ENDIF — WHILE、WEND — MACRO、MEND — MEXIT
1 IF、ELSE、ENDIF (等价于[ | ] )

ARM汇编语言程序设计

ARM汇编语言程序设计

DCB
语法格式: {标号} DCB 体现式
体现式取值范围:-128~255旳数字或字符串。 DCB:“=”
Nullstring DCB “Null string”,0 ;构造一种以0结尾旳字符串
DCW(或DCWU)
语法格式: {标号} DCW(或DCWU) 体现式
DCW:半字对齐 DCWU:不严格半字对齐。 体现式取值范围:-32768~65535
SPACE objectsize
;全局旳数字变量objectsize ,为0 ;将该变量赋值为0xff ;引用该变量
statusB
GBLL statusB ;全局旳逻辑变量statusB ,为{False} SETL {TRUE} ;将该变量赋值为真
全局:作用范围为包括该变量旳源程序
LCLA、LCLL和LCLS
;包括源文件file1.s ;包括源文件file2.s ;包括源文件file3.s
伪指令
ADR ADRL LDR NOP
ADR-小范围旳地址读取伪指令
语法格式 ADR{cond} register, expr cond:可选旳指令执行条件 register:目旳寄存器 expr:基于PC或寄存器旳地址体现式,取值范围: 地址非字对齐,-255~255 地址字对齐,-1020~1020
{寄存器列表}
Context RLIST {r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context ,可在ARM指令 LDM/STM中经过该名称访问寄存器列表。排列顺序无 关
数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD

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

ARM实验二 C语言程序设计与调试实验

ARM实验二 C语言程序设计与调试实验

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

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

STR
R1, [R0]


END
在汇编程序中,用 AREA 指令定义一个段,并说明定义段的相关属性,本例中定义
了一个名为 Init 的代码段,属性为只读。ENTRY 伪指令标识程序的入口,程序的
末尾为 END 指令,该伪指令告诉编译器源文件的结束,每一个汇编文件都要以 END
结束。
下面是一个数据段的小例子
当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形
成一个可执行文件。可执行映像文件通常由以下几部分构成:
◆ 一个或多个代码段,代码段为只读属性。
◆ 零个或多个包含初始化数据的数据段,数据段的属性为可读写。
◆ 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位
实验二 ARM 汇编语言程序设计
一、实验目的
1. 了解 ARM 汇编语言的基本框架,学会使用 ARM 的汇编语言编程 2. 掌握 ARM 汇编指令
二、实验设备
1. EL-ARM-830 教学实验箱,PentiumII 以上的 PC 机,仿真器电缆。 2. PC 操作系统 WIN98 或 WIN2000 或 WINXP, ADS1.2 集成开发环境,仿真器驱动程序。
2
MOV sp,#0x400 blockcopy
MOVS r3,r2,LSR #3 BEQ copywords
STMFD sp!,{r4-r11} octcopy
LDMIA r0!,{r4-r11} STMIA r1!,{r4-r11} SUBS r3,r3,#1 BNE octcopy
LDMFD sp!,{r4-r11}
AREA DataArea, DATA, NOINIT, ALIGN=2
DISPBUF SPACE
Байду номын сангаас
200
RCVBUF
SPACE
200


DATA 为数据段的标识。
四、实验内容
1、理解下列程序,新建工程,加入下面的程序,并观察实验结果。 实验 A:
AREA EXAMPLE, CODE, READONLY x EQU 45 y EQU 64 stack_top EQU 0x1000
三、汇编语言简介
1. ARM 汇编的一些简要的书写规范
ARM 汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有
指令均不能顶格书写。ARM 汇编对标识符的大小写敏感,书写标号及指令时字母大
小写要一致。在 ARM 汇编中,ARM 指令、伪指令、寄存器名等可以全部大写或者全
部小写,但不要大小写混合使用。注释使用“;”号,注释的内容由“;”号起到此
行结束,注释可以在一行的顶格书写。
详细的汇编语句及规范请参照 ARM 汇编的相关书籍、文档。
2. ARM 汇编语言程序的基本结构
在 ARM 汇编语言程序中,是以程序段为单位来组织代码。段是相对独立的指令
或数据序列,具有特定的名称。段可以分为代码段的和数据段,代码段的内容为执
行代码,数据段存放代码运行时所需的数据。一个汇编程序至少应该有一个代码段,
copywords ANDS r2,r2,#7 BEQ stop
wordcopy LDR r3,[r0],#4 STR r3,[r1],#4 SUBS r2,r2,#1 BNE wordcopy
stop B stop
AREA Bdata, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ENTRY MOV sp,#stack_top MOV r0,#x ATR r0,[sp] MOV r0,#y LDR r1,[sp] ADD r0,r0,r1 STR r0,[sp] Stop B Stop END
实验 B AREA EXAMPLE, CODE, READONLY Num equ 20 start LDR r0, =src LDR r1, ==dst MOV r2, #Num
END
2、新建工程,并自行编写汇编程序,分别使用 LDR、STR、LDMIA、STMIA 操作,实现对 某段连续存储单元写入数据,并观察操作结果。
3
置。源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定
相同。
3. 简单的小例子
下面是一个代码段的小例子
AREA Init,CODE,READONLY
ENTRY
LDR
R0, =0x3FF5000
LDR
R1, 0x0f
STR
R1, [R0]
1
LDR
R0, =0x3F50008
LDR
R1, 0x1
相关文档
最新文档