thumb指令集
Thumb 指令集
❖ expr3 :表达式,为取值在-7~+7范围内的整数。(3位立即数)
❖ expr8 :表达式,为取值在-255~+255范围内的整数。(8位立 即数)
(2)ADD—高或低寄存器 将寄存器中的值相加,结果送回第一操作数寄存器。 指令格式:
ADD Rd,Rm 其中: ❖ Rd :目的寄存器,也是第一操作数寄存器。 ❖ Rm :第二操作数寄存器。 (3)ADD和SUB—SP SP加上或减去立即数常量。 指令格式:
CMP Rn, #expr
CMP Rn, Rm
CMN Rn, Rm
其中:
❖ Rn :第一操作数寄存器。 ❖ expr :表达式,其值(在汇编时)为在0~255范围内的整数 ❖ Rm :第二操作数寄存器。 (9)传送、传送非和取负(MOV、MVN和NEG) 指令格式:
MOV Rd, # expr
MOV Rd, Rm
(4)PUSH和POP 低寄存器和可选的LR进栈以及低寄存器和可选的PC出栈。 指令格式:
PUSH{reglist} POP{reglist} PUSH{reglist, LR} POP{reglist,PC} 其中:reglist:低寄存器的全部或其子集。 (5)LDMIA和STMIA 加载和存储多个寄存器。 指令格式:
❖ Thumb指令集合没有包含进行异常处理时需要的一些指令, 因此,在异常中断时还是需要使用ARM指令。
Thumb 寄存器和ARM寄存器之间的关系
1.Thumb 状态寄存器集是ARM状态寄存器的子集 程序员可以直接访问8个通用寄存器R0~R7、PC、 堆栈指针SP、链接寄存器LR和CPSR。 每个特权模式都有分组的SP 、LR和 SPSR。
Thumb 指令分类介绍
第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所列。
THUMB指令集
© MY2410 版权所有 未经许可 不得传播详情请咨询:xuphone@ mikenoodle@THUMB 指令集THUMB 指令集格式THUMB 指令集是ARM 指令集(32位格式)的一个16位版本。
ARM 指令集减少到16位的THUMB 指令集,同时也减少了许多指令功能。
THUMB 指令可以通过嵌在ARM920T 内核里的decompressor 来转换成为ARM 指令。
作为ARM 指令的压缩形式,THUMB 指令只有16位,同时收到一些限制。
当用到THUMB 指令时,这些16位指令限制会体现出来。
格式概要THUMB 指令集格式如下图:操作码概述下表示THUMB指令集的一个概要。
您可以通过查看表中最右栏的章节来得到更多相关信息。
© MY2410 版权所有未经许可不得传播详情请咨询:xuphone@ mikenoodle@© MY2410 版权所有 未经许可 不得传播详情请咨询:xuphone@ mikenoodle@格式1:move shifted 寄存器15 14 13 12 11 10 6 5 3 2 00 0 0 Op Offset5 RsRd [2:0]目标寄存器 [5:3]源寄存器 [10:6]立即数 [12:11]操作码 0=LSL 1=LSR 2=ASR 操作这些指令可以在低位寄存器之间传送移位值。
THUMB 汇编语法如下表:注:这些指令全都设置CPSR 的条件码的条件码。
指令周期这种格式的所有THUMB 指令都有等价的ARM 指令(如上表)。
这些THUMB 指令的指令周期和其相应等价的ARM 指令的指令周期是一样的。
例如: LSR R2,R5,#27 ;把R5内容逻辑右移27位并且存储到R2中。
在结果中设置条件码。
格式2:加法/减法15 14 13 12 11 10 9 8 6 5 3 2 00 0 0 1 1 1 Op Rn/Offset3 Rs Rd [2:0]目标寄存器 [5:3]源寄存器 [8:6]寄存器/立即数 [9]操作码 0=ADD 1=SUB [10]立即数标志 0=寄存器操作数 1=立即数操作数 操作这条指令可以让地位寄存器值或者一个三位立即数加到一个低位寄存器或者从一个id 为寄存器中减去。
第四章 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
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 指令集之:Thumb 编程模型
11.2Thumb编程模型所有的Thumb指令都是16位的。
它们都是ARM指
令重新编码得到的,所以继承了ARM指令集的许多特点。
①有数据处理、数据传送和流控制的指令结构。
②支持8位字节、16位半字和32位字数据类型,半字以两字节边界对齐,
字以4字节边界对齐。
③32位的无分段存储器(unsegmentedmemory)。
Thumb指令集除了继承了ARM指令集的一些特点外,与ARM指令集存在
以下一些差异。
①大多数Thumb指令为无条件执行指令(所有ARM指令都是条件执行的)。
②许多Thumb数据处理指令采用了2地址格式(目的寄存器与源寄存器相同)。
而ARM指令中除64位乘法指令外,其余指令均采用3地址模式。
③Thumb指令格式减少了很多ARM指令格式的限制,使Thumb指令编写的代码密度大大提高。
无论处理器处于什么状态,所有的异常都使处理器返回到ARM状态,并完
成异常处理。
但异常发生时,CPSR状态寄存器在进入异常时被保存到相应的SPSR中,当异常处理结束后,处理器将恢复到异常发生前的状态,并按照发
生异常时处理器的状态继续执行ARM或Thumb指令。
应该注意的是,ARM异常返回指令需要根据ARM流水线的行为对返回地址
进行调整。
由于Thumb指令是2字节长,而ARM指令是4字节长,所以由Thumb执行状态进入异常时其自然偏移量应与ARM不同(ARM状态下,拷
贝到链接寄存器的值PC-4)。
为了减少编程的复杂性,ARM体系结构中设置。
thumb指令集
①B指令——目标为Thumb代码
<Label> ——目标为ARM代码
1 10位偏移量 0
0
格式2:BLX
BLX指令执行时:
Rm——目标为ARM代码或Thumb代码
拷贝下一条指令的地址到LR寄存器。 引起处理器转移到label或Rm存储的地址。 如果Rm的位[0]清0,或使用格式1,则指令集切换到ARM状态。
(五)寄存器读取和存储指令
MOVS PC,LR ;当返回地址保存在LR时 STMFD SP!,{<registers>,LR} ;当返回地址保存在堆栈时,
…… …… ;进入异常后将R14入栈, ;假设异常前执行的是Thumb指令,PC保存于LR中
LDMFD SP!,{<registers>,PC} ^ ;返回指令
2、 Thumb状态进入ARM状态的方法
其中:Rm装有目的地址的ARM寄存器。Rm的位[0]不用于地址部分。 若Rm的位[0]清零,则: — 位[1]也必须清零; — 指令清零CPSR中的标志T,目的地址的代码被解释为ARM代码。 若Rm的位[0]置1,则: —目标地址的代码仍为Thumb代码。
④BLX指令
格式1:BLX
15 12 11 10 H 1 1 1 1
PUSH和POP——堆栈指令 和 堆栈指令
功能:低寄存器和可选的LR进栈。低寄存器和可选的PC出栈。 格式: PUSH { <Reglist> { , LR}} POP { <Reglist> { , PC}} 其中:Reglist 低寄存器范围的、用逗号隔开的列表。 注释: 1.Thumb堆栈是满递减堆栈,向下增长,且SP指向堆栈的 最后入口。 2.寄存器以数字顺序存储在堆栈中。最低数字的寄存器其 地址最低。 3.POP{reglist,PC}这条指令引起处理器转移到从堆栈弹出 给PC的地址。这通常是从子程序返回,其中LR在子程序开 头压进堆栈。 4.指令采用基址回写,因此基址寄存器不应出现在寄存器 列表中。
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指令集
转移链接产生两条格式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不同。 不同。 常时其自然偏移与 不同
thumb指令集 乘法指令
thumb指令集乘法指令在计算机体系结构中,thumb指令集是一种精简指令集(RISC)指令集体系结构,由ARM Holdings开发。
Thumb指令集的主要目标是提供更高的代码密度和较低的功耗,使得Thumb指令集在嵌入式系统和移动设备中得到广泛应用。
Thumb指令集中包含了一系列乘法指令,这些指令可以对寄存器中的值进行乘法操作,并将结果存储在其他寄存器中。
下面是一些常见的Thumb指令集中的乘法指令:1. MUL(Multiply)指令:MUL指令用于执行两个32位的有符号整数的乘法操作。
它的语法如下:```MUL Rd, Rm, Rs```其中Rd是目标寄存器,Rm和Rs是源寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果存储在目标寄存器Rd中。
2. MLA(Multiply Accumulate)指令:MLA指令用于执行两个32位的有符号整数的乘法操作,并将结果与第三个寄存器中的值相加。
它的语法如下:```MLA Rd, Rm, Rs, Rt```其中Rd是目标寄存器,Rm和Rs是源寄存器,Rt是要与乘法结果相加的寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果与寄存器Rt中的值相加,最后将结果存储在目标寄存器Rd中。
3. UMULL(Unsigned Multiply Long)指令:UMULL指令用于执行两个32位的无符号整数的乘法操作,并产生64位的结果。
该指令的语法如下:```UMULL RdLo, RdHi, Rm, Rs```其中RdLo和RdHi是目标寄存器,Rm和Rs是源寄存器。
该指令将寄存器Rm和Rs中的值相乘,并将结果的低32位存储在目标寄存器RdLo中,高32位存储在目标寄存器RdHi中。
这些乘法指令可以在Thumb指令集的上下文中使用,与其他指令结合使用,以执行复杂的计算操作。
由于Thumb指令集的特点是代码密度高,因此在嵌入式系统和移动设备的应用中,乘法指令的优化和性能对于提高系统性能和功耗效率非常重要。
thumb指令集
thumb指令集thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。
thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问cpsr或spsr的指令。
1. 存储器访问指令(1)dr和str--立即数偏移加载寄存器和存储寄存器。
存储器的地址以一个寄存器的立即数偏移(immediate offset)指明。
指令格式: op rd, n,#immed_5×4] oph rd, n,#immed_5×2] opb rd, n,#immed_5×1] 其中: op:为dr或str。
h:指明无符号半字传送的参数。
b:指明无符号字节传送的参数。
rd:加载和存储寄存器。
rd 必须在r0~r7范围内。
rn:基址寄存器。
rn 必须在r0~r7范围内。
immed_5×n:偏移量。
它是一个表达式,其取值(在汇编时)是n的倍数,在(0~31)*n范围内,n=4、2、1。
str:用于存储一个字、半字或字节到存储器中。
dr:用于从存储器加载一个字、半字或字节。
rn:rn中的基址加上偏移形成操作数的地址。
立即数偏移的半字和字节加载是无符号的。
数据加载到rd的最低有效字或字节,rd 的其余位补0。
字传送的地址必须可被4整除,半字传送的地址必须可被2整除。
指令示例:dr r3,5,#0] strb r0,3,#31] strh r7,3,#16] drb r2,4,#1abe-{pc}](2)dr和str--寄存器偏移加载寄存器和存储寄存器。
用一个寄存器的基于寄存器偏移指明存储器地址。
指令格式: op rd,n,rm] 其中,op 是下列情况之一: dr:加载寄存器,4字节字。
str:存储寄存器,4字节字。
drh:加载寄存器,2字节无符号半字。
drsh:加载寄存器,2字节带符号半字。
strh:存储寄存器,2字节半字。
drb:加载寄存器,无符号字节。
第四章、Thumb指令集 4
• 例子:
PUSH {R0,R3,R5} PUSH {R1,R4-R7} PUSH {R0,LR} POP {R2,R5} POP {R0-R7,PC} PUSH {R3,R5-R8} PUSH { } PUSH {R1-R4,PC} POP {R1-R4,LR}
× × × ×
5.
• • •
LDMIA和STMIA
× × × × × ×
4. PUSH和POP
• • 低寄存器和可选的LR进栈以及低寄存器和可选的PC 出栈。 句法:
PUSH {reglist} POP {reglist} PUSH {reglist,LR} POP {reglist,PC} 其中,reglist为低寄存器或低寄存器范围的、用逗号隔开的列 表。 {…}是指令格式的一部分。它们不代表指令列表可选。列表中至 少必须有一个寄存器。
•
• • •
加法和减法。对于低寄存器操作,各有3种形式:
两个寄存器的内容相加或相减,结果放在第3个寄存器中。 寄存器中的值加上或减去一个小整数,结果放到另一个不 同的寄存器中。 寄存器中的值加上或减去一个大整数,结果放回同一个寄 存器中。
•
句法:
op Rd,Rn,Rm op Rd,Rn,#expr3 op Rd,#expr8 其中:expr3:表达式,为取值在-7~+7范围内的整数。 expr8:表达式,为取值在-255~+255范围内的整数。 Rd、Rn和Rm必须是低寄存器(R0~R7)
• 用法:
Expr3或expr8为负值的ADD指令汇编成相对应的带正 数常量的SUB指令。 Expr3或expr8为负值的SUB指 令汇编成相对应的带正数常量的ADD指令。 这些指令更新标志N、Z、C和V。
4第四章 Thumb 指令集
26
单寄存器数据存取指令(LDR和STR)
二进制编码如下:
27
单寄存器数据存取指令(LDR和STR)
汇编格式如下: <op> Rd,[Rn,<#off5>] <op> Rd,[Rn,<#off5>] ;<op> = LDR|LDRB|STR|STRB ;<op> = LDRH| STRH
<op> Rd,[Rn,Rm]
7
4.2 Thumb指令集详细介绍
16位Thumb指令集是从32位ARM指令集提取指令格 式的,每条 Thumb 指令有相同处理器模型所对应的 32位ARM指令。 数据处理指令 转移指令 Load/Store指令 异常中断指令
8
4.2.1 Thumb数据处理指令
Thumb 数据处理指令包括一组高度优化且相当复杂 的指令,范围涵盖编译器通常需要的大多数操作。 ARM 指令支持在单条指令中完成一个操作数的移位 及 一 个 ALU 操 作 , 但 Thumb 指 令 集 将 移 位 操 作 和 ALU操作分离为不同的指令。本部分从以下几个方面 介绍: 数据处理指令的二进制编码
数据处理指令的分类
ARM指令与Thumb指令比较
9
数据处理指令
数据处理指令的二进制编码如下图:
10
数据处理指令
按照数据处理指令的功能,可以将其分为以下几类: 算术运算指令,它又分为以下几类:
ADD与SUB—低寄存器加法和减法 ADD—高或低寄存器
ADD与SUB—SP
ADD—PC或SP相对偏移 ADC,SBC和MUL
4.1.4Thumb指令集特点
Thumb指令继承了ARM指令集的许多特点
三、Thumb指令
LDRSB
Rd,addressing
加载有符号字节数据
无
• Thumb存储器访问指令
•LDR和STR——加载/存储指令
根据指令的寻址方式不同,可以分为以下三类:
立即数偏移寻址; 寄存器偏移寻址; PC或SP相对偏移寻址;
• 单寄存器访问指令——立即数偏移寻址
以这种寻址方式对存储器访问时,存储器的地址以 一个寄存器的内容为基址,在偏移一个立即数后指明。 指令格式如下:
LDR STR LDRH STRH LDRB STRB Rd,[Rn,#immed_5×4] ;加载内存中的字数据到寄存器Rd中 Rd,[Rn,#immed_5×4] ;将Rd中的字数据存储到指定地址的内存中 Rd,[Rn,#immed_5×2] ;加载内存中的半字数据到寄存器Rd的低16位中 Rd,[Rn,#immed_5×2] ;存储Rd中的低16位半字数据到指定的内存单元 Rd,[Rn,#immed_5×1] ;加载内存中的字节数据到寄存器Rd中 Rd,[Rn,#immed_5×1] ;存储Rd中的低8位字节数据到指定的内存单元
b.Thumb状态下数据处理指令访问R8-R15会受到一定限制
(只有MOV、ADD和CMP可以);
c.使用R0-R7的数据处理指令总是更新条件标志位,访问
R8-R15的数据处理指令不能更新条件标志位;
d.加载和存储指令只能访问R0-R7,且访问普通存储区只能使
用LDMIA和STMIA,访问堆栈区只能使用PUSH和POP(堆栈为满
;保存到R2~R7中, R0的值更新。
STMIA R1!,{R2-R7} ;将R2~R7的数据存储到R1指向的 ;地址上,R1值更新
Thumb指令小节目录
1.Thumb指令集与ARM指令集的区别 2.存储器访问指令 3.数据处理指令 4.分支指令 5.杂项指令 6.伪指令
常用arm指令集
常用ARM指令集一、ARM架构简介ARM(Advanced RISC Machine)是一种精简指令集计算机(Reduced Instruction Set Computer,RISC)架构,广泛应用于移动设备、嵌入式系统和主流服务器等领域。
ARM架构的优点包括高效能、高能效、低成本和高可伸缩性,适用于各种应用场景。
二、ARM指令集分类ARM指令集根据其特点和功能可以分为三大类:基本指令集、乘累加指令集和浮点指令集。
1. 基本指令集(ARM和Thumb指令集)基本指令集是ARM架构最基础的指令集,包含大部分常用的数据处理指令、控制指令和访存指令等。
ARM指令集的指令长度为32位。
Thumb指令集是ARM架构的一个变种,指令长度为16位。
Thumb指令集在ARMv4架构引入,用于提高代码密度,适用于存储空间有限的设备。
2. 乘累加指令集(ARM和Thumb-2指令集)乘累加指令集是基于基本指令集的扩展,加入了乘法和累加指令等。
乘累加指令集可以提高乘法和累加运算的效率,适用于需要大量复杂计算的应用。
Thumb-2指令集是Thumb指令集的进一步扩展,兼容Thumb指令集,并增加了32位指令。
Thumb-2指令集使得ARM架构在相同存储空间下能够提供更高的性能。
3. 浮点指令集(VFP和NEON指令集)浮点指令集主要用于进行浮点数运算。
VFP(Vector Floating Point)指令集是ARM架构最早引入的浮点技术,支持单精度和双精度浮点数运算。
NEON指令集是ARM架构后续引入的SIMD(Single Instruction, Multiple Data)指令集,用于提高并行处理能力和多媒体应用性能。
三、常用ARM指令以下是常用的ARM指令及其功能:1.数据处理指令–加法指令:ADD、ADC(带进位的加法指令)–减法指令:SUB、SBC(带借位的减法指令)–乘法指令:MUL、SMULL(有符号乘法指令)、UMULL(无符号乘法指令)–除法指令:SDIV(有符号除法指令)、UDIV(无符号除法指令)–移位指令:LSL(逻辑左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)2.控制指令–条件分支指令:B(无条件分支指令)、BEQ(等于零条件分支指令)、BNE(不等于零条件分支指令)等–无条件分支指令:BX(无条件跳转指令,用于实现函数调用)–跳转指令:BL(带链接跳转指令,用于实现函数调用,并将返回地址保存在链接寄存器中)3.访存指令–数据传送指令:LDR(加载指令,用于将数据从内存中加载到寄存器中)、STR(存储指令,用于将数据从寄存器中存储到内存中)–堆栈指令:PUSH(将数据压入堆栈)、POP(将数据从堆栈中弹出)–字节和半字操作指令:LDRB(加载字节指令)、LDRH(加载半字指令)、STRB(存储字节指令)、STRH(存储半字指令)4.特殊指令–中断指令:SWI(软中断指令,用于触发软件中断)–协处理器指令:CDP(协处理器数据处理指令)、MCR、MRC(协处理器寄存器传递指令)四、ARM指令优化技巧为了提高ARM指令执行效率和代码性能,可以采取以下优化技巧:1.使用适当的数据处理指令,避免不必要的指令执行和数据拷贝。
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。
第3章 ARM微处理器的指令系统5-Thumb指令
指令格式: B 语句标号
语句标号通常在同一程序段内,地址范围不超过±2048 字节; 以PC为基址的相对偏移跳转,跳转方向可以向前,也可 以向后; 语句标号处的地址必须是半字对齐的。
16
3.6.4.2 条件分支指令
条件分支指令B能够使程序产生一次有条件跳转。
指令格式: B{cond} 语句标号
语句标号通常在同一程序段内,地址范围不超过±254 字节; cond是条件后缀,共14种; 指令满足条件时分支跳转,否则不分支; 以PC为基址的相对偏移跳转,跳转方向可以向前,也可 以向后; 语句标号处的地址必须是半字对齐的。
17
3.6.4.3 带链接的长分支指令
指令格式: BL 语句标号
11
12
3.6.3.7栈操作指令 指令:PUSH, POP
用于在寄存器和存储器之间进行成组的数据传送,其地址表达式是隐含的 堆栈指针。
指令格式: PUSH/POP PUSH POP
LR是链接寄存器; PC是程序计数器; 寄存器列表是从R0~R7的任意组合,寄存器分隔使用逗号; 堆栈指针是隐含的地址基址,Thumb指令中的堆栈是满栈递减的,堆栈 向下增长,堆栈指针总是指向最后入栈的数据; 寄存器在列表中是从小到大排列,无论加载还是存储,最小寄存器总是指 向最初的基址地址; 但使用POP指令且PC出现在列表中时,从栈区赋给PC的数据将引起程序 的跳转,这只能用在子程序的返回。
Opcode是操作指令; Rd是Thumb指令集的通用寄存器R0~R7,保存操作结 果; Rs是源寄存器R0~R7,其中的数值是Rd移位的位数; 会刷新程序状态寄存器的条件标志。
28
Thumb指令集之: Thumb跳转指令
Thumb 指令集之:Thumb 跳转指令
11.3Thumb跳转指令Thumb指令集中的跳转指令分以下6种类型。
①无条件跳转,其跳转空间为±2KB。
②条件跳转,其跳转空间为±256B。
③带返回的跳转指令,其跳转空间为±4MB。
④带状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。
⑤带返回和状态切换的跳转指令(是否进行状态切换可以在程序中设定选择)。
⑥第二种形式的带返回和状态切换的跳转指令。
下面详细介绍各指令的特点及用途。
11.3.1跳转指令BThumb中有两个分支跳转指令的变体,第一个变体与ARM 版本指令相似,可条件执行,跳转被限制在有符号8位立即数所表示的范围内,或者是±256B。
第二个变体不可条件执行(没有条件码部分),但扩展了有效跳转范围,跳转范围为有符号11位立即数表示的范围,即
±2048B。
条件分支指令是Thumb指令中惟一可以条件执行的指令。
首先来介绍可条件执行的跳转指令B(1)。
(1)编码格式
可条件执行的跳转指令的编码格式如图11.1所示。
图11.1B(1)指令编码格式
(2)指令的语法格式
Bcondtarget_address。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指令格式的一部分,它们不代表指令列表可选,列表中至少应有1个寄存器。寄存器以数字顺序加载或存储,最低数字的寄存器在rn的初始地址中。 rn的值以regist中寄存器个数的4 倍增加。若rn在寄存器列表中,则: 对于dmia指令,rn的最终值是加载的值,不是增加后的地址。 对于stmia指令,rn存储的值有两种情况:若rn是寄存器列表中最低数字的寄存器,则rn存储的值为rn的初值;其他情况则不可预知,当然,regist中最好不包括rn。
指令格式: op rd, n,#immed_5×4] oph rd, n,#immed_5×2] opb rd, n,#immed_5×1] 其中: op:为dr或str。 h:指明无符号半字传送的参数。 b:指明无符号字节传送的参数。 rd:加载和存储寄存器。rd 必须在r0~r7范围内。 rn:基址寄存器。rn 必须在r0~r7范围内。 immed_5×n:偏移量。它是一个表达式,其取值(在汇编时)是n的倍数,在(0~31)*n范围内,n=4、2、1。 str:用于存储一个字、半字或字节到存储器中。 dr:用于从存储器加载一个字、半字或字节。 rn:rn中的基址加上偏移形成操作数的地址。 立即数偏移的半字和字节加载是无符号的。数据加载到rd的最低有效字或字节,rd 的其余位补0。 字传送的地址必须可被4整除,半字传送的地址必须可被2整除。
指令示例: adc r2,r4 sbc r0,r1 mu r7,r6
(6)按位逻辑操作and、orr、eor和bic
指令格式: op rd,rm 其中: op为and、orr、eor或bic。 rd:目的寄存器,它也包含第一操作数,rd必须在r0~r7范围内。 rm:第二操作数寄存器,rm 必须在r0~r7范围内。 这些指令用于对rd和rm中的值进行按位逻辑操作,结果放在rd 中,操作如下: and:进行逻辑“与”操作。 orr:进行逻辑“或”操作。 eor:进行逻辑“异或”操作。 bic:进行“rd and not rm”操作。 这些指令根据结果更新标志n和z。 程序示例: and r1,r2 orr r0,r1 eor r5,r6 bic r7,r6
thumb指令集分为:分支指令、数据传送指令、单寄存器加载和存储指令以及多寄存器加载和存储指令。thumb指令集没有协处理器指令、信号量(semaphore)指令以及访问cpsr或spsr的指令。
1. 存储器访问指令
(1)dr和str--立即数偏移 加载寄存器和存储寄存器。存储器的地址以一个寄存器的立即数偏移(immediate offset)指明。
指令示例: dmia r3!,{r0,r4} dmia r5!,{r0~r7} stmia r0!,{r6,r7} stmia r)add和sub--低寄存器 加法和减法。对于低寄存器操作,这2条指令各有如下3种形式: 两个寄存器的内容相加或相减,结果放到第3个寄存器中。 寄存器中的值加上或减去一个小整数,结果放到另一个不同的寄存器中。 寄存器中的值加上或减去一个大整数,结果放回同一个寄存器中。
指令示例: dr r2,,r5] drsh r0,0,r6] strb r,7,r0]
(3)dr和str--pc或sp相对偏移 加载寄存器和存储寄存器。用pc或sp中值的立即数偏移指明存储器中的地址。没有pc相对偏移的str指令。
指令格式: dr rd,c,#immed_8×4] dr rd,be dr rd,sp,#immed_8×4] str rd, p,#immed_8×4] 其中: immed_8×4:偏移量。它是一个表达式,取值(在汇编时)为4的整数倍,范围在0~1020之间。 abe:程序相对偏移表达式。abe必须在当前指令之后且1kb范围内。 str:将一个字存储到存储器。 dr:从存储器中加载一个字。 pc或sp的基址加上偏移量形成存储器地址。pc的位]被忽略,这确保了地址是字对准的。字或半字传送的地址必须是4的整数倍。
指令示例: add r12,r4
(3)add和sub--sp sp加上或减去立即数常量。
指令格式: add sp,#expr sub sp,#expr 其中:expr为表达式,取值(在汇编时)为在-508~+508范围内的4的整倍数。 该指令把expr的值加到sp 的值上或用sp的值减去expr的值,结果放到sp中。 expr为负值的add指令汇编成相对应的带正数常量的sub指令。expr为负值的sub指令汇编成相对应的带正数常量的add指令。 这条指令不影响条件码标志。
指令示例: dr r3,5,#0] strb r0,3,#31] strh r7,3,#16] drb r2,4,#1abe-{pc}]
(2)dr和str--寄存器偏移 加载寄存器和存储寄存器。用一个寄存器的基于寄存器偏移指明存储器地址。
指令格式: op rd,n,rm] 其中,op 是下列情况之一: dr:加载寄存器,4字节字。 str:存储寄存器,4字节字。 drh:加载寄存器,2字节无符号半字。 drsh:加载寄存器,2字节带符号半字。 strh:存储寄存器,2字节半字。 drb:加载寄存器,无符号字节。 drsb:加载寄存器,带符号字节。 strb:存储寄存器,字节。 rm:内含偏移量的寄存器,rm必须在r0~r7范围内。 带符号和无符号存储指令没有区别。 str指令将rd中的一个字、半字或字节存储到存储器。 dr指令从存储器中将一个字、半字或字节加载到rd。 rn中的基址加上偏移量形成存储器的地址。 寄存器偏移的半字和字节加载可以是带符号或无符号的。数据加载到rd的最低有效字或字节。对于无符号加载,rd的其余位补0;或对于带符号加载,rd的其余位复制符号位。字传送地址必须可被4整除,半字传送地址必须可被2整除。
(7)移位和循环移位操作asr、s、sr和ror thumb指令集中,移位和循环移位操作作为独立的指令使用,这些指令可使用寄存器中的值或立即数移位量。
指令格式: op rd,rs op rd,rm,#expr 其中: op是下列其中之一: asr:算术右移,将寄存器中的内容看做补码形式的带符号整数。将符号位复制到空出位。 s:逻辑左移,空出位填零。 sr:逻辑右移,空出位填零。 ror:循环右移,将寄存器右端移出的位循环移回到左端。ror仅能与寄存器控制的移位一起使用。 rd:目的寄存器,它也是寄存器控制移位的源寄存器。rd必须在r0~r7范围内。 rs:包含移位量的寄存器,rs必须在r0~r7范围内。 rm:立即数移位的源寄存器,rm必须在r0~r7范围内。 expr:立即数移位量,它是一个取值(在汇编时)为整数的表达式。整数的范围为:若op是s,则为0~31;其他情况则为1~32。 对于除ror以外的所有指令: 若移位量为32,则rd清零,最后移出的位保留在标志c中。 若移位量大于32,则rd和标志c均被清零。 这些指令根据结果更新标志n和z,且不影响标志v。对于标志c,若移位量是零,则不受影响。其他情况下,它包含源寄存器的最后移出位。
指令示例: add r6,sp,#64 add r2,pc,#980
(5)adc、sbc和mu 带进位的加法、带进位的减法和乘法。
指令格式: op rd,rm 其中: op为adc、sbc或mu。 rd:目的寄存器,也是第一操作数寄存器。 rm:第二操作数寄存器,rd、rm必须是低寄存器。 adc 将带进位标志的rd和rm的值相加,结果放在rd中,用这条指令可组合成多字加法。 sbc考虑进位标志,从rd值中减去rm的值,结果放入rd中,用这条指令可组合成多字减法。 mu进行rd和rm值的乘法,结果放入rd 中。 rd和rm必须是低寄存器(r0~r7)。 adc和sbc更新标志n、z、c和v。mu更新标志n和z。 在armv4及以前版本中,mu会使标志c和v不可靠。在armv5及以后版本中,mu不影响标志c和v。
指令示例: add r3,r,r5 sub r0,r4,#5 add r7,#201
(2)add--高或低寄存器 将寄存器中值相加,结果送回到第一操作数寄存器。
指令格式: add rd,rm 其中: rd:目的寄存器,也是第一操作数寄存器。 rm:第二操作数寄存器。 这条指令将rd和rm中的值相加,结果放在rd中。 当rd和rm都是低寄存器时,指令“add rd,rm”汇编成指令“add rd,rd,rm”。若rd和rm是低寄存器,则更新条件码标志n、z、c 和v;其他情况下这些标志不受影响。
指令示例: dr r2,c,#1016] dr r5,ocadata dr r0,p,#920] str r,p,#20]
(4)push和pop 低寄存器和可选的r进栈以及低寄存器和可选的pc出栈。
指令格式: push {regist} pop {regist} push {regist,r} pop {regist,pc} 其中: regist:低寄存器的全部或其子集。 括号是
指令格式的一部分,它们不代表指令列表可选。列表中至少有1个寄存器。thumb堆栈是满递减堆栈,堆栈向下增长,且sp指向堆栈的最后入口。寄存器以数字顺序存储在堆栈中。最低数字的寄存器存储在最低地址处。 pop {regist,pc}这条指令引起处理器转移到从堆栈弹出给pc的地址,这通常是从子程序返回,其中r在子程序开头压进堆栈。这些指令不影响条件码标志。
指令格式: op rd,rn,rm op rd,rn,#expr3 op rd,#expr8 其中: op为add或sub。 rd:目的寄存器。它也用做“op rd,#expr8”的第1个操作数。 rn:第一操作数寄存器。 rm:第二操作数寄存器。 expr3:表达式,为取值在-7~+7范围内的整数(3位立即数)。 expr8:表达式,为取值在-255~+255范围内的整数(8位立即数)。 “op rd,rn,rm”执行rn+rm或rn-rm操作,结果放在rd中。 “op rd,rn,#expr3”执行rn+expr3或rn-expr3操作,结果放在rd中。 “op rd,#expr8”执行rd+expr8或rd-expr8操作,结果放在rd中。 expr3或expr8为负值的add指令汇编成相对应的带正数常量的sub指令。expr3或expr8为负值的sub指令汇编成相对应的带正数常量的add指令。 rd、rn和rm必须是低寄存器(r0~r7)。 这些指令更新标志n、z、c和v。