指令集
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 ARM处理器寻址方式
寻址方Fra Baidu bibliotek分类——堆栈寻址
堆栈寻址用于数据栈与寄存器组之间批量数据传输。 堆栈是一个按特定顺序进行存取的存储区,操 作顺序为“后进先出” 。堆栈寻址是隐含的,它使 用一个专门的寄存器 ( 堆栈指针 ) 指向一块存储区域 ( 堆栈 ) ,指针所指向的存储单元即是堆栈的栈顶。 存储器堆栈可分为两种:
STMFD R13!,{R0,R1,R2,R3,R4};将R0-R4中的数据压入堆栈,R13为堆栈指针; LDMFD R13!,{R0,R1,R2,R3,R4}; 将数据出栈,恢复R0-R4原先的值。
3.1 ARM处理器寻址方式
寻址方式分类——相对寻址
相对寻址是基址寻址的一种变通。由程序计数 器PC提供基准地址,指令中的地址码字段作为偏移 量,两者相加后得到的地址即为操作数的有效地址。 相对寻址指令举例如下:
9.块拷贝寻址
3.1 ARM处理器寻址方式
寻址方式分类——立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方 式,操作数本身就在指令中给出,只要取出指令也 程序存储 就取到了操作数。这个操作数被称为立即数,对应 MOV R0,#0xFF00 的寻址方式也就叫做立即寻址。立即寻址指令举例 从代码中获得数据 如下: R0 0xFF00 0x55
9、相对寻址:
BL SUBR …….. SUBR …….. MOV PC,R143
3.4 Thumb-2指令集说明
3.4.1 条件执行
后缀名
S
含义
要求更新APSR中的相关标志,例如: ADDS R0,R1 ;根据加法的结果更新APSR中的标志
EQ、NE、LT、 有条件地执行指令,EQ=Euqal,NE=Not GT等 Equal,LT=Less Than,GT=Greater Than,例如: BEQ <Labl> ;仅当EQ满足时转移除了这4种,还有 若干个其他的条件。 在Cortex-M3中,对条件后缀的使用有很大的限制:只有转移指令(B指令) 才可随意使用。而对于其他指令,CM3引入了IF-THEN指令块,在这个块中 才可以且必须加后缀。IF-THEN块由IT指令定义。另外,S后缀可以和条件 后缀在一起使用。共有15种不同的条件后缀。
后变址法:将基地址寄存器中的值直接作为内存访问
的地址进行操作,内存访问完毕后基地址寄存器中的 值和地址偏移量作加减运算,并更新基地址寄存器。
3.1 ARM处理器寻址方式
• 寻址方式分类——基址变址寻址
LDR R0,[R1,#4]
;R0←[R1+4]
将寄存器R1 的内容加上4 形成操作数的有效地址,从而取
3
_____指令系统
2
概述
Cortex-M3指令集,即Thumb-2指令集,它是16位Thumb指令集的一个超集,同时 支持16位和32位的指令,但不支持以前像操作ARM7、9、10的时候用的32ARM指 令集。
指令的基本格式:
<opcode> {cond} {S} {P} <Rd>, <Rn> {,<operand2>}
3.1 ARM处理器寻址方式
寻址方式分类——寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式。 当第2个操作数是寄存器移位方式时,第2个寄存器 操作数在与第1个操作数结合之前,选择进行移位操 逻辑左移3位 作。寄存器移位寻址指令举例如下: MOV R0,R2,LSL 3 位,结果放入 R0 , R2 #30x01 ;R2 的值左移0x08
;将寄存器R2~R7、R12的值保 ;存到R0指向的存储; 单元中 R1!,{R2-R4,R6} ;(R0自动加4) 该指令的后缀IA 表示在每次执行完加载/存储操作后,R0 按字长度增加, 因此,指令可将连续存储单元的值传送到寄存器。(IB,DA,DB)
存储器
3.1 ARM处理器寻址方式
•寻址方式分类——块拷贝寻址
块拷贝寻址可实现连续地址数据从存储器的某一
位置拷贝到另一位置。
例:
LDMIA R0,{R2-R6}; STMIA R1,{R2-R6}; 第一条指令从以R0的值为起始地址的存储单元中 取出5个字的数据,第二条指令将取出的数据存入 以R1的值为起始地址的存储单元中。 实际上是多寄存器寻址的组合。
STR R1,[R0,#-4]!
LDR
;先R0=R0-4,然后把R1的值寄存
;到保存到R0指定的存储单元
R2,[R3,#0x0C]
3.1 ARM处理器寻址方式
• 寻址方式分类——基址变址寻址
前变址法:基地址寄存器中的值和地址偏移量先作加
减运算,生成的操作数作为内存访问的地址。(可选 择是否更新基地址寄存器)
SUBS
MOV
R0,R0,#1
;R0减1,结果放入R0,并且影响标志位
MOV R0,#0xFF00 R0,#0xFF000 ;将立即数0xFF000装入R0寄存器
注:在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀, 对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
3.1 ARM处理器寻址方式
得操作数存入寄存器R0 中。(前变址不回写)
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
将寄存器R1 的内容加上4 形成操作数的有效地址,从而取
得操作数存入寄存器R0 中,然后,R1 的内容自增4 个字 节。 (前变址回写)
;R0←[R1]、R1←R1+4
LDR R0,[R1] ,#4
寻址方式分类——堆栈寻址
堆栈指针指向最后压入的堆栈的有效数据项, 称为满堆栈;堆栈指针指向下一个待压入数据的空 位置,称为空堆栈。
压栈 SP栈顶 SP栈顶 0x12345678 0x12345678 压栈 0x12345678
SP栈顶 SP栈顶
满堆栈
栈底 栈底
空堆栈
3.1 ARM处理器寻址方式
寻址方式分类——寄存器寻址
操作数的值在寄存器中,指令中的地址码字段 指出的是寄存器编号,指令执行时直接取出寄存器 值来操作。寄存器寻址指令举例如下:
MOV SUB R1,R2 R0,R1,R2 ;将R2的值存入R1
0xAA ;R2 将R1的值减去 R2的值,结果保存到R0 R1 MOV 0xAA 0x55 R1,R2
ARM指令集的5种位移操作
LSL逻辑左移 :Rx,LSL <op1>
31 0 0
31 0
LSR逻辑右移 : Rx,LSR <op1> 0
ASR算术右移 :Rx,ASR <op1>
ROR循环右移 :Rx,ROR <op1>
31 0
31
0
RRX带扩展的循环右移:Rx, RRX 31
目的寄存器 第一个操作数的寄存器 第二个操作数
3
ARM处理器寻址方式
寻址方式分类
所谓寻址方式就是处理器根据指令中给出的地 址信息来寻找物理地址的方式。ARM处理器具有 9 种基本寻址方式。 1.立即寻址; 3.寄存器移位寻址; 5.基址变址寻址; 7.堆栈寻址; 2.寄存器寻址; 4.寄存器间接寻址; 6.多寄存器寻址; 8.相对寻址;
3.1 ARM处理器寻址方式
寻址方式分类——多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许 R6 0x04 0x?? 0x04 0x4000000C 一条指令传送16个寄存器的任何子集或所有寄存器。 R4 0x03 0x?? 0x03 0x40000008 多寄存器寻址指令举例如下: R3 0x02 0x?? 0x02 0x40000004 LDMIA R1!,{R2-R7,R12} ;将R1指向的单元中的数据读出到 R2 0x01 0x?? 0x01 0x40000000 ;R2~R7 、R12中 (R1自动加4) 0x40000000 STMIA R1 R0!,{R2-R7,R12} LDMIA
ANDS R1,R1,R2,LSL R3
R0
0x55 0x08
;即是R0=R2×8
;R2 的 值 左 移 R3 位 ,然后和 R1 相 ;“与”操作,结果放入R1
MOV
R0,R2,LSL #3
说明:
移位的方式在指令中以助记符的形式给出,而移位的
位数可用立即数或寄存器寻址方式表示。 例: ADD R0,R1,R2,ROR #5 ;R0=R1+R2循环右移5位 MOV R0,R1,LSL R3 ;R0=R1逻辑左移R3位 移位操作在ARM指令集中不作为单独的指令使用, ARM指令集共有5种位移操作。
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
3.1 ARM处理器寻址方式
寻址方式分类——堆栈寻址
堆栈压栈 SP栈顶 0x12345678 栈底
栈区
向上 增长
堆栈存 储区
向下 增长
栈区
栈底 0x12345678 堆栈压栈
栈顶SP
3.1 ARM处理器寻址方式
SWP
R1,R1,[R2]
R2 0x40000000 ;保存在R1中 R0 0xAA 0x55
;单元的内容交换
;将寄存器R1的值和R2指定的存储
LDR
R0,[R2]
3.1 ARM处理器寻址方式
寻址方式分类——基址变址寻址
基址变址寻址就是将基址寄存器的内容与指令 中给出的偏移量相加,形成操作数的有效地址。基 址寻址用于访问基址附近的存储单元,常用于查表、 0x4000000C 0xAA 数组操作、功能部件寄存器访问等。基址寻址指令 举例如下: 将R3+0x0C作 R3 0x40000000 LDR 为地址装载数 R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元 R2 0xAA 0x55 据 ;的内容,放入R2
所以可以组合出四种类型的堆栈方式:
满递增:堆栈向上增长,堆栈指针指向内含有效 数据项的最高地址。指令如LDMFA、STMFA等;
寻址方式分类——堆栈寻址
空递增:堆栈向上增长,堆栈指针指向堆栈上的 第一个空位置。指令如LDMEA、STMEA等;
满递减:堆栈向下增长,堆栈指针指向内含有效 数据项的最低地址。指令如LDMFD、STMFD等; 空递减:堆栈向下增长,堆栈指针向堆栈下的第 一个空位置。指令如LDMED、STMED等。
其中,<>号内的项是必需的,{}号内的项是可选的。<opcode>是指令助记符,这 个必须书写,而{cond}为指令执行条件,是可选的。
Opcode
Cond S
指令助记符,如ldr,srt
指令执行条件,如EQ,NE 是否更新APSR寄存器标志位。
P
Rd Rn Operand2
.N时,16位的Thumb-2编码指令,.W时,为32位Thumb-2编码指令。
1、寄存器寻址:
3
5、变址寻址: LDR R0,[R1,#4] 6、多寄存器寻址: LDMIA R1,{R0,R2,R5] ;R0<<[R1] ;R2<<[R1+4] ;R5<<[R1+8] 7、堆栈寻址: 8、块拷贝寻址: LDMIA R0!,{R2-R9} STMIA R1,{R2-R9} ;R0<<[r1+4]
C
0
3.1 ARM处理器寻址方式
寻址方式分类——寄存器间接寻址
寄存器间接寻址指令中的地址码给出的是一个 通用寄存器的编号,所需的操作数保存在寄存器指 定地址的存储单元中,即寄存器为操作数的地址指 0x40000000 0xAA 针。寄存器间接寻址指令举例如下:
LDR R1,[R2] ;将R2指向的存储单元的数据读出
以寄存器R1 的内容作为操作数的有效地址,从而取得操作
数存入寄存器R0中,然后,R1 的内容自增4 个字节。 (后变址必回写)
;R0←[R1+R2]
LDR R0,[R1,R2]
将寄存器R1 的内容加上寄存器R2 的内容形成操作数的有
效地址,从而取得操作数存入寄存器R0 中。 (前变址不 回写)
BL SUBR1 ;调用到SUBR1子程序
BEQ
... LOOP MOV ... SUBR1 ...
LOOP
;条件跳转到LOOP标号处
R6,#1
ARM基本寻址方式总结
ADD R0,R1,R2 2、立即寻址: ADD R3,R3,#1 AND R8,#0XFF 3、寄存器移位寻址: ADD R3,R2,R1,LSL #3 4、寄存器间接寻址: LDR R0,[R1] STR R0,[R1] ;R0<<[R1] ;R0<<[R1] ;R3<<R2+8*R1 ;R3<<R3+1 ;R0<<R1+R2