当前位置:
文档之家› 第3章 Thumb-2指令系统4H
第3章 Thumb-2指令系统4H
LDR R1,[R2]
5、基址寻址
• 就是将基址寄存器的内容与给出的偏移量相加,形成 操作数的有效地址。用于查表、数组操作、功能部件 寄存器访问等。例: LDR R2,[R3,#0x0C];读R3+0x0C地址上的存储单元的值存R2
0x4000000C
0xAA
将R3+0x0C作为 R3 0x40000000 地址装载数据 R2 0xAA 0x55 LDR R2,[R3,#0x0C]
堆栈寻址
所以可以组合出四种类型的堆栈方 式: 向上生长的满栈、向上生长的空栈、 向下生长的满栈、向下生长的空栈。
Cortex-M3向下生长的满栈模型。
例: STMDB SP!, {R1-R7, LR} ; 将R1~R7、LR 入栈 LDMIA SP!, {R1-R7, PC} ; 出栈,到R1~R7、LR 寄存器
<指令码><目标寄存器>,<第一操作数>[,<第二操作数>]
Cortex-M3处理器支持8种基本寻址方式: –1、寄存器寻址 –2、立即寻址 –3、寄存器移位寻址 –4、寄存器间接寻址 –5、基址寻址 –6、多寄存器寻址 –7、堆栈寻址 –8、相对寻址
1、寄存器寻址
• 指令中的地址码字段(第一或第二操作数)给出的 是寄存器编号,操作数的值在寄存器中,指令执行 时直接取出寄存器值来操作。例: MOV R1,R2 ;将R2的值存入R1
3.1 Thumb-2指令集简介
Cortex-M3处理器使用的是Thumb-2指令集的子集,它的指 令工作状态只有Thumb-2状态。 Thumb-2继承了传统的Thumb指令集和ARM指令集的各自优 点,并不是Thumb的升级,包含16-bit指令集和32-bit指 令集两种长度的指令子集。 Thumb-2指令集体系架构,无需处理器进行工作状态的显 示切换,就可运行16位与32位混合代码,并由同一汇编器 对其进行汇编。
R2 R1
0xAA 0xAA 0x55
MOV R1,R2
SUB
R0,R1,R2
;将R1的值减去R2的值,结果存R0
2、立即寻址
• 地址码字段(第一或第二操作数)直接给出是一整数 (称立即数),例: SUBS R0,R0,#1 ;R0减1结果放入R0,影响标志位
MOV R0,#0xFF000 ;将立即数0xFF000装入R0 程序存储 MOV R0,#0xFF00
条件码 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL
1 && Z = = 0 0 || Z = = 1
0 && N = = V 1 || N ! = V
指令执行条件码
在 Cortex-M3中,只有分支转移指令(B指令)才可以随 意使用条件码。例: BEQ label ;当 Z = = 1 时,程序转移到label 对于其它指令,只有在IF-THEN(IT)指令块中(最多4条) 才能加条件码,且必须加条件码。 IT已经带了一个T,最多再带3个T或E(与T相反的条件),T 、E排列无顺序。例: „ CMP R0, R1 ; 比较R0和R1的值,影响标志位 ITTEE GT ; 下带4条指令,如R0>R1既GT成立,否则LE成立 MOVGT R2, R0 ; GT成立,则 R2 = R0 MOVGT R3, R1 ; GT成立,则 R3 = R1 MOVLE R2, R1 ; LE成立,则 R2 = R1 MOVLE R3, R0 ; LE成立,则 R3 = R0 „
4、寄存器间接寻址
• 地址码段(第一或第二操作数)给出的是一个通用寄存 器的编号,所需的操作数保存在寄存器指定地址的存储 单元中,即寄存器为操作数的地址指针,例: LDR R1,[R2]; 将R2指向的存储单元的数据读出存R1 0x40000000 0xAA
R2 0x40000000
R1
0xAA 0x55
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,再和 R1相“与”操作,结果放入R1
可采用的移位操作
LSL逻辑左移(Logical Shift Left):寄存器中数据位低 端空出的位补0; LSR逻辑右移(Logical Shift Right):寄存器中数据位高 端空出的位补0;
8、相对寻址
相对寻址是基址寻址的一种变通。由程序计数器 PC 提供 基准地址,指令中的地址码字段作为偏移量,两者相加 后得到的地址即为操作数的有效地址。 例: B WAITA ; 跳转到WAITA标号处,跳转范围+16MB BL SUBR1 ; 调用到SUBR1子程序,并存储返回地 ;址到LR中,其跳转范围为+16MB „ SUBR1 „ WAITA „
从代码中获得数据 R0 0xFF00 0x55
3、寄存器移位寻址
地址码字段(第一或第二操作数)在操作之前,先 进行移位操作。例: MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果存 R0 , ;即是R0=R2×8
逻辑左移3位
R2 R0 0x01 0x55 0x08 0x08
MO统
3.1 3.2 3.3 3.4 3.5
Thumb-2指令集简介 Cortex-M3八种寻址方式 简单的Thumb 汇编程序 Thumb-2指令基本格式 Cortex-M3常用的Thumb-2指令集
3.4 Thumb-2指令基本格式
1、指令基本格式:
2、指令执行条件码
使用指令条件码可以实现高效的逻辑操作,提高代码的 执行效率。不选为AL。
标志 Z==1 Z==0 C==1 C==0 N==1 N==0 V==1 V==0 C = = C = = N==V N!=V Z = = Z = = — 含义 相等 不相等,与EQ相反 进位(无符号数大于或等于) 未进位(无符号数小于) 负数 非负数 溢出 没有溢出 无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 无条件执行
第3章 Thumb-2指令系统
3.1 Thumb-2指令集简介 3.2 Cortex-M3八种寻址方式 3.3 简单的Thumb 汇编程序 3.4 Thumb-2指令基本格式
3.2 Cortex-M3八种寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻找 真实操作数地址的方式。指令的简单格式: <opcode> <Rd>,<Rn>[,<Operand2>]
0x03 0x02 0x01
0x40000008 0x40000004 0x40000000
存储器
LDMIA R1!,{R2-R4,R6} STMIA R0!,{R2-R7,R12} ;将寄存器R2~R7、R12的值 ;存到R0指向的存储单元中 ;(R0自动加4)
7、堆栈寻址
堆栈是一个按特定顺序进行存取的存储区,后进先出。 堆栈寻址是隐含的,使用一个专门的寄存器--堆栈指针SP, 指向堆栈的存储单元即栈顶,2 种堆栈方式:向上生长与 向下生长的堆栈: 0x12345678 压栈 栈顶 0x12345678 SP 向上 增长 堆栈 存储 区 向下 增长 栈底
栈区
栈区
栈底 0x12345678
0x12345678 栈顶 SP
压栈
堆栈寻址
堆栈指针指向最后压入的有效数据项,称为满堆栈;
压栈
SP栈顶 SP栈顶 0x12345678
0x12345678
SP栈顶 SP栈顶
压栈
0x12345678
满堆栈 栈底
空堆栈 栈底
堆栈指针指向下一个待压入数据的空位置,称为空堆栈。
第3章 Thumb-2指令系统
3.1 Thumb-2指令集简介 3.2 Cortex-M3八种寻址方式 3.3 简单的Thumb 汇编程序 3.4 Thumb-2指令基本格式 3.5 Cortex-M3常用的Thumb-2指令集
6、多寄存器寻址
多寄存器寻址一次可传送几个寄存器值,允许一条指令 传送16个寄存器的任何子集或所有寄存器。例: LDMIA R1!,{R2-R4,R6} ; 将 R1 指向单元中的数据存到 ;R2~R4、R6中(R1自动加4) R6 0x04 0x?? 0x04 0x4000000C
R4 0x03 0x?? R3 0x02 0x?? R2 0x01 0x?? R1 0x40000000 0x40000010
嵌入式系统与应用
Embedded System Development 聊城大学 理工学院
曹银杰 caoyinjie@
第3章 Thumb-2指令系统
– 3.1 Thumb-2指令集简介 –3.2 Cortex-M3八种寻址方式 –3.3 简单的Thumb 汇编程序 –3.4 Thumb-2指令基本格式 –3.5 Cortex-M3常用的Thumb-2指令集
3、影响标志位的指令
在Cortex-M3中,下列指令将会更新 APSR 中的标志位: 16 位算术逻辑指令; 32 位带 S 后缀的算术逻辑指令; 比较指令(如CMP/CMN)和测试指令(如TST/TEQ); 直接操作 PSR/APSR 指令( MRS读和MSR写指令)。
4、第2个操作数的格式
立即数:#immN, –3、5、8、12、16位长度的常数表达式,如: MOVW R1,#0x1234 ; 操作数为#imm16,范围为0~65535 –由一个8 位数左移任意位而形成的常数,如: 0x3FC(0xFF<<2); –重复半字形式0x00XY00XY、0xXY00XY00、0xXYXYXYXY; Rm寄存器方式:操作数即为寄存器的数值,例: –SUB R1,R1,R2 ; R1减R2,保存到R1中 寄存器移位方式:Rm,Shift,将寄存器的移位结果作为操 作数,例移位方法如下: –ASR #n 算术右移n位(1<<n<<32); 例: –ADD R1, R1, R1, LSL #3 ;逻辑左移R1 = R1+R1×8