- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 第3章ARM指令系统 本章以流行ARM处理器为例介绍嵌入式微处理器的指令系统 ,主要介绍ARM微处理器的寻址方式以及ARM指令集、Thumb和Thumb-2指令集。 3.1 ARM指令分类及指令格式 ARM指令集特点: ARM使用标准的、固定长度的32位指令格式 所有ARM指令都使用4位的条件编码来决定指令是否执行,以解决指令执行的条件判断 ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据 返回 ARM指令分类 指令分类(6类) ARM微处理器的指令集可以分为分支指令、数据处理指令、程序状态寄存器(CPSR)处理指令、加载/存储指令、协处理器指令和异常产生指令。 当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。 当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。 详见下表 指令中的条件域(1) 指令中的条件域(2) 条件码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N清零 正数或零 0110 VS V置位 溢出 0111 VC V清零 未溢出 1000 HI C置位Z清零 无符号数大于 1001 LS C清零Z置位 无符号数小于或等于 1010 GE N等于V 带符号数大于或等于 1011 LT N不等于V 带符号数小于 1100 GT Z清零且(N等于V) 带符号数大于 1101 LE Z置位或(N不等于V) 带符号数小于或等于 1110 AL 忽略 无条件执行 返回 ARM指令中常用的操作数符号 “#”—立即数符号 “#”符号表示立即数,其中后可以是二进制数,也可以是十进制数或十六进制数 “0x”—十六进制符号 “0x”后面的数据(每位可以是0-9,A-F)表示十六进制数,如0xFFFF “!”—更新基址寄存器符号 表示指令在完成操作后最后的地址应该写入基址寄存器 “-”—指示寄存器列表范围符号 表示多个连续寄存器 ,如R0-R7表示寄存器共8个寄存器:R0,R1,R2,R3,R4,R5,R6和R7。即含义“从…到…” 3.2 ARM指令的寻址方式 定义 所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。 寻址方式种类 目前ARM指令系统支持如下7种常见的寻址方式。 立即寻址,寄存器寻址,寄存器间接寻址 基址加变址寻址,相对寻址,堆栈寻址 块拷贝(多寄存器)寻址 返回 立即寻址 立即寻址也叫立即数寻址,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数。 例如:MOV R0,#0x10FF66ED ADC R0,R0,#1000 立即数 注意立即数前面的“#” 含义:R0←R0+1000+C 返回 寄存器寻址 寄存器寻址是利用寄存器中的数值作为操作数寻址的一种方式,此方式执行效率较高,经常被各种处理器采用。 例如: ADD R0,R1,R2 含义: R0←R1+R2 寄存器间接寻址 寄存器间接寻址是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中,用于间接接寻址的寄存器必须用[ ]括起来。 例如:ADD R0,R1,[R2] LDR R0,[R1] 含义:R0←R1+[R2] 含义:R0←[R1] 基址加变址寻址 基址加变址寻址是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。 例如:LDR R0,[R1,#4] LDR R0,[R1,#4]! LDR R0,[R1] ,#4 变址寻址方式常用于访问某基地址附近的地址单元。 R0←[R1+4] R0←[R1+4]、R1←R1+4 R0←[R1]、R1←R1+4 相对寻址 相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。 例如: BL Subroutine_A ;跳转到子程序Subroutine_A处执行 …… Subroutine_A
文档评论(0)