Thumb指令集中关于IT指令的使用

合集下载

第四章 Thumb 指令集

第四章 Thumb 指令集

数据处理指令
ARM指令与Thumb指令低寄存器比较:
MOVS MVNS CMP CMP CMN TST ADDS ADDS ADDS ADCS SUBS SUBS SUBS SBCS RSBS MOVS MOVS MOVS MOVS MOVS MOVS MOVS ANDS EORS ORRS BICS MULS Rd, Rd, RN, Rn, Rn, Rn, Rd, Rd, Rd, Rd Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, ARM指令 #<#imm8> Rm #<#imm8> Rm Rm Rm Rn, Rn, Rn, Rn Rn, Rn, Rn, Rn, Rn, Rn, Rm, Rd, Rm, Rd, Rm, Rd, Rd, Rd, Rd, Rd, Rd, Rm, MOV MVN CMP CMP CMN TST ADD ADD ADD ADC SUB SUB SUB SBC NEG LSL LSL LSR LSR ASR ASR ROR AND EOR ORR BIC MUL Rd, Rd, Rn, Rn, Rn, Rn, Rd, Rd, Rd, Rd Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Rd, Thumb指令 #<#imm8> Rm #<#imm8> Rm Rm Rm Rn, #<#imm8> Rn, Rn Rm Rn, #<#imm8> Rn, Rm Rn Rm, Rs Rm, Rs Rm, Rs Rs Rm Rm Rm Rm Rm

Thumb汇编指令编程

Thumb汇编指令编程

如果不写,则默认是Rw_base紧接着 Ro_base段的末尾。Ro_base段则是0x0。 如果定义过后,则Rw_base段和Ro_base 段分开。
Thumb汇编指令编程
在写入bin文件,烧入Flash中的时候, 必须做到两点:
1.把Ro_base设定到首地址0x0; 2.把Rw段的内容复制到Rw_base开始 的地址。
Thumb汇编指令编程
步骤二:设置编译选项
设置工程连接地址 RO Base 为X30000000, RW Base 为0X30001000。 设置调试入口, 地址Image entry point 为0X30000000。
Thumb汇编指令编程
Ro_base是代码段的首地址, Rw_base则是变量段的首地址。
Thumb汇编指令编程
步骤三:编译、调试 编译连接工程,选择Project Debug, 启动AXD 进行软件仿真调试。
Thumb汇编指令编程
;定义一个变量,地址在0x30001010 COUNT EQU 0x30001010 AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口 CODE32 ;声明31 位ARM 指令 START LDR R1,=COUNT ;R1<=COUNT MOV R0,#0 ;R0<=0 STR R0,[R1] ;[R1]<=R0 ,即设置COUNT 为0 LOOP LDR R1,=COUNT LDR R0,[R1] ;R0<=[R1] ADD R0,R0,#1 ;R0<=R0+1 CMP R0,#10 ;R0 与10 比较,影响条件码标志 MOVHS R0,#0 ;若R0>=10,则此指令执行 R0<=0 STR R0,[R1] ;[R1]<=R0,即保存COUNT B LOOP

3.4 Thumb指令集

3.4 Thumb指令集

3.4 Thumb指令集Thumb指令集可以看做ARM指令集的一个子集,其用于支持存储系统数据总线为16位的应用系统。

Thumb指令长度为16位,这样,与32位的ARM指令集相比,有效地节省了系统的存储空间。

但Thumb指令集中的数据处理指令的操作数仍然是32位的,指令寻址地址也是32位的。

在实际应用中,若对系统的性能有较高要求,则选arm指令集和32位的memory;若对系统的功耗有较高要求时,则选Thumb指令集和16位的memory;一般将两者混合使用,根据系统不同部分的不同需求,选用合适的指令,发挥两者的优势。

Thumb指令集由数据处理指令、跳转指令、Load/Store指令和软件中断指令4大类构成。

