arm汇编编程示例.docx

上传人:b****6 文档编号:14192005 上传时间:2023-06-21 格式:DOCX 页数:83 大小:51.61KB
下载 相关 举报
arm汇编编程示例.docx_第1页
第1页 / 共83页
arm汇编编程示例.docx_第2页
第2页 / 共83页
arm汇编编程示例.docx_第3页
第3页 / 共83页
arm汇编编程示例.docx_第4页
第4页 / 共83页
arm汇编编程示例.docx_第5页
第5页 / 共83页
arm汇编编程示例.docx_第6页
第6页 / 共83页
arm汇编编程示例.docx_第7页
第7页 / 共83页
arm汇编编程示例.docx_第8页
第8页 / 共83页
arm汇编编程示例.docx_第9页
第9页 / 共83页
arm汇编编程示例.docx_第10页
第10页 / 共83页
arm汇编编程示例.docx_第11页
第11页 / 共83页
arm汇编编程示例.docx_第12页
第12页 / 共83页
arm汇编编程示例.docx_第13页
第13页 / 共83页
arm汇编编程示例.docx_第14页
第14页 / 共83页
arm汇编编程示例.docx_第15页
第15页 / 共83页
arm汇编编程示例.docx_第16页
第16页 / 共83页
arm汇编编程示例.docx_第17页
第17页 / 共83页
arm汇编编程示例.docx_第18页
第18页 / 共83页
arm汇编编程示例.docx_第19页
第19页 / 共83页
arm汇编编程示例.docx_第20页
第20页 / 共83页
亲,该文档总共83页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

arm汇编编程示例.docx

《arm汇编编程示例.docx》由会员分享,可在线阅读,更多相关《arm汇编编程示例.docx(83页珍藏版)》请在冰点文库上搜索。

arm汇编编程示例.docx

arm汇编编程示例

一、arm的认知及基本概念

(一).arm的基本概念

1.什么是arm

arm是一家英国电子公司的名字,全名是AdvancedRISCMachine

这家企业设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器,ARM公司只设计芯片而不生产,它将

技术授权给世界上许多公司和厂商。

目前采用arm技术知识产权内核的微处理器,即通常所说的arm微处理器

所以arm也是对一类微处理器的通称。

arm指令集体系版本号(软件)为V1~V7目前V1~V3已很少见。

从V4版不再与以前的版本兼容。

arm的CPU系列(硬件)主要有ARM7~ARM11

2.典型的嵌入式处理器

arm占市场79.5%ARM

mips占市场13.9%MIPS

microSPARC占市场3.1%SUN

PowerPc占市场2.8%IBM

其它占市场0.8%

3.arm的应用范围:

工业控制:

如机床、自动控制等

无线通信:

如手机

网络应用:

如电子产品:

如音视频播放噐、机顶盒、游戏机、数码相机、打印机

其它各领域:

如军事、医疗、机器人、xx等

4.计算机体系结构

见图:

xx.xx计算机体系图

xx.xx体系结构

处理器使用同一个存储器,经由同一个总线传输

完成一条指令需要3个步骤:

即取指令->指令译码->执行指令

指令和数据共享同一总线的结构

哈佛体系结构

将程序指令存储和数据存储分开

中央处理器首先到程序指令存储器中读取程序指令。

解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令

程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。

5.复杂指令集与精简指令集

CISC复杂指令集:

采用冯.诺依曼体系结构。

数据线和指令线分时复用(只能通过一辆车)。

存储器操作指令多汇编程序相对简单指令结束后响应中断CPU电路丰富面积大功耗大

RISC精简指令集:

采用哈佛体系结构。

数据线和指令线分离(同时能通过多辆车)。

对存储器操作有限汇编程序占空间大在适当地方响应中断CPU电路较少体积小功耗低

ARM采用RISC精简指令集

Thumb是ARM体系结构中一种16位的指令集。

从ARMv4T之后,的ARM处理器有一种16-bit指令模式,叫做Thumb,较短的指令码提供整体更佳的编码密度,更有效地使用有限的内存带宽。

所有ARM9和后来的家族,包括XScale都纳入了Thumb技术。

即ARM有两种指令集:

RIS

C、Thumb

6.arm的思想

1)arm体系的总思想:

在不牺牲性能的同时,尽量简化处理器。

同时从体系结构上灵活支持处理器扩展。

采用RISC结构。

RISC处理器简化了处理器结构,减少复杂功能指令的同时,提高了处理器速度。

ARM及MIPS都是典型的RISC处理器

