欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    四ARM指令集ppt课件.ppt

    • 资源ID:3187859       资源大小:1.06MB        全文页数:106页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    四ARM指令集ppt课件.ppt

    嵌入式系统设计与实例开发 基于32位微处理器与实时操作系统 第四讲 ARM指令集与编程 北京航空航天大学 机器人研究所 王田苗 魏洪兴,指令长度,指令集可以是以下任一种 32 bits 长 (ARM状态) 16 bits 长 (Thumb 状态) ARM7TDMI 支持3种数据类型 字节 (8-bit) 半字 (16-bit) 字 (32-bit) 字必须被排成4个字节边界对齐,半字必须被排列成2个字节边界对齐,ARM 指令集的特点,向后兼容:新版本增加指令,并保持指令向后兼容; Load-store 结构* load/store 从存储器中读某个值,操作完后再将其放回存储器中 只对存放在寄存器的数据进行处理; 对于存储器中的数据,只能使用load/store指令进行存取,指令格式,指令格式 3 地址指令格式 在ARM状态中使用 例,ARM 指令分类,数据处理指令 使用和改变寄存器的值 数据传送指令 把存储器的值拷贝到寄存器中 (load) or 把寄存器中的值拷贝到存储器中(store) 控制流指令 分支 分支和链接, 保存返回的地址,以恢复最先的次序 软件中断指令 程序状态寄存器指令 协处理器指令,ARM指令编码格式,说明 Cond 指令执行的条件编码 Opcode 指令操作符编码 S 决定指令的操作是否影响CPSR的值 Rd 操作目标寄存器编码 Rn 包含第一操作数的寄存器编码 Shifter_operand 表示第二操作数,31 28 27 25 24 21 20 19 16 15 12 11 8 7 0,ARM指令集,数据处理指令 - 1,数据处理指令的类别 算术操作 按位逻辑操作 寄存器移位操作 比较操作 操作数: 32-bits 宽; 有3种指定操作数的方式 来自寄存器 第二操作数可以是常数(立即数) 移位寄存器操作数 结果: 32-bits 宽, 放在寄存器中 长乘法产生64位结果,数据处理指令 2*,数据处理指令 - 3,数据处理指令 - 4,算术操作,按位逻辑操作,寄存器移位,比较操作,数据处理指令 - MOV,MOV指令是把一个数N送到目标寄存器中,N可以是寄存器,也可以是立即数。 MOV指令语法: 指令cond S Rd, N 例:PRE r0= 5 , r2=6 MOV r0, r2 POST r0=6 ,r2=6,桶形移位器,桶形移位器的使用,PRE r0=8, r2=5 MOV r0 ,r2, LSL #2(逻辑左移两位:r22=r5*4) POST r0=20, r2=5,数据处理指令,移位操作 在任何数据处理指令中,第二个寄存器操作数可以有应用该操作数的移位操作. 逻辑移位 LSL:逻辑左移 字的最小位空位清零 LSR:逻辑右移字的最大位空位清零.,桶形移位器操作,LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。 LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。 ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是带符号数,在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0。若源操作数为负数,则字的高端空出的位补1。 ROR:循环右移(Rotate Right)。从字的最低端移出的位填入字的高端空出的位。 RRX:扩展为1的循环右移(Rotate Right Extended by 1 place)。操作数右移一位,空位(位31)用原C标志填充。,数据处理指令 - 7,移位操作 (contd) 算术移位 ASR: = LSR ASL: 算术左移 循环移位: ROR, RRX,数据处理指令,立即数操作: 移位寄存器操作数 第二个操作数在与第一个操作数合成之前,是服从于移位操作的.,条件码标志,任何数据处理指令都可以设置条件码 (N, Z, V, and C) 适用于除比较操作外的所有数据处理指令 特殊的请求必须在汇编语言中实现,这种请求是通过把”S”增加到选择代码中指定的 算术操作设置所有的标志位 (N, Z, C, and V) 逻辑和移位操作设置 N and Z 当无移位操作时,保存V和C,或根据移位操作设置,ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的。 这样可以提高代码密度,减少分支跳转指令数目,提高性能。 CMP r3,#0 CMP r3,#0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2 skip 默认情况下,数据处理指令不影响程序状态寄存器的条件码标志位,但可以选择通过添加“S”来影响标志位。 CMP不需要增加 “S”就可改变相应的标志位。 loop SUBS r1,r1,#1 BNE loop,条件执行及标志位*,Condition Codes,下表为所有可能的条件码: 注意:AL为默认状态,不需要单独指出,条件执行示例,一系列的指令都使用条件指令 if (a=0) func(1); CMP r0,#0 MOVEQ r0,#1;把func()函数的参数赋给r0 BLEQ func 置标志位,再使用不同的条件码 if (a=0) x=0 ;r0:a,r1:x if (a0) x=1; CMP r0,#0 MOVEQ r1,#0 MOVGT r1,#1 使用条件比较指令 if (a=4 | a=10) x=0; CMP r0,#4 CMPNE r0,#10 MOVEQ r1,#0,条件执行,所有的ARM指令都可以条件执行 指令的执行与否取决于CPSR寄存器的N, Z, C and V标志位 所有的Thumb指令都可以解压成全部条件指令 Condition Field in instruction 0000 = EQ - Z set (equal) 0001 = NE - Z clear (not equal) 0010 = CS - C set (unsigned higher or same) 0011 = CC - C clear (unsigned lower) 0100 = MI - N set (negative) 0101 = PL - N clear (positive or zero) 0110 = VS - V set (overflow) 0111 = VC - V clear (no overflow) 1000 = HI - C set and Z clear (unsigned higher) 1001 = LS - C clear or Z set (unsigned lower or same) 1010 = GE - N set and V set, or N clear and V clear (greater or equal) 1011 = LT - N set and V clear, or N clear and V set (less than) 1100 = GT - Z clear, and either N set and V set, or N clear and V clear (greater than) 1101 = LE - Z set, or N set and V clear, or N clear and V set (less than or equal) 1110 = AL - always 1111 = NV - never,乘法指令集,在寄存器产生32位值,乘法,例子 (乘法, 乘法累加器) 注意 最低 32-bits 置于结果寄存器中,其余被忽略 不支持第二立即操作数 结果寄存器与源寄存器必须不同 if S bit is set the V is preserved and the C is rendered meaningless,数据传送指令 - 1,单指令传送 (LDR, STR) 单字(32bit), 半字(6 bit) 以及字节(8 bit) 传送 寻址 寄存器偏移 地址 =基址 寄存器偏移 立即数偏移 地址 = 基址 立即数常数 后变址Post-indexing: modify address after use 前变址Pre-indexing: modify address before use 回写 如果可能,更新基址寄存器,单寄存器传送指令,寻址方式,例子,PRE r0=0x00000000, r1=0x00009000, Mem320x00009000=0x01010101 Mem320x00009004=0x02020202 回写型前变址寻址: LDR r0, r1, #0x4! POST r0=0x02020202, r1=0x00009004 前变址寻址: LDR r0, r1,#0x4 POST r0=0x02020202, r1=0x00009000 后变址寻址: LDR r0, r1 ,#0x4 POST r0=0x01010101, r1=0x00009004,数据传送指令 - 5,多寄存器数据传送指令 - LDM,多数据传送指令 (LDM, STM) load (LDM) 或 store (STM) 当前可访问寄存器的任意子集 使用 堆栈: maintaining full or empty stacks which can grow up or down memory 上下文切换: 保存或重新存储工作寄存器 块拷贝:在主存储器中移动大数据块 寻址 Pre/Post indexing Auto increment or decrement 回写到基址寄存器Write back the base register,多寄存器数据传送指令的要点,多寄存器Load/Store指令会增加中断的延迟,因为ARM不会打断正在执行的指令去响应中断,而必须等到指令执行完成; 一般编译器将提供一个选项以控制Load/Store指令可以传送的最大寄存器数目,以限制最大中断延迟。,多寄存器传送指令的寻址模式,注:!决定Rn的值是否随着传送而改变,例子,要求:保存r1r3到内存地址0x90000x900c,并且更新基址寄存器r4 PRE: r1=0x00000001, r2=0x00000002, r3=0x00000003, r4=0x9000 执行操作: STMIA r4!, r1, r2, r3(执行后增加) POST: mem320x9000=0x00000001 mem320x9004=0x00000002 mem320x9008=0x00000003 r4=0x900c,多寄存器传送寻址模式,r5,r1,r9,r0,r9,STMIA r9!, r0,r1,r5,1000,16,100c,16,1018,16,r1,r5,r9,STMDA r9!, r0,r1,r5,r0,r9,1000,16,100c,16,1018,16,r5,r9,STMDB r9!, r0,r1,r5,r1,r0,r9,1000,16,100c,16,1018,16,r5,r1,r0,r9,r9,STMIB r9!, r0,r1,r5,1000,16,100c,16,1018,16,例1:将存储器中的连续数据装载到寄存器,PRE mem320x80018=0x03, mem320x80014=0x02, mem320x80010=0x01, r0=0x00080010, r1=0x00000000, r2=0x00000000, r3=0x00000000 执行指令: LDMIA r0!, r1-r3 POST r0=0x0008001c, r1=0x00000001, r2=0x00000002, r3=0x00000003,地址指针 存储地址 数据,r3=0x00000000 r2=0x00000000 r1=0x00000000,r0=0x80010,例2:完成一个存储器数据块拷贝,注:r9存放源数据的起始地址 r10存放目标起始地址 r11存放源结束地址 loop LDMIA r9!, r0-r7 ;装载32字节并更新r9指针 STMIA r10!, r0-r7 ;存储32字节并更新r10指针 CMP r9, r11 ;是否到达结束地址 BNE loop ;不相等跳转,堆栈操作,ARM使用多寄存器Load/Store指令来完成堆栈操作; 使用堆栈时,需要确定堆栈在存储空间中是向上生长(递增的“A”)还是向下生长(递减的“D”); 满堆栈(“F”)是指堆栈指针指向堆栈的最后一个已使用的地址或满位置;相反,空堆栈(“E”)是指SP指向堆栈的第一个没有使用的地址或空位置;,堆栈操作寻址方式,堆栈,100,FF,1234,A0BE,8034,ARM堆栈操作通过块传送指令来完成: STMFD (Push) 块存储- Full Descending stack STMDB LDMFD (Pop) 块装载- Full Descending stack LDMIA,STMFD sp!,r4-r7,lr,例:把寄存器内容放入堆栈,更新sp,PRE 地址 数据,POST 地址 数据,SP,SP,PRE : r1=0x00000002, r4=0x00000003, sp=0x00080014 执行指令: STMFD sp!, r1,r4 POST: r1=0x00000002, r4=0x00000003, sp=0x0008000c,单数据交换指令 - SWAP,单数据交换 (SWAP) 在寄存器和外部存储器之间交换字节或字 读存储器和写存储器是是放在一起的 原子指令 执行时不能中断 当LOCK 信号输出操作时,外部存储器管理单元被锁定,当 多线程操作时使程序同步(OS支持) 锁定 信号量,在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。完成一个字节或字的交换。 语法: SWPB Rd, Rm, Rn 可用作信号量 不能由armcc编译产生,必须使用汇编器。,Rm,Rd,temp,存储器,Rn,SWP,SWAP指令的用法,PRE mem320x9000=0x12345678, r0=0x00000000, r1=0x11112222, r2=0x00009000 执行操作: SWP r0, r1, r2 POST: mem320x9000=0x11112222, r0=0x12345678, r1=0x11112222, r2=0x00009000 交换指令多用于实现操作系统中的信号量和互斥操作,该指令有修饰符B,即有字交换和字节交换两种形式;,SWP指令应用示例,Spin MOV r1, =semaphore MOV r2, #1 SWP r3, r2, r1 CMP r3, #1 BEQ spin 注:信号量指向的单元是0或1,如果为1,则表示该服务被另一个过程使用,程序继续循环,直至为0,软件中断 (SWI),产生一个异常陷阱,跳转到SWI 硬件向量。 SWI 处理程序可以检测SWI号,从而决定采取何种操作。 通过SWI机制,运行在用户模式下的应用程序,可请求操作系统执行一系列特权操作。 语法: SWI ,软件中断 (SWI)执行的操作,SWI中断处理程序,处理软件中断的代码段称为中断处理程序(SWI Handler),中断处理程序是通过执行指令的地址获取软件中断号,指令地址是从lr计算出来的; SWI号的确定方法: SWI_Number=and NOT(0xff00000000),28,31,24,27,0,Cond 1 1 1 1,SWI number (ignored by processor),23,条件域,SWI处理程序应用示例,SWI_handler ;保存寄存器r0r12和lr STMFD sp!, r0-r12,lr ;read the SWI instruction LDR r10,lr,#-4 ;make off top 8 bits BIC r10,r10, #0xff000000 ; r10-contains the SWI number BL service_routine ;return from SWI handler LDMFD sp!, r0-r12,pc,控制和分支指令,控制指令 分支和分支连接 跳到希望的指令中 保存当前的PC并返回 (with L bit) 分支和交换 跳到期望的指令中与指令集交换 Rm0 = 1: Subsequent inst. are THUMB. Rm0 = 0: Subsequent inst. are ARM.,Branch : B label Branch with Link : BL subroutine_label 处理器把偏移量左移两位,进行符号扩展后再与PC相加 跳转范围:± 32 Mbyte? 如何执行长跳转?,28,31,24,0,Cond 1 0 1 L 偏移量,条件码区域,Link bit 0 = Branch 1 = Branch with link,23,25,27,分支指令,控制流指令,分支和链接指令,分支子程序 (r14 serves as a link register) 嵌套子程序,Full Descending,请求管理程序,管理程序是在特权级操作的程序,它可以实现用户级程序不能实现的任务 Example: send text to the display ARM ISA 包括 SWI (SoftWare Interrupt),转移表,根据程序计算值调用一个子程序,Note: slow when the list is long, and all subroutines are equally frequent,程序状态寄存器访问指令,程序状态寄存器访问指令(MRS, MSR) MRS 程序状态寄存器到通用寄存器的数据传送指令 MSR 通用寄存器到程序状态寄存器的数据传送指令,PSR 传送指令,MRS和MSR允许传送CPSR / SPSR中的内容到/从一个通用寄存器中。 语法: MRS Rd, ; Rd = MSR ,Rm ; = Rm 在这里: = CPSR or SPSR _fields = fsxc的任意组合 也允许送一个立即数到 psr_fields MSR ,#Immediate 用户模式下,所有位均可以被读取,但只有条件标志位 (_)可被写。,协处理器指令 - 1,协处理器 一般原理是通过增加核扩展指令集 Example : 如 MMU & cache. FPU等系统控制器 寄存器 协处理器专用 ARM 控制数据流 协处理器只包含数据处理和存贮器传送操作 协处理器数据操作 (CDP) 这类指令是用来告诉协处理器执行某些内部操作 无结果返回ARM,ARM并不等待操作完成,协处理器指令,ARM体系支持16个协处理器 针对每个协处理器的指令占用 ARM指令集中的固定部分 如果相应的协处理器不存在, 将发生一个未定义指令异常。 这有三种协处理器指令 协处理器数据处理指令 CDP:初始化协处理器数据处理操作 协处理器寄存器传送指令 MRC: 从 ARM 寄存器移到协处理器寄存器 MCR:从协处理器寄存器移到ARM 寄存器 协处理器存储器传送指令 LDC:从存储器装载到协处理器寄存器 STC:从协处理器寄存器存储到存储器,常量的装载,ARM指令不用于将一个32位的常量装入寄存器,因为ARM本身是32位的,所以指令中不可能再定义一个普通的32位常量; ARM增加了2条伪指令,把32位常量送入寄存器: 例: LDR Rd, =constant ;LDR常量装载伪指令 ADR Rd, Label ;ADR地址装载伪指令,为允许装载大常数,汇编器提供了一条伪指令: LDR rd, =const 它可能汇编成下列指令: MOV or MVN。 或 LDR 指令,从数据池(Literal pools)读取常数。 For example LDR r0,=0xFF = MOV r0,#0xFF LDR r0,=0x55555555 = LDR r0,PC,#Imm12 DCD 0x55555555 推荐使用这种方法把常数装入寄存器 。,装载32 bit常数,0,15,31,0,ADDS r2,r2,#1,ADD r2,#1,32-bit ARM 指令,16-bit Thumb 指令,对于由编译器产生的大部分指令: 没有条件执行 源、目的寄存器必须相同 仅能使用低寄存器 常数大小有限制 不能使用在线移位器,关于Thumb指令集,Thumb 是16-bit 指令集 代码密度优化 (总代码大小约为ARM指令的65%) 使用窄总线存储器时可以大大提高性能。 是 ARM 指令集的一个子集。 核存在一个执行状态 Thumb状态 ARM和Thumb之间切换使用BX 指令,写 Thumb汇编程序,Thumb不是一个“好” 指令集! 最好用编译器来产生 约束并不一致 手动编码使用ARM指令集比较好 更多细节,参看: ARM “Architecture Reference Manual”,ADS与ARM汇编程序设计,生成二进制文件的过程,编译器的基本功能,规定汇编语言的语法规则 ADS Vs. GNU 预编译(Pre-assembler) 标准汇编语言 编译二进制文件,预编译(Pre-assembler),处理伪指令(Pseudo-Instruction) 伪指令:做为汇编语言的参数,或被预编译器识别,翻译成标准汇编语言。 伪指令的功能: 提高程序的可读性和易维护性 易于编程,链接器(Linker),将多个目标文件链接成一个可执行的文件 编译器只负责把程序翻译成机器码,但处理与存储器地址相关的内容,这部分工作由链接器来完成; 一个程序编译完成后会分成代码段(Read-Only,RO)、数据段(Read-Write,RW)、零初始化段(Zero-Initialized,ZI),需要把不同的程序的不同区段链接成一个完整连续的区。,符号定义伪指令 数据定义伪指令 汇编控制伪指令 信息报告伪指令 宏指令以及其他伪指令。,伪指令,符号定义伪指令,用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。 用于定义局部变量的LCLA、LCLL、LCLS; 用于定义全局变量的GBLA、GBLL、GBLS ; 用于对变量赋值的SETA、SETL、SETS ; 为通用寄存器列表定义名称的RLIST。,符号定义伪指令,1. LCLA、LCLL、LCLS 格式:LCLA/LCLL/LCLS 局部变量名 说明:LCLA、LCLL、LCLS伪指令用于定义一个汇编程序中的局部变量,并初始化,其中: LCLA定义一个局部的数字变量,初始化为0; LCLL定义一个局部的逻辑变量,初始化为F; LCLS定义一个局部的字符串变量,初始化为空串; 这三条伪指令用于声明局部变量,在其局部作用范围内变量名必须唯一。,符号定义伪指令,2. GBLA、GBLL、GBLS 格式:GBLA/GBLL/GBLS 变量名 说明:GBLA、GBLL、GBLS伪操作定义一个汇编程序中的全局变量,并初始化,其中: GBLA定义一个全局数字变量,并初始化为0; GBLL定义一个全局逻辑变量,并初始化为“F”; GBLS定义一个全局字符串变量,并初始化为空串; 这三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。,符号定义伪指令,3. SETA、SETL、SETS 格式:变量名 SETA/SETL/SETS 表达式 说明:SETA:给一个数字变量赋值; SETL:给一个逻辑变量赋值; SETS:给一个字符串变量赋值; 格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。,符号定义伪指令,4. RLIST 格式:名称 RLIST 寄存器列表 说明:RLIST可用于对一个通用寄存器列表定义名称,该名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器为根据寄存器的编号由低到高访问次序,与列表中的寄存器排列次序无关。,数据定义伪指令,用于为数据分配存储单元,同时也可完成已分配存储单元的初始化。 DCB DCW/DCWU DCD/DCDU DCQ/DCQU DCFS/DCFSU DCFD/DCFDU SPACE FIELD MAP,数据定义伪指令,1. DCB: 标号 DCB 表达式 说明:DCB用于分配一块字节单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0255的数字,DCB可用“=”代替。 2. DCW/DCWU: 标号 DCW/DCWU 表达式 说明:DCW分配一段半字存储单元并用表达式值初始化,它定义的存储空间是半字对齐的。,数据定义伪指令,3. DCD/DCDU: 标号 DCD/DCDU 表达式 说明:DCD伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。 4. DCQ/DCQU: 标号 DCQ/DCQU 表达式 说明:DCQ用于分配一块以8个字节为单位的存储区域并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCQU功能跟DCQ类似,只是分配的存储单元不严格字对齐。,数据定义伪指令,5.DCFD/DCFDU: 标号 DCFD/DCFDU 表达式 说明:DCFD用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的,每个双精度的浮点数占据两个字单元。DCFDU功能跟DCFD类似,只是分配的存储单元不严格字对齐。 6.DCFS/DCFSU: 标号 DCFS/DCFSU 表达式 说明:DCFS用于为单精度的浮点数分配一片连续的字存储单元并用表达式初始化,它定义的存储空间是字对齐的,每个单精度浮点数使用一个字单元.DCFSU功能跟DCFS类似,只是分配的存储单元不严格字对齐。,数据定义伪指令,7. SPACE: 标号 SPACE 表达式 说明:SPACE用于分配一片连续的存储区域并初始化为0,表达式为要分配的字节数,SPACE也可用“”代替。 8. MAP: MAP 表达式 ,基址寄存器 说明:MAP定义一个结构化的内存表的首地址, “”可以用来代替MAP。 9. FILED: 标号 FIELD 字节数 说明:FIELD用于定义一个结构化内存表中的数据域,“#” 可用来代替FILED。,汇编控制伪指令,汇编控制伪操作用于指引汇编程序的执行流程: MACRO、MEND IF、ELSE、ENDIF WHILE、WEND MEXIT,汇编控制伪指令,1. MACRO、MEND MACRO $标号 宏名 $参数1,$参数2, 指令序列 MEND 说明:MACRO 表明一个宏定义的开始,MEND则表示一个宏的结束,MACRO、MEND前呼后应可以将一段代码定义为一个整体,又称宏,然后就可以在程序中通过宏的名称及参数调用该段代码。 MACRO和MEND之间的代码称为宏定义体,在宏定义体的第一行声明宏的原型,宏的原型包含宏名、所需的参数。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参数的值传递给宏定义中的参数。 注意宏操作可以嵌套使用,并可以在编译时用选项加以控制。,汇编控制伪指令,2. IF、ELSE、ENDIF IF 逻辑表达式 代码段1 ELSE 代码段2 ENDIF 说明:IF、ELSE、ENDIF伪操作能根据逻辑表达式的成立与否决定是否在编译时加入某个指令序列。IF、ELSE、ENDIF可以分别用“”、“|”、“”代替。IF、ELSE、ENDIF伪指令可以嵌套使用。,汇编控制伪指令,3. WHILE、WEND: WHILE 逻辑表达式 代码段 WEND 说明:WHILE和WEND伪指令能根据逻辑表达式的成立与否决定是否循环执行这个代码段。WHILE、WEND伪指令可以嵌套使用。 4. MEXIT: MEXIT 说明:MEXIT用于从宏中退出。,其他伪指令,1.ASSERT: ASSERT 逻辑表达式 说明:ASSERT用来表示程序的编译必须满足一定的条件,如果逻辑表达式不满足,则编译器会报错。 2.ALIGN: ALIGN 表达式,偏移量 说明:ALIGN伪操作可以通过填充字节使当前的位置满足一定的对齐方式。其中,表达式的值为2的幂,如1、2、4、8、16等,用于指定对齐方式。如果伪操作中没有指定表达式,则编译器会将当前位置对齐到下一个字的位置。偏移量也是个数字表达式,如果存在偏移量,则当前位置的自动对齐到:2的表达式值次方偏移量。,其他伪指令,3.AREA: AREA 段名 属性, 说明:AREA用于定义一个代码段、数据段或者特定属性的段。如果段名以数字开头,那么该段名需用“|”字符括起来,如|7wolf|,用C的编译器产生的代码一般也用“|”括起来。属性部分表示该代码段/数据段的相关属性,多个属性可以用“,”分隔。 常见属性如下: DATA:定义数据段。 CODE:定义代码段。 READONLY:表示本段为只读。 READWRITE:表示本段可读写。 ALIGN=表达式:对齐方式为2表达式次方,例如:表达式=3,则对齐方式为8字节对齐。表达式的取值范围为031。 COMMON属性:定义一个通用段,这个段不包含用户代码和数据。,其他伪指令,4.CODE16、CODE32: CODE16/CODE32 说明:CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。 5.ENTRY: ENTRY 说明:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定,但在一个源文件里最多只能有一个ENTRY或者没有ENTRY。,其他伪指令,6.END: END 说明:“END”告诉编译器已经到了源程序的结尾。 7.EQU: 名称 EQU 表达式,类型 说明:EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的define,可用“*”代替EQU。 如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:CODE16/CODE32/DATA,其他伪指令,8.EXPORT: EXPORT 标号,WEAK 说明:EXPORT 在程序中声明一个全局标号,该标号可以被其他的文件中的代码引用。用户也可以用GLOBAL代替EXPORT。,WEAK可选项声明其他文件有同名的标号,则该同名标号优先于该标号被引用。 9.IMPORT: IMPORT 标号 ,WEAK 说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。 ,WEAK选项表示如果所有的源文件都没有找到这个标号的定义,编译器也不会提示错误信息。编译器在多数情况下将该标号置为0,如果这个标号被B或BL指令引用,则将B或BL指令替换为NOP操作。,其他伪指令,10.EXTERN: EXTERN 标号 ,WEAK 说明:EXTERN告诉编译器所使用的标号要在当前源文件中引用,但该标号是在其他的源文件中定义的。与IMPORT不同的是,如果当前源文件实际上没有引用该标号,该标号就不会被加入到当前文件的符号表中。,WEAK选项意义同IMPORT。 11.RN: 名称 RN 表达式 说明:RN用于给一个寄存器定义一个别名,以便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。,其他伪指令,12.GET/INCLUDE: GET 文件名 说明:GET将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置展开进行汇编处理。INCLUDE和GET作用等效的。我们通常这样使用这个伪指令:在某源文件中定义一些宏指令,用MAP和FIELD定义结构化的数据类型,用EQU定义常量的符号名称,然后用GET/INCLUDE将这个源文件包含到其他的源文件中。GET/INCLUDE只能用于包含源文件,包含其他文件则需要使用INCBIN伪指令。 13.INCBIN: INCBIN 文件名 说明:INCBIN将一个数据文件或者目标文件包含到当前的源文件中,编译时被包含的文件不作任何变动的存放在当前文件中,编译器从后面开始继续处理。,其他伪指令,14.ROUT: 名称 ROUT 说明:ROUT可以给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作用范围为当前ROUT和下一个ROUT之间。,应用示例-系统初始化,复位动作,初始化过程,初始化堆栈(1),第一步:定义6种操作模式 AREA RamData, DATA, READWRITE 0xDffff00-10240 (MAP:定义存储器的起始地址) UserStack # 2048; (FIELD:预留2KB的存储空间) SVCStack # 2048; UndefStack # 2048; AbortStack # 2048; IRQStack # 2048; FIQStack # 0;,初始化堆栈(2),第二步:定义各种模式下的寄存器,设定未定义指令模式堆栈: mrs r0,cpsr bic r0,r0,#0x1f orr r1,r0,#0x1b|0xc0 msr cpsr_cxsf,r1 ;chang mode to UnderStack M11011 ldr sp,=UndefStack ;let sp=UnderStack,设定中止模式堆栈: mrs r0,cpsr bic r0,r0,#0x1f orr r1,r0,#0x17|0xc0 msr cpsr_cxsf,r1 ;chang mode to UnderStack M10111 ldr sp,=AbortStack ;let sp=AbortStack,初始化堆栈(3),设定中断模式堆栈: mrs r0,cpsr bic r0,r0,#0x1f orr r1,r0,#0x12|0xc0 msr cpsr_cxsf,r1 ;chang mode to UnderStack M10010 ldr sp,=IRQStack ;let

    注意事项

    本文(四ARM指令集ppt课件.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开