数据处理指令格式功能MOV Rd,imm_8; Rd=imm_8;Rd为R0~R7,imm_8为8位立即数MOV Rd,Rn; Rd=Rn;Rd、Rn为R0~R15MVN Rd,Rn; Rd=~Rn;Rd、Rn为R0~R7NEG Rd,Rn; Rd=-Rn;Rd、Rn为R0~R7ADD Rd,Rn,imm; Rd=Rn+imm;Rd为R0~R7,Rn为R0~R7或PC或SP;Rn为PC或SP时,imm为10位立即数;否则,imm为3位立即数ADD Rd,Rn,Rm; Rd=Rn+Rm;Rd、Rn、Rm为R0~R7ADD Rd,imm; Rd=Rd+imm;Rd为R0~R7或SPRd为SP时,imm为-508~+508间的4整数倍的数否则,imm为8位立即数ADD Rd,Rn; Rd=Rd+Rn;Rd、Rn为R0~R15ADC Rd,Rn; Rd=Rd+Rn+carry;Rd、Rn为R0~R7,carry为进位标志值SUB Rd,Rn,imm_3; Rd=Rn-imm_3;Rd、Rn为R0~R7,imm_3为3位立即数SUB Rd,Rn,Rm; Rd=Rn-Rm;Rd、Rn、Rm为R0~R7,SUB Rd,imm; Rd=Rd-imm;Rd为R0~R7或SPRd为SP时,imm为-508~+508间的4整数倍的数否则,imm为8位立即数SBC Rd,Rn; Rd=Rd-Rn-!carry;Rd、Rn为R0~R7,carry为进位标志值MUL Rd,Rn; Rd=Rd×Rn;Rd、Rn为R0~R7AND Rd,Rn; Rd=Rd&Rn;Rd、Rn为R0~R7ORR Rd,Rn; Rd=Rd|Rn;Rd、Rn为R0~R7EOR Rd,Rn; Rd=Rd^Rn;Rd、Rn为R0~R7BIC Rd,Rn; Rd=Rd&(~Rn);Rd、Rn为R0~R7ASR Rd,Rn; Rd=Rd算术右移Rn位;Rd、Rn为R0~R7ASR Rd,Rn,imm_5; Rd=Rn算术右移imm_5位;Rd、Rn为R0~R7,imm_5为1~32间的数值LSL Rd,Rn; Rd=Rd逻辑左移Rn位;Rd、Rn为R0~R7 LSL Rd,Rn,imm_5; Rd=Rn逻辑左移imm_5位;Rd、Rn为R0~R7 LSR Rd,Rn; Rd=Rd逻辑右移Rn位;Rd、Rn为R0~R7 LSR Rd,Rn,imm_5; Rd=Rn逻辑右移imm_5位;Rd、Rn为R0~R7 ROR Rd,Rn; Rd=Rd循环右移Rn位;Rd、Rn为R0~R7CMP Rn,Rm; 根据Rn-Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7CMP Rn,imm_8; 根据Rn-imm_8的值,修改CPSR的状态标志位;Rn为R0~R7CMN Rn,Rm; 根据Rn+Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7TST Rn,Rm; 根据Rn&Rm的值,修改CPSR的状态标志位;Rn、Rm为R0~R7跳转指令格式功能B{cond} label PC=label;若有cond,则label必须在当前指令的-256~+256字节范围内;否则,label必须在当前指令的-2KB~+2KB范围内BL label R14=PC+4,PC=label;label必须在当前指令的-4MB~+4MB范围内BX Rn PC=Rn,且切换处理器状态Load/Store指令格式功能LDR Rd,[Rn,imm]; Rd=地址(Rn+imm)中的字数据;Rd为R0~R7,Rn为R0~R7或SP 或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数LDR Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的字数据;Rd、Rn、Rm为R0~R7LDRH Rd,[Rn,imm_5]; Rd=地址(Rn+imm_5)中的无符号半字数据;Rd、Rn为R0~R7,imm_5为5位立即数LDRH Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的无符号半字数据;Rd,Rn,Rm为R0~R7 LDRB Rd,[Rn,imm_5]; Rd=地址(Rn+imm_5)中的无符号字节数据;Rd、Rn为R0~R7 LDRB Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的无符号字节数据;Rd,Rn,Rm为R0~R7 LDRSH Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的有符号半字数据;Rd,Rn,Rm为R0~R7 LDRSB Rd,[Rn,Rm]; Rd=地址(Rn+Rm)中的有符号字节数据;Rd,Rn,Rm为R0~R7 LDR Rd,label; Rd=地址(label)中的字数据;Rd为R0~R7STR Rd,[Rn,imm]; 地址(Rn+imm)处的字数据=Rd;Rd为R0~R7,Rn为R0~R7或SP 或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数软件中断指令格式功能SWI 8位立即数8位立即数为中断号。

实践-Thumb指令实践指导

实践-Thumb指令实践指导

实践-Thumb指令实践指导实践指导1:ARM与Thumb的混合编程1.实验⽬的●使⽤Thumb汇编语⾔,体会ARM与Thumb的区别。

●使⽤伪指令,加深对伪操作的理解。

2.实验设备●硬件:PC机。

●软件:ADS集成开发环境,Windows2000/XP/2003。

3.实验原理ARM与Thumb的混合编程所有的ARM指令都是可以条件执⾏的,⽽Thumb指令仅有⼀条指令(B指令)具备条件执⾏功能。

所以很多应⽤程序需要两者的混合编程,因此存在ARM与Thumb状态之间相互切换,⽽且相互之间的状态切换的开销⼏乎为零。

由于ARM处理器总是从ARM状态开始执⾏,故Thumb指令的执⾏必须由ARM状态转向Thumb状态,通常BX指令完成。