2)arm的流水线结构

arm处理器使用流水线来增加处理器指令流的速度,这样可以使几个操作同时进行。

并使处理和存储器系统连续操作。

arm处理器分为三级:

取指->译码->执行

取指:

指令从存储器中取出

译码:

对指令使用的寄存器进行译码

执行:

从寄存器组中读取寄存器,执行移位和ALU操作,寄存器被写回到寄存器组中

3)ARM处理器支持的类型

字节8位

半字16位

字32位

**所有数据操作都以字为单位

**ARM指令的长度刚好是一个字,Thumb指令长度刚好是半个字

4)ARM处理器状态

ARM处理器内核使用ARM结构,该结构包含32位的ARM指令集和16位Thumb指令集,因此ARM有两种操作状态

ARM状态:

32位

Thumb状态:

16位

5)处理器模式

ARM处理器共有7种运行模式:

用户:

正常程序工作模式,不能直接切换到其它模式

系统:

用于支持操作系统的特权任务,可以直接切换到其它模式

快xx:

支持高速数据传输及通道处理,FIQ异常响应时进入此模式

xx:

用于通用中断处理,IRQ异常响应时进入此模式

管理:

操作系统保护代码,系统复位和软件中断响应时进入此模式

中止:

用于支持虚拟内存或存储器保护,用于MMU

未定义:

支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式。

(二)、经典平台硬件组成

见图:

arm硬件组成图

开发板一般是由一块组成的,有核心器件和外围器件接口等,但是有的是由两块板子组成,主版和核心板,主版上主要是外围接口,外围器件等,核心板上主要是核心器件,还有一些晶振电路等

1.核心板(天嵌2440)

CPU处理器S3C2440AL,主频400MHz(最高可达533MHz)

SDRAM内存板载64MBSDRAM(标准配置),32bit数据总线SDRAM时钟频率高达100MHz(支持运行133MHz)

NandFlash板载64MBNandFlash或256MBNandFlash(标准配置)

NorFlash板载2MBNorFlash(最高可升级到8MB)

CorePower专业1.25V核心电压供电

Power核心板采用3.3V供电

Powerled核心板电源指示灯

核心板接口型号为DC-2.0双列直插

SDRAM:

随机存储器,普遍使用的内存。

用作主存。

NORFlash和NANDFlash是现在市场上两种主要的非易失闪存。

NOR的特点是芯片内执行,应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。

NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。

2.主板

电源

并口线

复位

RTC电源

RS232电平转换DB9插座

音频IIS,AC97

按键、PS/2与IC接口

数码管

触摸屏

以太网卡

主USBHUB1转4

3.寄存器

见图:

ARM模块和内核框图

寄存器是中央处理器内的组成部份。

寄存器是有限存贮容量的高速存贮部件,用来暂存指令、数据和位址。

在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。

在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。

IR用于存储指令

PC用于存储程序运行的地址(即当前指令在内存中的位置)

寄存器是由一个指令的输出或输入可以直接索引到的暂存器群组。

所有的计算机指令都是进入寄存器后被直接读取

ARM的汇编编程,本质上就是针对CPU寄存器的编程。

//*******重点需要背讼*************************************************ARM寄存器分为2类:

普通寄存器和状态寄存器

(1)通用寄存器和计数器:

共32个,15个通用寄存器

R0-R7未备份寄存器

R0(a1)R1(a1)R2(a3)R3(a4)R4(v1)R5(v2)R6(v3)R7(v4)

R8-R12备份寄存器

R8(v5)R9(SB,v6)R10(SL,v7)R11(EP,v8)R12(IP)数据寄存器R15(PC)程序计数器它的值是当前正在执行的指令在内存中的位置。

当指令执行结束后,CPU会自动将PC值加上一个单位,PC值指向下一条即将执行的指令的地址

如果通过汇编指令对PC寄存器赋值,就会完成一次程序的跳转(如从子函数跳转回主函数内)

R14(LR)链接寄存器存放子程序的返回地址

例如:

在主函数内,如果调用子函数,程序会进入到子函数内执行。

当子函数执行完毕后,需要回到

主函数内,所以,在子函数调用前需要将这个地址先保存起来,否则无法找到这个地址。

LR用于保存这个地址,这个地址也称为子程序返回地址。

当子函数结束后,再将LR内的地址赋给PC即可。

如果子程序再调用孙程序,LR如何保存地址呢?

先把当前LR内的值压入内存的栈区,然后LR再保存孙程序的返回地址。

