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中有)。

  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。

相关文档
最新文档