另外在Thumb指令前必须有CODE16伪指令指⽰汇编器以下指令为Thumb指令。

4.实验内容下⾯是⼀段直接进⾏状态切换的代码。

AREA AddReg,CODE,READONL YENTRYCODE32;程序从ARM状态开始ADR R0,ThumbProg+1;跳转到ThumbProg。

这⾥为什么要加1呢?因为BX指令;跳转到指定的地址执⾏程序时,若(BX{cond}Rm)Rm;的位[0]为1,则跳转时⾃动将CPSR中的标志T置位即把;⽬标代码解释为Thunb代码。

BX R0;程序切换到Thumb状态CODE16;CODE16指⽰编译器后⾯为Thumb指令ThumbProg MOV R2,#2MOV R3,#3ADD R2,R2,R3ADR R0,ARMProgBX R0;跳转到ARMProg,程序切换到ARM状态CODE32;CODE32指⽰编译器后⾯为ARM指令ARMProg MOV R4,#4MOV R5,#5ADD R4,R4,R5Stop MOV R0,#0x18;软中断参数设置LDR R1,=0x20026;软中断参数设置SWI0x123456;将CPU的控制权交给调试器END5.操作步骤Step1建⽴⼯程⽂件,输⼊程序代码。

第三章第二节thumb指令集及汇编格式

第三章第二节thumb指令集及汇编格式
每一个汇编源程序都包含END指示符,以告诉本源程 序的结束。
第三章第二节thumb指令集及汇编格式
内嵌汇编
内嵌汇编(inline assembly)的语法如下:
asm(“指令” ); asm(“指令” );
第三章第二节thumb指令集及汇编格式
内嵌汇编代码举例
#include<stdio.h> void str_cpy(const char *src,char *dst) {
WFI
等待一个中断发生
第三章第二节thumb指令集及汇编格式
汇编语言设计
汇编语言程序设计更能充分发挥处理器的硬件 特性
两个优势
操作系统移植需要编写几百行底层硬件的汇编 语言程序,这是C语言不可取代的。
优化算法的时空效率,C语言的目标代码优化是 编译器完成的,而汇编语言的目标代码优化是 人工完成的。人是算法的创造者,也是编译器 的设计者,人工优化比编译器质量高。
int ch;
asm("mov r0,#1"); asm("mov r0, #1"); asm("add r0, r1");
}
第三章第二节thumb指令集及汇编格式
IAR的固件库
由ST公司开发,包括驱动程序和应用函数的 函数库
版本:3.4 优点:
入手快 便于开发,节约时间
B loop
;标号DOB没有顶格书写 ;命令不允许顶格书写 ;指令中大小写混合 ;无法跳转到loop标号,大小写 ;不一致
第三章第二节thumb指令集及汇编格式
几个重要伪指令
➢ 1. DCB:
标号 DCB 表达式
说明:DCB用于分配一块字节单元并用伪指令中指定的表达式 进行初始化。其中,表达式可以为使用双引号的字符串或0—— 255的数字,DCB可用“=”代替。

thumb指令系统

thumb指令系统

该指令中,Rd,Rm可以是R0-R15中任何一 个;若Rd和Rm是低寄存器,则更新条件标志码 标志N、Z、C和V。
③SP操作的ADD或SUB指令格式如下: op SP, #expr 其中,SP目标寄存器;也是第一个操作寄存器; #expr立即数,在-508-+508之间的4的整数倍的数 条件码标志:不影响条件码标志。
15
跳转指令
格 式 功 能
PC=label; 若有cond,则label必须在当前指令的-256~ +256字节范围内; 否则,label必须在当前指令的-2K~+2K字节 label 2K 2K 范围内
B{cond} label
BL label
R14=PC+4,PC=label; label必须在当前指令的-4M~+4M字 节范围内 PC=Rn,且切换处理器状态
数据处理指令是对通用寄存器进行操作。在大 多数情况下,操作的结果须放入其中一个操作 数寄存器中,而不是第3个寄存器中。 数据处理操作比ARM状态的更少。 访问寄存器R8~R15受到一定限制。 除MOV和ADD指令访问器R8~R15外,其它数据 处理指令总是更新CPSR中的状态标志。 访问寄存器R8~R15的Thumb数据处理指令不能 更新CPSR中的状态标志。
移位和循环移位作为独立的指令,对寄存器的内容进 行操作。这些指令可使用寄存器中的值或立即数来表示 移位量。 格式:OP Rd, Rs OP Rd, Rm,#expr 其中:Rd,Rm,Rs 必须在R0-R7中;
expr 若op是LSL,则为0-31,否则为1-32
条件码标志:指令会更新N、Z和C标志(若移位量为0, 则不影响C标志)。
SUBS SBCS RSBS MOVS MOVS MOVS MOVS MOVS MOVS

