arm汇编编程示例.docx
- 文档编号:12505657
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:84
- 大小:55.08KB
arm汇编编程示例.docx
《arm汇编编程示例.docx》由会员分享,可在线阅读,更多相关《arm汇编编程示例.docx(84页珍藏版)》请在冰豆网上搜索。
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的应用范围:
工业控制:
如机床、自动控制等
无线通信:
如手机
网络应用:
如
电子产品:
如音视频播放噐、机顶盒、游戏机、数码相机、打印机
其它各领域:
如军事、医疗、机器人、智能家居等
4.计算机体系结构
见图:
冯.诺依曼计算机体系图
冯.诺依曼体系结构
处理器使用同一个存储器,经由同一个总线传输
完成一条指令需要3个步骤:
即取指令->指令译码->执行指令
指令和数据共享同一总线的结构
哈佛体系结构
将程序指令存储和数据存储分开
中央处理器首先到程序指令存储器中读取程序指令。
解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令
程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。
5.复杂指令集与精简指令集
CISC复杂指令集:
采用冯.诺依曼体系结构。
数据线和指令线分时复用(只能通过一辆车)。
存储器操作指令多汇编程序相对简单指令结束后响应中断CPU电路丰富面积大功耗大
RISC精简指令集:
采用哈佛体系结构。
数据线和指令线分离(同时能通过多辆车)。
对存储器操作有限汇编程序占空间大在适当地方响应中断CPU电路较少体积小功耗低
ARM采用RISC精简指令集
Thumb是ARM体系结构中一种16位的指令集。
从ARMv4T之后,的ARM处理器有一种16-bit指令模式,叫做Thumb,较短的指令码提供整体更佳的编码密度,更有效地使用有限的内存带宽。
所有ARM9和后来的家族,包括XScale都纳入了Thumb技术。
即ARM有两种指令集:
RISC、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种运行模式:
用户:
正常程序工作模式,不能直接切换到其它模式
系统:
用于支持操作系统的特权任务,可以直接切换到其它模式
快中断:
支持高速数据传输及通道处理,FIQ异常响应时进入此模式
中断:
用于通用中断处理,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个位的组合,代表了各种条件,如下:
0000EQZ置位相等/等于0
0001NEZ清0不等
0010CS/HSC置位进位/无符号高于或等于
0011CC/LOC清0无进位/无符号低于
0100MIN置位负数
0101PLN清0非负数
0110VSV置位溢出
0111VCV清0无溢出
1000HIC置位且Z清0无符号高于
1001LSC清0或Z置位无符号低于或等于
1010GEN等于V有符号大于或等于
1011LTN不等于V有符号小于
1100GTZ清0且N等于V有符号大于
1101LEZ置位或N不等于V有符号小于或等于
1110AL任何状态总是(always)
1111NV无从不(never)
IFT称为控制位
II=1禁用IRO中断
FF=1禁用FIQ中断
T表示CPU当前的状态,1代表正在Thumb指令集状态,0表示正在ARM指令集状态。
M0至M4表示中断类型(控制位内的模式位)
0b10000User用户中断
0b10001FIQ快速中断
0b10010IRQ声卡、调制解调器等外部设备产生的中断
0b10011Supervisor管理程序或监控程序产生的中断
0b10111Abort异常中断
0b11011Undefined未定义中断
0b11111System系统中断
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选择相应的编译器ARM920T
ArmLinker:
output内RO0x30000000
options内Imageentrypoint设为0x30000000
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)寄存器: 如R0、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体系结构第二天*************************************** 二、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| ----------------------------------------------------------- 对应输入的一条指令为: 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有符号大于 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个操作数寄存器的位置存放R2编码 SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0在第2操作数位置,存放的是寄存器R2的编码 寄存器寻址是根据寄存器编码获取寄存器内存储的操作数 3.寄存器间接寻址 操作数从寄存器所指向的内存中取出,寄存地存储的是内存地址
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arm 汇编 编程 示例