当孙程序执行完后通过PC跳转到

子程序内,此时将栈区内的子程序返回地址取出保存在LR内。

当子程序执行完后,再通过PC跳转到主函数内。

R13(SP)栈指针寄存器用于存放堆栈的栈顶地址。

SP相当于指针变量,保存的是栈顶的地址,出栈时,从SP指向的内存中取出数据,入栈时将新的内存地址

压入栈顶,而SP相当于链表的头指针(head)。

原则上说R0-R12可以保存任何数据。

其中R0-R7用来临时存储数据,R8-R12系统没有用来做任何特殊用途,常用于中断

而在汇编与C语言的交互中,定制了ATPCS标准

寄存器:

R4-R11用来保存局部变量

参数:

参数小于等于4,用R0-R3保存参数,参数多于4,剩余的传入堆栈函数返回:

结果为32位整数,通过R0返回

结果为64位整数,通过R0,R1返回

对于位数更多的结果,通过内存传递

(2)状态寄存器:

状态寄存器用于保存程序的当前状态

CPSR当前程序状态寄存器

一个寄存器为32位,每一位数据代表不同的状态。

分为三个部分(条件代码标志位、控制位、保留区位)

31322928....76543210

NZCVIFTM4M3M2M1M0

其中NZCV称为条件标志位(即保存的是条件的运算结果,真和假)

N=1表示运算结果为负数,N=0表示运算结果为正数。

Z=1表示运算结果为0,Z=0表示运算结果为非零。

C=1表示运算结果产生了进位。

V=1运算结果的符号位发生了溢出。

这4个位的组合,代表了各种条件,如下:

00EQZ置位相等/等于001NEZ清0不等进位/无符号无进位/无符负数非负数溢出无溢出0010CS/HS

高于或等于

0011CC/LO

号低于

0100MI

01PL

0110VS

0111VC

1000HI

1001LS于10GE于1011LT

1100GT

1101LE

1110AL

11NVC置位

C清0

N置位

N清0

V置位

V清0

C置位且Z清0

C清0或Z置位

N等于V无符号高于无符号低于或等有符号大于或等有符号小于有符号大于N不等于V

Z清0且N等于V

Z置位或N不等于V有符号小于或等于任何状态总是(always)无从不(never)

IFT称为控制位

II=1禁用IRO中断

FF=1禁用FIQ中断

T表示CPU当前的状态,1代表正在Thumb指令集状态,0表示正在ARM指令集状态。

M0至M4表示中断类型(控制位内的模式位)

0b100User用户中断

0b10001FIQ快速中断

0b10010IRQ声卡、调制解调器等外部设备产生的中断

0b10011Supervisor管理程序或监控程序产生的中断0b10111Abort异常中断

0b11011Undefined未定义中断

0b111System系统中断

SPSR保存的程序状态寄存器,结构与CPSR完全一样,用来保存CPSR的值。

以便出现异常时恢复CPSR的值

(3)流水线对pc值的影响

CPU内部的组成部分:

指令寄存器,指令译码器,指令执行单元(包括ALU和通用寄存器组)

CPU执行指令的步骤:

取指->译码->执行

取指:

将指令从内存或指令cache中取入指令寄存器

译码:

指令译码器对指令寄存器中的指令进行译码操作,辨识add,或是sub等操作

执行:

指令执行单元根据译码的结果进行运算并保存结果

流水线操作:

并发多条流水线(以3条为例)

1取指译码执行

2取指译码执行

3取指译码执行

提高时间效率

(三)、学习内容

1.汇编(对裸板机的控制,以及驱动程序控制)

2.内核移植(uboot移植、内核编译、文件系统移植、应用程序移植)

3.驱动程序编写

//^^^^^^^^^^^^^^^^^^^^^^^^^^下午^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(四)、ADS的使用

ADS是汇编或C语言编译调试工具

可生成的文件:

.axf含调试信息的可执行ELF文件

.bin可烧写的二进制映像文件

.hex可烧写的十六进制映像文件

ADS配置

在磁盘中新建一个目录D:

\arm,用来存储所写的代码

点击目录:

File->new,创建一个可执行的ARM映象工程

ARMExecutableImage生成ELF格式映像(bin)

ARMObjectLibrary生成armar格式目标库文件

EmptyProject创建不包含任何库或源文件的工程

MakefileImporterWizard用于Vc

ThumbARMInterworkingImage用于ARM和thumb指令混合代码生成的ELF映像

ThumbExecutableimage用thumb指令生成ELF格式映像