04-Thumb指令集

04-Thumb指令集

转移链接产生两条格式3指令 格式3指令必须 指令必须成对 转移链接产生两条格式 指令;格式 指令必须成对 两条格式 指令; 出现而不能单独使用 同样BLX产生一条格式 指令和 而不能单独使用。 产生一条格式3指令和 出现而不能单独使用。同样 产生一条格式 一条格式3a指令 指令。 一条格式 指令。 汇编器根据当前指令地址、 汇编器根据当前指令地址、目标指令标识符的地址 以及对流水线行为的微调计算出应插入指令中相应的偏 移量。若转移目标不在寻址范围内则给出错误信息。 移量。若转移目标不在寻址范围内则给出错误信息。
② 编程模型
R0
Thumb指令集是 指令集是 ARM指令集的一个子 指令集的一个子 集,并只能对限定的 ARM寄存器进行操作。 寄存器进行操作。 寄存器进行操作 其编程模型如图示: 其编程模型如图示:
R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 SP(R13) ( ) LR(R14) ( ) PC(R15) ( ) 有阴影的寄存器 访问时受到限制
① 指令集特点
Thumb指令继承了ARM指令集的许多特点 指令继承了 指令继承了 指令集的许多特点 Thumb指令也是采用 指令也是采用Load/Store结构,有数据处 结构, 指令也是采用 结构 数据传送及流控制指令等。 理、数据传送及流控制指令等。 Thumb指令集丢弃了 指令集丢弃了 指令集丢弃了ARM指令集一些特性 指令集一些特性 大多数Thumb指令是无条件执行的,许多 指令是无条件执行的, 大多数 指令是无条件执行的 许多Thumb 数据处理指令采用2地址格式 地址格式, 数据处理指令采用 地址格式,即目的寄存器与一个源 寄存器相同; 寄存器相同; Thumb异常中断时表现的一些特点 异常中断时表现的一些特点 异常中断时 所有异常都会使微处理器返回到ARM模式状态, 模式状态, 所有异常都会使微处理器返回到 模式状态 并在ARM的编程模式中处理。 的编程模式中处理。 并在 的编程模式中处理 由于ARM微处理器字传送地址必须字对齐,半字 微处理器字传送地址必须字对齐, 由于 微处理器字传送地址必须字对齐 传送地址必须可被2整除 即半字对准); 整除( );而 传送地址必须可被 整除(即半字对准);而Thumb 指令是2个字节长 所以, 个字节长, 指令是 个字节长,所以,由Thumb执行状态进入异 执行状态进入异 常时其自然偏移与ARM不同。 不同。 常时其自然偏移与 不同

ARM中的条件执行指令(IT指令)

ARM中的条件执行指令(IT指令)

ARM中的条件执⾏指令(IT指令)条件执⾏在之前讨论CPSR寄存器那部分时,我们⼤概提了⼀下条件执⾏这个词。

条件执⾏⽤来控制程序执⾏跳转,或者满⾜条件下的特定指令的执⾏。

相关条件在CPSR寄存器中描述。

寄存器中的⽐特位的变化决定着不同的条件。

⽐如说当我们⽐较两个数是否相同时,我们使⽤的Zero⽐特位(Z=1),因为这种情况下发⽣的运算是a-b=0。

在这种情况下我们就满⾜了EQual的条件。

如果第⼀个数更⼤些,我们就满⾜了更⼤的条件Grater Than或者相反的较⼩Lower Than。

条件缩写都是英⽂⾸字母缩写,⽐如⼩于等于Lower Than(LE),⼤于等于Greater Equal(GE)等。

下⾯列表是各个条件的含义以及其检测的状态位(条件指令都是其英⽂含义的缩写,为了便于记忆不翻译了):image我们使⽤如下代码来实践条件执⾏相加指令:.global mainmain:mov r0, #2 /* 初始化值 */cmp r0, #3 /* 将R0和3相⽐做差,负数产⽣则N位置1 */addlt r0, r0, #1 /* 如果⼩于等于3,则R0加⼀ */cmp r0, #3 /* 将R0和3相⽐做差,零结果产⽣则Z位置⼀,N位置恢复为0 */addlt r0, r0, #1 /* 如果⼩于等于3,则R0加⼀R0 IF it was determined that it is smaller (lower than) number 3 */ bx lr上⾯代码段中的第⼀条CMP指令将N位置⼀同时也就指明了R0⽐3⼩。

之后ADDLT指令在LT条件下执⾏,对应到CPSR寄存器的情况时V与N⽐特位不能相同。

在执⾏第⼆条CMP前,R0=3。

所以第⼆条置了Z位⽽消除了N位。

所以ADDLT不会执⾏R0也不会被修改,最终程序结果是3。

