收藏 分销(赏)

arm汇编编程(示例).doc

上传人:xrp****65 文档编号:7015817 上传时间:2024-12-24 格式:DOC 页数:49 大小:279KB 下载积分:10 金币
下载 相关 举报
arm汇编编程(示例).doc_第1页
第1页 / 共49页
arm汇编编程(示例).doc_第2页
第2页 / 共49页


点击查看更多>>
资源描述
一、arm的认知及基本概念 (一).arm的基本概念 1. 什么是arm arm是一家英国电子公司的名字,全名是Advanced RISC Machine 这家企业设计了大量高性能、廉价、耗能低的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内存 板载64MB SDRAM(标准配置), 32bit数据总线SDRAM时钟频率高达100MHz(支持运行133MHz) Nand Flash 板载64MB Nand Flash或256MB Nand Flash(标准配置) Nor Flash 板载2MB Nor Flash(最高可升级到8MB) CorePower 专业1.25V核心电压供电 Power 核心板采用3.3V供电 Powerled 核心板电源指示灯 核心板接口 接口型号为DC-2.0双列直插 SDRAM:随机存储器,普遍使用的内存。用作主存。 NOR Flash和 NAND Flash是现在市场上两种主要的非易失闪存。 NOR的特点是芯片内执行,应用程序可以直接在flash 闪存内运行,不必再把代码读到系统RAM中。 NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。 2.主板 电源 并口线 复位 RTC电源 RS232电平转换DB9插座 音频IIS,AC97 按键、PS/2与IC接口 数码管 触摸屏 以太网卡 主USB HUB 1转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位,每一位数据代表不同的状态。分为三个部分(条件代码标志位、控制位、保留区位) 31 32 29 28 .... 7 6 5 4 3 2 1 0 N Z C V I F T M4 M3 M2 M1 M0 其中N Z C V称为条件标志位(即保存的是条件的运算结果,真和假) N=1 表示运算结果为负数,N=0 表示运算结果为正数。 Z=1 表示运算结果为0, Z=0 表示运算结果为非零。 C=1 表示运算结果产生了进位。 V=1 运算结果的符号位发生了溢出。 这4个位的组合,代表了各种条件,如下: 0000 EQ Z置位 相等/等于0 0001 NE Z清0 不等 0010 CS/HS C置位 进位/无符号高于或等于 0011 CC/LO C清0 无进位/无符号低于 0100 MI N置位 负数 0101 PL N清0 非负数 0110 VS V置位 溢出 0111 VC V清0 无溢出 1000 HI C置位且Z清0 无符号高于 1001 LS C清0或Z置位 无符号低于或等于 1010 GE N等于V 有符号大于或等于 1011 LT N不等于V 有符号小于 1100 GT Z清0且N等于V 有符号大于 1101 LE Z置位或N不等于V 有符号小于或等于 1110 AL 任何状态 总是(always) 1111 NV 无 从不(never) IFT 称为控制位 I I=1 禁用IRO中断 F F=1 禁用FIQ中断 T 表示CPU当前的状态,1 代表正在Thumb指令集状态,0表示正在ARM指令集状态。 M0至M4表示中断类型(控制位内的模式位) 0b10000 User 用户中断 0b10001 FIQ 快速中断 0b10010 IRQ 声卡、调制解调器等外部设备产生的中断 0b10011 Supervisor 管理程序或监控程序产生的中断 0b10111 Abort 异常中断 0b11011 Undefined 未定义中断 0b11111 System 系统中断 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映象工程 ARM Executable Image 生成ELF格式映像(bin) ARM Object Library 生成armar格式目标库文件 Empty Project 创建不包含任何库或源文件的工程 Makefile Importer Wizard 用于Vc Thumb ARM Interworking Image 用于ARM 和thumb指令混合代码生成的ELF映像 Thumb Executable image 用thumb指令生成ELF格式映像 Thumb Object Library 用于Thumb指令的代码生成的armar格式文件 选 ARM Executable Image,工程文件名2440ART 加源文件 project -> Add Files 新建 填加已有 生成目标的配置 2440ART.mcp内双击 TargetSettins: post-linker选择ArM fromELF Language Settins:Architecture or Processor选择相应的编译器ARM920T Arm Linker:output 内RO 0x30000000 options内Image entry point 设为0x30000000 layout 内Object 2440init.o Section Init Listings 内Image map Arm fromELF: output format内 Plain binary output filename内***.bin 编译 make 调试 AXD是调试器 设置,debug ->打开AXD调试界面,选择option->config target 选项 选ARMUL(模拟调试器),然后选择确定.进入调试界面. ARMUL是虚拟调试环境(虚拟开发板) 如果用开发板真实环境调试,则需要使用JTAG连开发板后,在此处选H-JTAG 用file-<lode image项,加载刚才编译所的的 .axf调试文件. execute->run to cousor 项.使程序进入用户主程序 可以用F8来一条一条执行语句,也可用F10,可以设置断点. (五).汇编语言基本结构 例: AREA Init,CODE,READONLY ;AREA定义代码段,段名Init;代码段,只读 ENTRY ;伪操作,第一条指令的入口 Start ;标号,一段代码的开始,用于标记,无意义,必须顶格 MOV r0,#10 ;将10存入r0寄存器,整型常量前面用#号 MOV r1,#3 ;将3存入r1寄存器,r0和r1相当于两个变量,只是名称固定,在寄存器的存储空间内 ADD r0,r0,r1 ;将r0内数据与r1内数据相加,相加后数据放在r0内 ;Stop ;停止标号,下面的代码用于停止运行程序 ; MOV r0,#0x18 ;软件异常中断响应 ; LDR r1,=0x20026 ;ADP停止运行,应用退出 ; SWI 0x123456 ;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)数据段 AREA DATAAREA,DATA,BIINIT,ALLGN=2 DISPBUF SPACE 200 RCVBUF SPACE 200 DATA用以指明为数据段, SPACE分配200字节的存储单元并初始化为0 指令和伪操作在后面详细描述 3).汇编语言结构 [标号] [指令或伪操作] 所有标号必须在一行的顶格书写,其后不加冒号 所有指令均不能顶格写 指令助记符大小写敏感,不能大小写混合,只能全部大写或全部小写 ;为注释 @代码行注释,同; #整行注释或直接操作数前缀 \为换行符 ENTRY 为程序的入口 END 为程序的结束 //************************************* arm体系结构 第二天*************************************** 二、ARM的寻址方式 最简单的汇编指令格式是操作码和操作数 如:MOV r0,#10 操作码:即CPU指令 如MOV ADD 操作数:即表示数据是在寄存器中还是在内存中,是绝对地址还是相对地址 操作数部分要解决的问题是,到哪里去获取操作数,获取操作数的方式就是寻址方式。 ARM每一条指令都是32位机器码,对应CPU的位数 ARM指令格式: 在32位中分为7个位域,每个位域分别存储不同意义的编码(二进制数) 31 ~ 28 27~25 24 ~ 21 20 19~16 15~12 11 ~ 0 ----------------------------------------------------------- | Cond | 001 | Opcode | S | Rn | Rd | Operand2 | ----------------------------------------------------------- 对应输入的一条指令为: <Opcode>{<cond>}{s} <Rd>,<Rn>,<Operand2> Opcode:指令操作码 用 4个位存储,如MOV,ADD 每一个操作码和操作数最终都是以二进制形式存在 Cond :指令的条件码 用 4个位来储,可省略 如:ADD r0,r0,#1 ;计算r0加1后的值,再写入到r0内 ADDEQ r0,r0,#1 ;只有在CPSR寄存器条件标志位满足指定条件时,才计算r0加1后的值,再写入到r0内 其中条件助记符如下: EQ 相等 NE 不相等 MI 负数 VS 溢出 PL 正数或零 HI 无符号大于 LS 无符号小于或等于 CS 无符号大于或等于 CC 无符号小于 GT 有符号大于 GE 有符号大于或等于 LE 有符号小于或等于 LT 有符号小于 AL 无条件执行 S :决定指令的操作是否影响CPSR的值,用一个位存储,省略则表示为0值,否则为1值 如SUBS R0,R0,#1 ;R0减1,结果放入R0,同时响影CPSR的值 SUB R0,R0,#1 ;R0减1,结果放入R0,不影响CPSR的值 Rd :目标寄存器编码 用4位存储 Rn :第1个操作数的寄存器编码 用4位存储 Operand2: 第2个操作数 用12位存储 寻址方式:是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,共8种寻址方式: 寄存器寻址、立即寻址、寄存器间接寻址、基址寻址、多寄存器寻址、堆栈寻址、相对寻址、寄存器移位寻址 //*******寻址方式是重点 需要理解背讼************************************************* 1.立即寻址 操作数是常量,用#表示常量。例 MOV R0,#0xFF000 ;指令省略了第1个操作数寄存器。将立即数0xFF000(第2操作数)装入R0寄存器 SUB R0,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.寄存器寻址 操作数的值在寄存器中,指令执行时直接取出寄存器值来操作 例:MOV R1,R2 ;将R2的值存入R1 在第1个操作数寄存器的位置存放R2编码 SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0 在第2操作数位置,存放的是寄存器R2的编码 寄存器寻址是根据寄存器编码获取寄存器内存储的操作数 3.寄存器间接寻址 操作数从寄存器所指向的内存中取出,寄存地存储的是内存地址 例:LDR R1,[R2] ;将R2指向的存储单元的数据读出,保存在R1中 R2相当于指针变量 STR R1,[R2] ;将R1的值写入到R2所指向的内存 SWP R1,R1,[R2] ;将寄存器R1的值和R2指定的存储单元的内容交换 [R2]表示寄存器所指向的内存,相当于 *p LDR 指令用于读取内存数据 STR 指令用于写入内存数据 //----------------------------------------------------- 4.寄存器基址寻址 操作数从内存址偏移后读取数据。常用于查表、数组操作、功能部件寄存器访问等。 基址:相当于首地址,地址偏移后取值作为操作数 基址寄存器:用来存放基址的寄存器 变址寻址:基址寻址也称为变址寻址 1)前索引寻址 例:LDR R2,[R3,#4] ;读取R3+4地址上的存储单元的内容,放入R2 LDR R2,[R3,#4]! ;读取R3+4地址上的存储单元的内容,放入R2,然后R3内的地址变为R3+4,即R3=R3+4 [R3,#4] 表示地址偏移后取值,相当于*(p+4) 或 p[4],R3内保存的地址不变 [R3,#4]! 表示地址偏移后取值,相当于*(p+4) 或 p[4],!表示回写,即R3=R3-4 ,R3的值发生了改变 2)后索引寻址 例:LDR R2,[R3],#4 ;先读取R3地址上的存储单元的内容,放入R2,然后R3内的地址变为R3+4,即R3=R3+4 [R3],#4 类似于 *p++ 只不过自加的不是1 ,而是指定的4 [R3,#4]! 类似于 *++p 只不过自加的不是1,而是指定的4 3)寄存器的值作索引 例:LDR R2,[R3,R0] ;R0内存储索引值,R3内存地址,读取R3+R0地址上的存储单元的内容,放入R2 [R3,R0] 表示地址偏移后取值,相当于*(p+i) 或 p[i] 5.多寄存器寻址 一次可传送多个寄存器的值,也称为块拷贝寻址
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服