ThumbObjectLibrary用于Thumb指令的代码生成的armar格式文件选ARMExecutableImage,工程文件名2440ART

加源文件

project->AddFiles

新建

填加已有

生成目标的配置

2440ART.mcp内双击

TargetSettins:

post-linker选择ArMfromELF

LanguageSettins:

ArchitectureorProcessor选择相应的编译器ARM920TArmLinker:

output内RO0x30000

options内Imageentrypoint设为0x30000

layout内Object2440init.oSectionInit

Listings内Imagemap

ArmfromELF:

outputformat内Plainbinary

outputfilename内***.bin

编译

make

调试AXD是调试器

设置,debug->打开AXD调试界面,选择option->configtarget选项选ARMUL(模拟调试器),然后选择确定.进入调试界面.ARMUL是虚拟调试环境(虚拟开发板)

如果用开发板真实环境调试,则需要使用JTAG连开发板后,在此处选H-JTAG

用file-

execute->runtocousor项.使程序进入用户主程序

可以用F8来一条执行语句,也可用F10,可以设置断点.

(五).汇编语言基本结构

例:

AREAInit,CODE,READONLY;AREA定义代码段,段名Init;代码段,只读ENTRY;伪操作,第一条指令的入口

Start;标号,一段代码的开始,用于标记,无意义,必须顶格

MOVr0,#10;将10存入r0寄存器,整型常量前面用#号MOVr1,#3;将3存入r1寄存器,r0和r1相当于两个变量,只是名称固定,在寄存器的存储空间内

ADDr0,r0,r1;将r0内数据与r1内数据相加,相加后数据放在r0内

;Stop;停止标号,下面的代码用于停止运行程序;MOVr0,#0x18;软件异常中断响应

;LDRr1,=0x20026;ADP停止运行,应用退出

;SWI0x123456;ARM半主机软件中断

END

1).基本概念

(2)寄存器:

如R

0、R1等

ARM的汇编编程,本质上就是针对CPU寄存器的编程。

(3)指令:

即操作码,直接控制CPU,如MOV

包括跳转指令、数据处理指令、乘法指令、PSR访问指令、加载或存储指令、数据交换指令、移位指令等

(4)伪操作:

作用于编译器,大多用于定义和控制。

如AREA

包括符号定义、数据定义、控制等

(5)标号:

仅是一种标识。

在跳转语句中,可以指向要跳转到的标识号位置

在ARM汇编中,标号代表一个地址,段内标号的地址在汇编时确定,段外标号的地址值在连接时确定

(6)符号:

即标号(代表地址)、变量名、数字常量名等。

符号的命名规则如下:

a.符号由大小写字母、数字以及下划线组成;

b.除局部标号以数字开头外,其它的符号不能以数字开头;

c.符号区分大小写,且所有字符都是有意义的;

d.符号在其作用域范围你必须是唯一的;

e.符号不能与系统内部或系统预定义的符号同名;

f.符号不要与指令助记符、伪指令同名。

2).段定义

在汇编语言中,以相对独立的指令或数据序列的程序段组成程序代码

段的划分:

数据段、代码段。

一个汇编程序至少有一个代码段

(1)代码段

上面的例子为代码段。

AREA定义一个段,并说明所定义段的相关属性,CODE用以指明为代码段ENTRY标识程序的入口点。

END为程序结束。

(2)数据段

AREADATAAREA,DATA,BIINIT,ALLGN=2

DISPBUFSPACE200

RCVBUFSPACE200

DATA用以指明为数据段,

SPACE分配200字节的存储单元并初始化为0

指令和伪操作在后面详细描述

3).汇编语言结构

[标号][指令或伪操作]

所有标号必须在一行的顶格书写,其后不加冒号

所有指令均不能顶格写

指令助记符大小写敏感,不能大小写混合,只能全部大写或全部小写

;为注释

@代码行注释,同;

#整行注释或直接操作数前缀

\为换行符

ENTRY为程序的入口

END为程序的结束

//*************************************

***************************************

二、ARM的寻址方式

最简单的汇编指令格式是操作码和操作数

如:

MOVr0,#10

操作码:

即CPU指令如MOVADD

操作数:

即表示数据是在寄存器中还是在内存中,是绝对地址还是相对地址

操作数部分要解决的问题是,到哪里去获取操作数,获取操作数的方式就是寻址方式。

ARM每一条指令都是32位机器码,对应CPU的位数

ARM指令格式:

在32位中分为7个位域,每个位域分别存储不同意义的编码(二进制数)31~2827~2524~212019~1615~1211~0