Thumb模式中的条件执⾏在指令集那篇⽂章中我们谈到了不同的指令集,对于Thumb中,其实也有条件执的(Thumb-2中有)。

第4章 Thumb 指令集

第4章   Thumb 指令集

第4章Thumb 指令集●Thumb 寄存器的使用●ARM-Thumb 交互●其它分支指令●数据处理指令●单寄存器load-store指令●多寄存器load-store 指令●堆栈指令●软件中断指令●总结本章介绍Thumb指令集。

Thumb把32位ARM指令集的一个子集进行编码,成为一个16位的指令集。

在16位外部数据总线宽度下,在ARM处理器上使用Thumb指令的性能要比使用ARM指令的性能更好;而在32位外部数据总线宽度下,使用Thumb指令的性能要比使用ARM指令的性能差。

因此,Thumb指令多用于存储器受限的一些系统中。

相对于ARM指令集,使用Thumb指令集可获得更高的代码密度—一个可执行的程序在内存中所占的空间。

在存储器受限的嵌人式系统中,比如移动电话、PDA等,代码密度是非常重要的;同时,成本压力也会限制存储器的大小、数据宽度和速度。

平均而言,对于同一个程序,使用Thumb指令实现所需的存储空间,要比等效的ARM 指令实现少30%左右,图4. 1显示了对于实现同样的除法运算,使用ARM指令和使用Thumb 指令的汇编代码。

虽然Thumb指令的实现使用了更多的指令,但是它所占的总的存储空间却比较小。

代码密度是Thumb指令集的一个主要优势。

由于Thumb指令集的设计是面向编译器的,而不是针对手写汇编的,所以推荐使用高级语言如C或者C++语言来编程,然后用编译器生成Thumb指令的目标代码。

图4.1 代码密度每一条Thump指令都和一条32位的ARM指令相关。

图4. 2显示了一条Thumb加法指令ADD译码成等效的ARM加法指令,表4. 1给出了在ARMv5TE架构,F的THUMBv2中所有的Thumb指令。

在ThumbISA 中,只有分支指令可被条件执行;同时由于16位空间的限制,桶形移位操作如ASR,LSL,LSR 和RQR,也变成单独的指令。

表4.1 Thumb指令集续表 4.14.1 Thumb 寄存器的使用在Thumb状态下,不能直接访问所有的寄存器,只有寄存器r0~r7是可以被任意访问的,如表4.2所列。

第5章 Thumb指令

第5章 Thumb指令


与ARM指令一样,在Thumb指令集中,也有 相应的分支指令实现程序的跳转和子程序的 调用。 Thumb分支指令可分为B分支指令、带链接 的分支指令和带状态切换的分支指令。

TM
23
23
B分支指令

条件分支指令

B{cond} label
TM
24
24

无条件分支指令 这类指令的汇编语法格式为 B label


这类指令的汇编语法格式为
opcode Rd, Hs opcode Hd, Rs opcode Hd, Hs
TM
11
11
带SP/PC的算术运算指令


1.SP/PC加法运算指令 这类指令的汇编语法格式为
ADD Rd, ADD Rd, PC,#immed_8 × 4 SP,#immed_8 × 4
TM
18
18

