- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.1 Thumb-2指令集简介
Cortex-M3处理器使用的是Thumb-2指令集的子集,它的指 令工作状态只有Thumb-2状态。 Thumb-2继承了传统的Thumb指令集和ARM指令集的各自优 点,并不是Thumb的升级,包含16-bit指令集和32-bit指 令集两种长度的指令子集。 Thumb-2指令集体系架构,无需处理器进行工作状态的显 示切换,就可运行16位与32位混合代码,并由同一汇编器 对其进行汇编。
ASR算术右移(Arithmetic Shift Right):移位过程中保 持符号位不变,即若源操作数为正数,则数据位的高端空 出的位补0,否则补1;
可采用的移位操作
ROR循环右移(Rtate Right):由数据位的低端移出的位填 入数据位的高端空出的位;
RRX带扩展的循环右移(Rotate Right eXtended by 1 place):操作数右移一位,高端空出的位用原C标志值填 充。
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
指令执行条件码
在 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 …
第3章 Thumb-2指令系统
3.1 Thumb-2指令集简介 3.2 Cortex-M3八种寻址方式 3.3 简单的Thumb 汇编程序 3.4 Thumb-2指令基本格式
3.3 简单的Thumb 汇编程序
;文件名:TEST1.S 使用“;”进行注释 AREA |test1.s|,CODE,READONLY;声明只读代码段 THUMB DCD __Vectors DCD Reset_Handler EXPORT __Vectors EXPORT Reset_Handler __Vectors Reset_Handler PROC ; PROC/ENDP函数起始 START MOV R0,#15 ;R0 = 15 MOV R1,#8 ; R1 =8 实际代码段 标号顶格写 ADDS R0,R0,R1; R0 = R0 + R1 B START ENDP ;此处函数起始标记可省 END 声明文件结束
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 向上 增长 堆栈 存储 区 向下 增长 栈底
堆栈寻址
所以可以组合出四种类型的堆栈方 式: 向上生长的满栈、向上生长的空栈、 向下生长的满栈、向下生长的空栈。
Cortex-M3向下生长的满栈模型。
例: STMDB SP!, {R1-R7, LR} ; 将R1~R7、LR 入栈 LDMIA SP!, {R1-R7, PC} ; 出栈,到R1~R7、LR 寄存器
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,再和 R1相“与”操作,结果放入R1
可采用的移位操作
LSL逻辑左移(Logical Shift Left):寄存器中数据位低 端空出的位补0; LSR逻辑右移(Logical Shift Right):寄存器中数据位高 端空出的位补0;
嵌入式系统与应用
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个操作数的格式
2、指令执行条件码
使用指令条件码可以实现高效的逻辑操作,提高代码的 执行效率。不选为AL。
标志 Z==1 Z==0 C==1 C==0 N==1 N==0 V==1 V==0 C = = 1 && Z = = 0 C = = 0 || Z = = 1 N==V N!=V Z = = 0 && N = = V Z = = 1 || N ! = V — 含义 相等 不相等,与EQ相反 进位(无符号数大于或等于) 未进位(无符号数小于) 负数 非负数 溢出 没有溢出 无符号数大于 无符号数小于或等于 有符号数大于或等于 有符号数小于 有符号数大于 有符号数小于或等于 无条件执行
LDR R1,[R2]
5、基址寻址
• 就是将基址寄存器的内容与给出的偏移量相加,形成 操作数的有效地址。用于查表、数组操作、功能部件 寄存器访问等。例: LDR R2,[R3,#0x0C];读R3+0x0C地址上的存储单元的值存R2
0x4000000C
0xAA
将R3+0x0C作为 R3 0x40000000 地址装载数据 R2 0xAA 0x55 LDR R2,[R3,#0x0C]
第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>]
从代码中获得数据 R0 0xFF00 0x55
3、寄存器移位寻址
地址码字段(第一或第二操作数)在操作之前,先 进行移位操作。例: MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果存 R0 , ;即是R0=R2×8
逻辑左移3位
R2 R0 0x01 0x55 0x08 0x08
MOV R0,R2,LSL #3
8、相对寻址
相对寻址是基址寻址的一种变通。由程序计数器 PC提供 基准地址,指令中的地址码字段作为偏移量,两者相加 后得到的地址即为操作数的有效地址。 例: B WAITA ; 跳转到WAITA标号处,跳转范围+16MB BL SUBR1 ; 调用到SUBR1子程序,并存储返回地 ;址到LR中,其跳转范围为+16MB … SUBR1 … WAITA …
<指令码><目标寄存器>,<第一操作数>[,<第二操作数>]
Cortex-M3处理器支持8种基本寻址方式: –1、寄存器寻址 –2、立即寻址 –3、寄存器移位寻址 –4、寄存器间接寻址 –5、基址寻址 –6、多寄存器寻址 –7、堆栈寻址 –8、相对寻址
1、寄存器寻址
• 指令中的地址码字段(第一或第二操作数)给出的 是寄存器编号,操作数的值在寄存器中,指令执行 时直接取出寄存器值来操作。例: MOV R1,R2 ;将R2的值存入R1
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
立即数:#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