嵌入式系统第3章分析.ppt

3.3 Thumb指令集 Thumb指令集与ARM指令集在以下几个方面有区别: 跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。 数据处理指令。对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器,而不是第三个寄存器。 单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。 批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0~R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序指令PC。 3.3 Thumb指令集 Thumb指令集没有包含进行异常处理时需要的一些指令,因此,在异常中断时还是需要使用ARM指令。这种限制决定了Thumb指令不能单独使用而需要与ARM指令配合使用。 Thumb数据处理指令、存储器访问指令中的加载/存储指令使用方法和ARM指令集中相对应的指令类似,本节不做详细介绍,仅对有区别的指令介绍。 3.3 Thumb指令集 1. PUSH和POP 指令格式: PUSH {低寄存器的全部或其子集} POP {低寄存器的全部或其子集} PUSH低寄存器的全部或其子集,LR} POP {低寄存器的全部或其子集,PC}这两条指令是栈操作指令,用于在寄存器和堆栈之间进行成组的数据传送,PUSH指令用于把寄存器列表中的寄存器数据推进堆栈;POP指令用于把栈区的数据弹出列表的寄存器中。 3.3 Thumb指令集 堆栈指针是隐含的地址基址,Thumb指令中的堆栈是满递减堆栈,堆栈向下增长,堆栈指针总是指向最后入栈的数据。使用入栈指令PUSH时,每传送一个数据,堆栈指针就自动减4;使用出栈指令POP时,每传送一个数据,堆栈指针就自动加4。 POP {低寄存器的全部或其子集,PC}这条指令引起处理器转移到从堆栈弹出给PC的地址,这通常是从子程序返回,其中LR在子程序开头压进堆栈。这些指令不影响条件码标志。 3.3 Thumb指令集 指令示例: PUSH {R0,R4,R6} ;把R0、R4、R6的数据顺序推进栈区 PUSH {R4-R7,LR} ;把R4、R5、R6、R7、LR顺序入栈 POP {R0,R4,R6} ;把R0、R4、R6的数据弹出栈区 POP {R0-R7,PC} ;恢复现场 3.3 Thumb指令集 2. 分支指令 (1)B指令 这是Thumb指令集中唯一的有条件指令。 指令格式为:B{条件} 目标地址若使用条件,则目标地址必须在当前指令的-256~+256字节范围内。若指令是无条件的,则目标地址必须在±2KB范围内。若条件满足或不使用条件,则B指令引起处理器转移到目标地址。目标地址必须在指定限制内。ARM链接器不能增加代码来产生更长的转移。 3.3 Thumb指令集 指令示例: CMP R2,#0x20 ;比较R2和0x20 BNE START ;不相等时,即当Z=0时,则跳转 …… STARTADD R3,R4 ;跳转处 3.3 Thumb指令集 (2)BL指令 格式为:BL 目标地址BL指令是分支和链接指令,将下一条指令的地址复制到R14(链接寄存器),并引起处理器转移到目标地址,但目标地址不可以是ARM指令。BL指令不能转移到当前指令±4MB以外的地址。 3.3 Thumb指令集 指令示例: BL START ;分支跳转 ADD R3,R4 ;分支的下一条指令 …… STARTADD R0,R1 ;指令 3.3 Thumb指令集 (3) BX 格式为:BX 寄存器BX指令是分支和交换指令,寄存器的地址是目标地址,其中的位[0]不是地址信息。 当寄存器的位[0]为1时,表明目标地址处是Thumb指令; 当寄存器的位[0]为0时,表明目标地址处是ARM指令,此时,要求字对准。 3.3 Thumb指令集 指令示例: CODE16 ;Thumb程序段 ADR R0,ARM1 ;把标号ARM1处地址赋给R0 BIC R0,#01 ;清R0的位[0] BX R0 ;跳转到ARM1指令集 LET1:…… CODE32 ARM1:…… ADD R3,R4;ARM语句 ADR R0,LET+1 ;把LET1所在的地址赋给R0,置R0的位[0] BX R0 ;跳转到ARM指令集 3.3 Thumb指令集 3. SWI指令 指令格式:SWI 立即数SWI指令为软件中断指令,用于产生软件中断,即能够引起SWI异常。这意味着处理器状态切换到ARM态;处理器模式切换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量地址

文档评论(0)

1亿VIP精品文档

相关文档