-----------------------------------------------------------

|Cond|001|Opcode|S|Rn|Rd|Operand2|

-----------------------------------------------------------

对应输入的一条指令为:

{}{s},,

Opcode:

指令操作码用4个位存储,如MOV,ADD每一个操作码和操作数最终都是以二进制形式存在

Cond:

指令的条件码用4个位来储,可省略

如:

ADDr0,r0,#1;计算r0加1后的值,再写入到r0内

ADDEQr0,r0,#1;只有在CPSR寄存器条件标志位满足指定条件时,才计算r0加1后的值,再写入到r0内

其中条件助记符如下:

EQ相等

NE不相等

MI负数

VS溢出

PL正数或零

HI无符号大于

LS无符号小于或等于

CS无符号大于或等于

CC无符号小于

GT有符号大于arm体系结构第二天GE有符号大于或等于

LE有符号小于或等于

LT有符号小于

AL无条件执行

S:

决定指令的操作是否影响CPSR的值,用一个位存储,省略则表示为0值,否则为1值

如SUBSR0,R0,#1;R0减1,结果放入R0,同时响影CPSR的值SUBR0,R0,#1;R0减1,结果放入R0,不影响CPSR的值Rd:

目标寄存器编码用4位存储

Rn:

第1个操作数的寄存器编码用4位存储

Operand2:

第2个操作数用12位存储

寻址方式:

是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,共8种寻址方式:

寄存器寻址、立即寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、相对寻址、寄存器移位寻址

//*******寻址方式是重点需要理解背讼*************************************************

1.立即寻址

操作数是常量,用#表示常量。

MOVR0,#0xFF000;指令省略了第1个操作数寄存器。

将立即数0xFF000(第2操作数)装入R0寄存器

SUBR0,R0,#64;R0减64,结果放入R0

#表示立即数0x或&表示16进制数否则表示十进制数

立即数寻址指令中的地址码就是操作数本身,可以立即使用的操作数。

其中,#0xFF000和#64都是立即数。

该立即数位于32位机器码中,占低位的12位。

也就是说在ARM指令中以12位存储一个数据

那么,32位的数据(long或float)如何存储?

32位的数据以一种特殊的方式来处理

其中:

高4位表示的无符号整数

低8位补0扩展为32位,然后循环右移x位来代表一个数。

x=高4位整数*2所以,不是每一个32位数都是合法的立即数,只有能通过上述构造得到的才是合法的立好数。

如:

合法立即数:

0xff,0x104,0xff0

不合法立即数:

ox101,0x102,0xff1

2.寄存器寻址

操作数的值在寄存器中,指令执行时直接取出寄存器值来操作

例:

MOVR1,R2;将R2的值存入R1在第1个操作数寄存器的位置存5.多寄存器寻址

一次可传送多个寄存器的值,也称为块拷贝寻址

例:

LDMIAR1!

{R2-R7,R12};将R1指向的存储单元中的数据读写到R2~R

7、R12中,然后R1自加1

STMIAR1!

{R2-R7,R12};将寄存器R2~R

7、R12的值保存到R1指向的存储单元中,然后R1自加1

其中R1是基址寄存器,用来存基址,R2-R

7、R12用来存数据赋值编号小的寄存器与低地址相对应,与寄存器列表顺序无关

!

为可选后缀,表示改变R1的值,则当数据传送完毕之后,将最后的地址写入基址寄存器

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

这里R1没有写成[R1]!

,是因为这个位不是操作数位,而是寄存器位LDMIA和STMIA是块拷贝指令,LDMIA是从R1所指向的内存中读数据,STMIA是向R1所指向的内存写入数据

R1指向的是连续地址空间

6.寄存器堆栈寻址

是按特定顺序存取存储区,按后进先出原则,使用专门的寄存器SP(堆栈指针)指向一块存储区

例:

LDMIASP!

{R2-R7,R12};将栈内的数据,读写到R2~R

7、R12中,然后下一个地址成为栈顶

STMIASP!

{R2-R7,R12};将寄存器R2~R

7、R12的值保存到SP指向的栈中SP指向的是栈顶

7.相对寻址

即读取指令本身在内存中的地址。

是相对于PC内指令地址偏移后的地址。

由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。

例:

BLOOP;B指令用于跳转到标号LOOP指令处执行代码

...

LOOP

MOVR6#1

其中LOOP仅仅是标号,而不是地址,不是CPU指令,所以在指令的机器码中没有标号的机器

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2