PC作为基址寄存器的字加载指令
LDR Rd, [PC,# immed_8×4]
TM
19
19

SP作为基址寄存器的加载/存储指令 LDR Rd, [SP,# immed_8×4] STR Rd, [SP,# immed_8×4]
TM2020Fra bibliotek批量加载/存储指令


寄存器入栈出栈指令
TM
寄存器移位的数值,取值范围
5
5

Thumb寄存器移位指令操作码编码
Thumb 汇编语法格式 LSL Rd, Rs, #shift_immed_5 LSR ASR Rd, Rs, #shift_immed_5 Rd, Rs, #shift_immed_5 实现的操作 将 Rs 逻辑左移 shift_immed_5 位, 并将结果传送到 Rd 中 将 Rs 逻辑右移 shift_immed_5 位, 并将结果传送到 Rd 中 将 Rs 算术右移 shift_immed_5 位, 并将结果传送到 Rd 中

Thumb2指令表(中文)

Thumb2指令表(中文)

Rd := SAT(Rm + SAT(Rn * 2))
Q
SUB{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn – Operand2
N
SBC{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn + Operand2 - C的非
N
T2 SUB Rd, Rn, #<imm12>
T
6 <prefix>ADD16 Rd, Rn, Rm
Rd[31:16] := Rn[31:16] + Rm[31:16], Rd[15:0] := Rn[15:0] + Rm[15:0]
G
6 <prefix>SUB16 Rd, Rn, Rm
Rd[31:16] := Rn[31:16] – Rm[31:16], Rd[15:0] := Rn[15:0] – Rm[15:0]
一个由大括号括起来的,用逗号隔开的寄存器列表。如:{ and }。 加载或存储的寄存器列表,不能包含程序计数器PC。 列表须有程序计数器。将SPSR拷贝到CPSR中,用于从异常处理返回。 正或负号。(+号有可能被忽略.) 见表: ARM结构版本 中断标志。一个或多个a,i,f(异常、中断、快速中断). 见表: 处理器模式 由<p_mode>所指定处理器模式的堆栈指针SP 位域的最低有效位 位域的宽度。<width> + <lsb> 必须≤32 如果x置位,RsX为Rs循环移动16位的结果。否则RsX为Rs。 若 ! 存在 (预先定义),则数据传送后更新基址寄存器(Rn)。 若S存在,则更新标志位 若T存在,进用户特权模式 若R存在,则恢复最近的结果,否则丢弃结果。

Thumb2指令表(中文)

Thumb2指令表(中文)

6 <prefix>ASX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] + Rm[15:0], Rd[15:0] := Rn[15:0] – Rm[31:16]
G
6 <prefix>SAX Rd, Rn, Rm
Rd[31:16] := Rn[31:16] – Rm[15:0], Rd[15:0] := Rn[15:0] + Rm[31:16]
G
6 USAD8 Rd, Rm, Rs
Rd := Abs(Rm[31:24] – Rs[31:24]) + Abs(Rm[23:16] – Rs[23:16]) + Abs(Rm[15:8] – Rs[15:8]) + Abs(Rm[7:0] – Rs[7:0])
6 USADA8 Rd, Rm, Rs, Rn
并累加
Saturate 饱和
有符号饱和字的右移 有符号饱和字的左移 有符号的两个半字饱和
无符号饱和字的右移 无符号饱和字的左移 无符号的两个半字饱和
§ 指令格式
S更新位
作用
备注
ADD{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn + Operand2
N
ADC{S} Rd, Rn, <Operand2>
Rd := SAT(Rm + SAT(Rn * 2))
Q
SUB{S} Rd, Rn, <Operand2>
N Z C V Rd := Rn – Operand2
N
SBC{S} Rd, Rn, <Operand2>

ARM指令集-Thumb 指令及应用

ARM指令集-Thumb 指令及应用

— Thumb 代码使用的指令数比ARM 代码多约30%~40%
— 若使用32 位的存储器,ARM 代码比Thumb 代码快约40%
— 若使用16 位的存储器,Thumb 代码比ARM 代码快约40%~50%
— 与ARM 代码相比较,使用Thumb 代码,存储器的功耗会降低约30%

显然, ARM 指令集和 Thumb 指令集各有其优点,若对系统的性能有较高要求,应使用 32 位的存储系统和 ARM 指令集,若对系统的成本及功耗有较高要求,则应使用 16 位的存储系统和 Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。
由于 Thumb 指令的长度为 16 位,即只用 ARM 指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的 Thumb 指令的条数较 ARM 指令多。在一般的情况下, Thumb 指令与ARM 指令的时间效率和空间效率关系为:
— Thumb 代码所需的存储空间约为ARM 代码的60%~70%
所有的 Thumb 指令都有对应的 ARM 指令,而且 Thumb 的编程模型也对应于 ARM 的编程模型, 在应用程序的编写过程中,只要遵循一定调用的规则, Thumb 子程序和 ARM 子程序就可以互相调用。当处理器在执行 ARM 程序段时,称 ARM 处理器处于 ARM 工作状态,当处理器在执行 Thumb程序段时,称 ARM 处理器处于 Thumb 工作状态。
与 ARM 指令集相比较, Thumb 指令集中的数据处理指令的操作数仍然是 32 位,指令地址也为32 位,但 Thumb 指令集为实现 16 位的指令长度,舍弃了 ARM 指令集的一些特性,如大多数的 Thumb指令是无条件执行的,而几乎所有的 ARM 指令都是有条件执行的;大多数的 Thumb 数据处理指令的目的寄存器与其中一个源寄存器相同。

第3章2 Thumb指令集

第3章2 Thumb指令集

Thumb指令集没有协处理器指令、单寄存器交换
指令、乘加指令、64位乘法指令以及程序状态寄 存器处理指令,而且指令的第2操作数受到限制。 除了转移指令B有条件执行功能外,其他指令均 为无条件执行。 Thumb是一个不完整的体系结构,不能指望处理 器只执行Thumb代码而不支持ARM指令集。
(二)状态切换 1、ARM状态进入Thumb状态的方法
4)ADD– PC或SP相对移位
格式:ADD Rd, Rp, #expr; Rd取低寄存器;Rp是PC或SP; expr汇编时 取0—1020范围内4的整数倍。 用法:把expr值加到Rp的值中,结果放到 Rd。指令运行不影响条件码标志。若Rp是 PC,则使用值是(当前指令地址+4)。 例: ADD R6, SP, #64; ADD R2, PC, #980;



2. 多寄存器读取和存储指令
Thumb多寄存器传送类指令和ARM有相同的指 令格式 块拷贝指令只有LDMIA和STMIA寻址模式。 寄存器是R0—R7. 例: LDMIA R3!, {R0,R4}; LDMIA R5!, {R0-R7}; STMIA R0!, {R6,R7}; STMIA R3!, {R3,R5,R7};
PC,LR ;当返回地址保存在LR时 STMFD SP!,{<registers>,LR} ;当返回地址保存在堆栈时,
MOV
…… ……
;进入异常后将R14入栈, ;假设异常前执行的是Thumb指令,PC保存于LR中
LDMFD SP!,{<registers>,PC}
;返回指令

2、 Thumb状态进入ARM状态的方法
八、软件中断指令SWI

Thumb指令集之: 异常中断产生指令(断点指令)

Thumb指令集之:  异常中断产生指令(断点指令)

Thumb 指令集之:异常中断产生指令(断点指令)
11.7 异常中断产生指令(断点指令)
Thumb 异常中断产生指令与ARM 指令集下的异常中断指令十分相似。

同ARM 指令集相同,Thumb 指令集中同样包含两条异常中断产生指令:软件中断指令SWI 用于产生SWI 异常中断;断点中断指令BKPT 主要用于产生软件断点,供调试程序使用(只在ARMv5 及以上版本中使用)。

11.7.1 软中断指令SWI(1)编码格式
软中断指令SWI 的编码格式如图11.63 所示。

图11.63SWI 指令的编码格式
软中断指令SWI(SoftwareInterrupt)用于使处理器产生软中断异常,使用这种机制实现在用户模式对操作系统中特权模式的程序调用。

(2)指令的语法格式
SWIimmed_8
其中,immed_8 为8 位立即数,该立即数被处理器忽略,但可以被操作系统用来判断用户程序请求的服务类型。

(3)指令操作的伪代码
R14_svc=addressofnextinstructionaftertheSWIinstruction
SPSR_svc=CPSR
CPSR[4:0]=0b10011 /*进入超级模式*/
CPSR[5]=0 /*进入ARM 状态*/
/*CPSR[6]isunchanged*/
CPSR[7]=1 /*禁止正常中断*/
Ifhighvectorsconfiguredthen。

Thumb指令集中关于IT指令的使用

Thumb指令集中关于IT指令的使用

ARM处理器架构的Thumb指令集中关于IT指令的使用在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了IT指令,进一步增强了代码的紧凑性。

Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。

当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。

如果你需要更紧凑的指令,那么使用Thumb结合ThumbEE来做带条件的指令执行还是不错的选择。

Thumb本身不具备带条件指令执行的特性。

IT指令的描述为:IT{<x>{<y>{<z>}}} <firstcond>其中,<x>表示第二条指令的条件;<y>表示第三条指令的条件;<z>表示第四条指令的条件。

<firstcond>是条件操作数,表示第一条指令的条件。

<x>、<y>、<z>的标识其实就两种符号——T或E。

T表示Then,表示相应的指令所满足的条件与<firstcond>一致;E表示else,表示相应的指令所满足的条件与<firstcond>完全相反。

因此,对于第一条指令而言,总是为T的,因此不需要在IT中显示给出,它直接对应于<firstcond>的条件。

另外,在IT块中不能再使用IT指令。

即,相继的四条指令中不允许出现IT指令。

下面给出一些示例代码://// hi.s// test//// Created by zenny_chen on 13-5-8.// Copyright (c) 2013年 zenny_chen. All rights reserved.//.text.align 4.globl _ThumbEETest, _ThumbEETest2.thumb.thumb_func_ThumbEETest:eor r1, r1, r1eor r2, r2, r2eor r3, r3, r3eor r12, r12, r12cmp r1, #0itete eqmoveq r1, #10movne r2, #20moveq r3, #30movne r12, #50stmia r0, {r1-r3, r12}bx lr.thumb_func_ThumbEETest2:mov r1, #1eor r2, r2, r2eor r3, r3, r3eor r12, r12, r12cmp r1, #0ittet gtmovgt r1, #10movgt r2, #20movle r3, #30 // 这里只能用le(表示小于等于),而不能用lt(表示小于)movgt r12, #50stmia r0, {r1-r3, r12}bx lr。

Thumb指令集之: Thumb跳转指令

Thumb指令集之: Thumb跳转指令

Thumb 指令集之:Thumb 跳转指令
11.3Thumb跳转指令Thumb指令集中的跳转指令分以下6种类型。

①无条件跳转,其跳转空间为&plusmn;2KB。

②条件跳转,其跳转空间为&plusmn;256B。

③带返回的跳转指令,其跳转空间为&plusmn;4MB。

④带状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。

⑤带返回和状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。

⑥第二种形式的带返回和状态切换的跳转指令。

下面详细介绍各指令的特点及用途。

11.3.1跳转指令BThumb中有两个分支跳转指令的变体,第一个变体与ARM 版本指令相似,可条件执行,跳转被限制在有符号8位立即数所表示的范围内,或者是&plusmn;256B。

第二个变体不可条件执行(没有条件码部分),但扩展了有效跳转范围,跳转范围为有符号11位立即数表示的范围,即
&plusmn;2048B。

条件分支指令是Thumb指令中惟一可以条件执行的指令。

首先来介绍可条件执行的跳转指令B(1)。

(1)编码格式
可条件执行的跳转指令的编码格式如图11.1所示。

图11.1B(1)指令编码格式
(2)指令的语法格式
Bcondtarget_address。

Thumb指令

Thumb指令

5.2 存储器访问指令
• Thumb存储器访问指令
•LDMIA和STMIA——多寄存器加载/存储指令 可以实现在一组寄存器和一块连续的内存单元
之间传输数据。LDMIA为加载多个寄存器;STMIA 为存储多个寄存器。使用它们允许一条指令传送8 个低寄存器R0~R7的任何子集。
注意:Thumb多寄存器加载/存储指令中,只使用后增形式(IA)
;存储一个无符号半字数据
LDRB Rd,[Rn,Rm]
;加载一个无符号字节数据
STRB Rd,[Rn,Rm]
;存储一个无符号字节数据
LDRSH Rd,[Rn,Rm]
;加载一个有符号半字数据
LDRSB Rd,[Rn,Rm]
;存储一个有符号半字数据
其中:Rd 表示加载或存储的寄存器。必须为R0~R7。
Rn 表示基址寄存器。必须为R0~R7。
R00
R11 R22

R33

R44

R55 R66

R77 R88
R99

R1100
R1111

R1122

堆堆栈栈指指针针(RR1133)) 连连接接寄寄存存器器(RR1144))

程程序序计计数数器器(RR1155))
当前程序状态寄存器
当前程序状态寄存器
(C P SR )
(C P SR )
被保存程序状态寄存器
MOV
R0,#10
; R0 = 10
MOV
R1,#20
; R1 = 20
ADD
R0,R1
; R0 = R0+R1
B
.
END

Thumb指令小节目录
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM处理器架构的Thumb指令集中关于IT指令的使用
在ARMv6T2以及ARMv7架构扩展了Thumb指令集,其中加入了IT指令,进一步增强了代码的紧凑性。

Thumb中有一个比较有意思的指令——IT,这条指令用于根据指定的条件来执行后面相继的四条指令。

当然,Thumb-2中大部分算术逻辑指令都含有带条件执行的特征,不过Thumb-2是32位的。

如果你需要更紧凑的指令,那么使用Thumb结合ThumbEE来做带条件的指令执行还是不错的选择。

Thumb本身不具备带条件指令执行的特性。

IT指令的描述为:IT{<x>{<y>{<z>}}} <firstcond>
其中,<x>表示第二条指令的条件;<y>表示第三条指令的条件;<z>表示第四条指令的条件。

<firstcond>是条件操作数,表示第一条指令的条件。

<x>、<y>、<z>的标识其实就两种符号——T或E。

T表示Then,表示相应的指令所满足的条件与<firstcond>一致;E表示else,表示相应的指令所满足的条件与<firstcond>完全相反。

因此,对于第一条指令而言,总是为T的,因此不需要在IT中显示给出,它直接对应于<firstcond>的条件。

另外,在IT块中不能再使用IT指令。

即,相继的四条指令中不允许出现IT指令。

下面给出一些示例代码:
//
// hi.s
// test
//
// Created by zenny_chen on 13-5-8.
// Copyright (c) 2013年 zenny_chen. All rights reserved.
//
.text
.align 4
.globl _ThumbEETest, _ThumbEETest2
.thumb
.thumb_func
_ThumbEETest:
eor r1, r1, r1
eor r2, r2, r2
eor r3, r3, r3
eor r12, r12, r12
cmp r1, #0
itete eq
moveq r1, #10
movne r2, #20
moveq r3, #30
movne r12, #50
stmia r0, {r1-r3, r12}
bx lr
.thumb_func
_ThumbEETest2:
mov r1, #1
eor r2, r2, r2
eor r3, r3, r3
eor r12, r12, r12
cmp r1, #0
ittet gt
movgt r1, #10
movgt r2, #20
movle r3, #30 // 这里只能用le(表示小于等于),而不能用lt(表示小于)
movgt r12, #50
stmia r0, {r1-r3, r12}
bx lr。

相关文档
最新文档