ARM程序和Thumb程序混合使用
ARM开发入门教程09_Thumb指令
TM
4
4
特点
与ARM指令集相比,Thumb指令集有如下特点:
● Thumb指令集没有协处理器指令,信号量指令,乘加指令,
64位乘法指令以及访问CPSR或SPSR的指令,而且指令的第2操作 数受到限制。
● 除了分支指令B有条件指令功能外,其他指令均为无条件指令。
Tony vopo123@
TM
15
15
• 数据传送指令— — MVN
MVN指令将寄存器Rm按位取反后传送到目标寄存器Rd 中。指令的执行会更新N和Z标志,对标志C和V无影响。其指 令格式如下:
MVN Rd,Rm
其中:Rd 目标寄存器。MOV Rd,#expr时,Rd必须在R0~R7之间。 Rm 源寄存器。为R0~R15。
应用示例: NEG R1,R0 ; R1=-R0
Tony vopo123@
TM
19
19
Thumb数据处理指令—
— 算术逻辑运算指令
算术逻辑指令包括以下几类: 算术指令 逻辑运算指令 移位指令 比较指令
Tony vopo123@
TM
20
20
• 算术运算指令— — ADD
其中:Rd 目标寄存器。MOV Rd,#expr时,Rd必须在R0~R7之间。 exper 8位立即数,即0~255。 Rm 源寄存器。为R0~R15。
指令编码(立即数传送)
指令编码(寄存器传送)
Tony vopo123@
TM
14
14
• 数据传送指令— — MOV
注意: “ MOV Rd,#expr” 指令会更新N和Z标志,对标志C和V无影响。 “ MOV Rd,Rm” 指令,若Rd或Rm是高寄存器(R8~R15),则标志不 受影响,若Rd或Rm都是低寄存器(R0~R7),则更新标志N和Z,且清除 标志C和V。 应用示例: MOV MOV MOV R1,#0x10 R0,R8 PC,LR ; R1=0x10 ; R0=R8 ; PC=LR,子程序返回
第六章、ARM和Thumb程序混编及其与C语言的接口 6
成映像文件。 4. 用armsd addreg加载该映像文件。 5. 通过step单步跟踪该程序。
二、C/C++以及汇编语言的混合编 程
• 内嵌汇编器的使用 • 从汇编程序中访问C程序变量 • 汇编程序、C程序以及C++程序的相互调用
使用或者禁止异常中断。
• 当处理器进入异常中断处理程序时,程序自 动切换到ARM状态。
• ARM处理器总是从ARM状态开始执行。
2. 在编译或汇编时使用选项-apcs/interwork
如果目标代码包含以下内容,应该在编译和汇编时 使用选项-apcs/interwork。
• 需要返回到ARM状态的Thumb子程序。 • 需要返回到Thumb状态的ARM子程序。 • 间接地调用ARM子程序的Thumb子程序。 • 间接地调用Thumb子程序的ARM子程序。
内嵌汇编器的使用
• 内嵌汇编器指的是包含在C/C++编译器中的 汇编器。使用内嵌汇编器后,可以在C/C++ 源程序中直接使用大部分的ARM指令和 Thumb指令。
• 使用内嵌汇编器可以在C/C++程序中实现 C/C++语言不能完成的一些操作;同时程序 的代码效率也比较高。
• 内嵌的汇编指令包括大部分的ARM和 Thumb指令,但由于它嵌在C/C++中使 用,在用法上有一些新的特点。
得程序返回到和调用者相同的状态。
汇编语言程序状态切换的指 令是BX
• 从ARM版本5开始,下面的指令也可以实现 程序状态的切换:
atpcs
ARM和THUMB混合调用
ARM程序和Thumb程序混合使用
• 如果程序遵守支持ARM程序和Thumb程序 混合使用的ATPCS,则程序中ARM子程序 和Thumb子程序可以相互调用。对于C/ C++源程序而言,只要在编译时指定apcs /interwork选项,编译器生成的代码会自 动遵守支持ARM程序和Thumb程序混合使 用的ATPCS。而对于汇编源程序而言,必 须保证编写的代码遵守支持ARM程序和 Thumb程序混合使用的ATPCS。
ATPCS介绍
• ATPCS规定数据栈为FD类型,并且对数据 栈的操作是8字节对齐的。 • 异常中断的处理程序可以使用被中断程序 的数据钱,这时用户要保证中断的程序的 数
12
ATPCS介绍
参数传递规则
• 根据参数个数是否固定可以将子程序分为 参数个数固定的(nonvariadic)子程序和参数 个数可变的(variadic)子程序。这两种子程 序的参数传递规则是不同的 • 参数个数可变的子程序参数传递规则: • 对于参数个数可变的子程序,当参数不超 过4个时,可以使用寄存器R0~R3来传递参 数;当参数超过4个时,还可以使用数据栈 来传递参数。 • 在参数传递时,将所有参数看作是存放在 13 连续的内存字单元中的宇数据。然后,依
R4
9
v1
局部变量寄存器2
ATPCS介绍
寄存 器
别 名
特殊名 称
使用规则
R3
A4
参数/结果/scratch寄存器4
R2
A3
参数/结果/scratch寄存器3
R1
A2
参数/结果/scratch寄存器2
R0
A1
参数/结果/scratch寄存器1
ARM实验报告--Thumb
XI`AN TECHNOLOGICAL UNIVERSITY 实验报告西安工业大学实验报告一丶实验目的通过实验掌握ARM处理器16位Thumb汇编指令使用方法二、实验内容使用Thumb汇编语言,完成基本reg/men访问,以及简单的算术/逻辑运算。
使用Thumb汇编语言,完成较为复杂的程序分支,领会立即数大小的限制,并体会ARM与Thunb的区别。
三、实验原理ARM 处理器共有两种工作状态:ARM:32 位,这种状态下执行字对准的ARM 指令;Thumb:16 位,这种状态下执行半字对准的Thumb 指令在Thumb 状态下,程序计数器PC 使用位1 选择另一个半字。
注意: ARM 和Thumb 之间状态的切换不影响处理器的模式或寄存器的内容。
ARM 处理器在两种工作状态之间可以切换。
1)进入Thumb 状态。
当操作数寄存器的状态位0 为1 时,执行BX 指令进入Thumb 状态。
如果处理器在Thumb 状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort 和SWI)返回时,自动切换到Thumb 状态。
2) 进入ARM 状态。
当操作数寄存器的状态位0 为0 时,执行BX 指令进入ARM 状态。
处理器进行异常处理(IRQ,FIQ,Undef,Abort 和SWI)。
在此情况下,把PC 方入异常模式链接寄存器中。
从异常向量地址开始执行也可以进入ARM 状态。
四、实验过程1)打开Embest IDE Pro软件,选择菜单项File-->New Workspace,系统弹出对话框,创建名为TEXT的新工程,并同时创建一个与工程名相同的工作区。
此时在工作窗口将打开该工作区和工程。
2)建立源文件:点击菜单项File-->New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位玉窗口中第一行,将程序所需的源文件代码输入,编辑完后,进行保存,保存文件格式为_a.s文件。
3)添加源文件:选择Project-->Add To Project-->File命令,弹出文件选择对话框,在工程目录下选择刚才建立的_a.s格式的源文件4)基本配置:选择菜单项Project-->Settings,弹出工程设置对话框,在工程设置对话框中,选择Processor设置对话框,选择ARM7对目标板所用处理器进行配置。
ARM状态和Thumb状态间的切换
ARM状态和Thumb状态间的切换
带状态切换的跳转指令:BX
汇编格式: BX{<cond>} Rm
功能: BX 指令跳转到指令中所指定的⽬标地址,并实现状态的切换。
Rm 是⼀个表达⽬标地址的寄存器。
当Rm 中的最低位Rm[0] 为1 时,强制程序从ARM 指令状态跳到Thumb 指令状态;当 Rm 中的最低位Rm[0]为0 时,强制程序从Thumb 指令状态跳到ARM 指令状态。
BX 指令⽰例
CODE32 ;ARM 程序段,32 位编码
arm1 ADR R0,thumb1+1 ;伪指令,把语句标号thumb1 所在地址
;赋给R0 ,末位R0[0] 置1 ,要跳转THUMB 指令集
;THUMB 指令集
MOV LR,PC ;设置返回地址
BX R0 ;跳转
ADD R1,R2,#2 ;返回地址处,第4 条指令
CODE16 ;THUMB 程序段, 16 位编码
thumb1 ADD R1,R3,#1 ;THUMB 程序
…
BX LR ;跳转到返回地址处,执⾏第4 条指令
分析:该例说明了带状态切换的⼦程序调⽤和返回的结构,ARM 程序段执⾏MOV LR,PC 语句时将返回地址保存到了LR 寄存器中。
执⾏到BX 语句时,PC 指向下⼀个要执⾏的语句,此时PC(R15) 中的值为下⼀个语句ADD 指令所在的地址,并根据R0 中的bit[0] 实现了由ARM 状态切换到Thumb 状态。
从⽽调⽤Thumb ⼦程序,⼦程序调⽤完后使⽤BX LR 指令,从⽽实现了⼦程序调⽤的返回并切换到ARM 状态。
ARM开发板使用手册
ARM开发板使用手册PHILIP LPC2132ARM7TDMI第一章介绍LPC2132开发板是专门为arm 初学者开发的实验板,用户可以做基础的arm实验,也可以做基于ucos-ii的操作系统实验。
本系统的实验源代码全部开放,用户可以在此基础上开发产品,减少重复劳动。
由于LPC2132体积很小,并且功能强大,因此特别适合需要复杂智能控制的场合,其运行速度高于早期的80486计算机,而体积只有指甲大。
我们已经将LPC2132产品成功应用在干扰比较强的工业场合,经过6个月的运行,各项指标符合要求。
因此我们特别推荐这一款开发板作为ARM初学者入门。
由于此款开发板体积很小,非常适合直接应用在工业以及民用智能控制器的场合。
LPC2132 CPU介绍LPC2131/2132/2138 是基于一个支持实时仿真和跟踪的16/32 位ARM7TDMI-STM CPU,并带有32kB、64kB 和512kB 嵌入的高速Flash 存储器。
128 位宽度的存储器接口和独特的加速结构使32 位代码能够在最大时钟速率下运行。
对代码规模有严格控制的应用可使用16 位Thumb 模式将代码规模降低超过30%,而性能的损失却很小。
较小的封装和很低的功耗使LPC2131/2132/2138 特别适用于访问控制和POS 机等小型应用中;由于内置了宽范围的串行通信接口和8/16/32kB 的片内SRAM,它们也非常适合于通信网关、协议转换器、软件modem、语音识别、低端成像,为这些应用提供大规模的缓冲区和强大的处理功能。
多个32 位定时器、1个或2 个10 位8 路的ADC、10 位DAC、PWM 通道、47 个GPIO 以及多达9 个边沿或电平触发的外部中断使它们特别适用于工业控制应用以及医疗系统。
主要特性●●16/32 位ARM7TDMI-S 核,超小LQFP64 封装。
●●8/16/32kB 的片内静态RAM 和32/64/512kB 的片内Flash 程序存储器。
实践-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建⽴⼯程⽂件,输⼊程序代码。
《2024年兼容ARMThumb指令的多指令集处理器技术研究》范文
《兼容ARMThumb指令的多指令集处理器技术研究》篇一一、引言随着移动计算和嵌入式系统的发展,处理器技术已成为推动科技进步的关键因素。
其中,ARM处理器因其高效能、低功耗的特性,在移动设备和嵌入式系统中得到了广泛应用。
本文将重点研究兼容ARMThumb指令的多指令集处理器(MIS)技术,探讨其设计原理、实现方法和应用前景。
二、ARMThumb指令简介ARMThumb指令集是ARM公司为低功耗、低成本应用开发的一种精简指令集。
它采用Thumb-2技术,能够在保持代码密度的同时,提供与ARM指令集相似的性能。
Thumb指令集的兼容性对于多指令集处理器设计具有重要意义。
三、多指令集处理器(MIS)概述多指令集处理器(MIS)是一种能够同时支持多种指令集的处理器。
通过采用不同的指令集,MIS能够根据应用需求灵活调整处理器的性能和功耗。
MIS的设计涉及到多个方面的技术,包括指令集设计、处理器架构、硬件实现等。
四、兼容ARMThumb指令的多指令集处理器设计(一)设计原则在设计兼容ARMThumb指令的多指令集处理器时,需要遵循以下原则:1. 兼容性:处理器应能够支持多种指令集,包括ARMThumb 指令集。
2. 性能:在保证兼容性的同时,处理器应具备较高的性能。
3. 功耗:考虑到移动设备和嵌入式系统的特点,处理器的功耗应尽可能低。
(二)设计方法1. 指令集设计:根据应用需求,设计适合的指令集。
在ARMThumb指令集的基础上,可以进一步优化和扩展。
2. 处理器架构:根据指令集的特点,设计合理的处理器架构。
包括流水线设计、缓存设计、寄存器文件设计等。
3. 硬件实现:采用先进的半导体工艺和电路设计技术,实现处理器的硬件电路。
五、实现方法与技术挑战(一)实现方法1. 硬件实现:采用ASIC或FPGA等技术,实现处理器的硬件电路。
2. 软件实现:通过编写编译器和操作系统等软件,支持多种指令集的运行。
(二)技术挑战1. 兼容性:如何保证处理器能够同时支持多种指令集,且不会产生兼容性问题。
ARM开发与应用 第四讲 Thumb指令集
制指令等。
支持8位字节、16位半字和32位字数据类型,半
字以两字节边界对准,字以4字节边界对准。
Thumb-ARM差异处: 大多数Thumb指令是无条件执行的,所有 ARM指令都是条件执行的。 许多Thumb数据处理指令采用2地址格式 (目的寄存器与一个源寄存器相同),ARM 数据处理指令大多采用3地址格式。 ADD R0,R1 由于采用高密度编码,Thumb指令格式没 有ARM指令格式规则。
应用示例: SUB SP,#-380 ;SP=SP-380
• 算术运算指令——ADC
ADC指令将Rm的值相加,再加上CPSR中的C 条件标志位,结果保存到Rd寄存器。
ADC指令格式:
ADC Rd, Rm 其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。 Rm 第2个操作数寄存器,必须在R0~R7之间。
• 逻辑运算指令——ORR
ORR指令将寄存器Rd的值与寄存器Rn的值按 位作逻辑“或”操作,结果保存到Rd寄存器中。
ORR指令格式:
ORR Rd, Rm
其中:Rd 目标寄存器,也是第一个操作数寄存器,必须在R0~R7之间。
Rm 第2个操作数寄存器,必须在R0~R7之间。
应用示例: MOV ORR R1,#0x0F R0,R1 ; R0=R0 | R1,置位R0低4位
其中:Rd Rn Rm expe3 expr8
应用示例: SUB R1,R1,R0 ; R1=R1-R0
SUB
SUB
R1,R1,#7
R1,#200
; R1=R1-7
; R1=R1-200
• 算术运算指令——ADD
ADD指令将两个数据相加,结果保存到Rd寄存器中。
《2024年兼容ARMThumb指令的多指令集处理器技术研究》范文
《兼容ARMThumb指令的多指令集处理器技术研究》篇一摘要本文重点研究了兼容ARMThumb指令的多指令集处理器(Multi-Instruction Set Processor,简称MISP)的技术。
通过深入探讨ARMThumb指令的特点,分析了其与多指令集处理器的兼容性,以及如何利用这一技术提高处理器的性能和效率。
一、引言随着信息技术的快速发展,嵌入式系统及移动设备的需求日益增长,处理器技术成为了其中的关键技术之一。
ARMThumb指令集作为一种精简指令集(RISC)架构,因其高效率、低功耗的特性在嵌入式领域得到了广泛应用。
而多指令集处理器技术则通过整合多种指令集,实现处理器的高效执行。
因此,研究兼容ARMThumb指令的多指令集处理器技术具有重要的理论和实践意义。
二、ARMThumb指令的特点ARMThumb指令集是一种精简指令集架构,具有以下特点:1. 代码尺寸小:Thumb模式下的代码尺寸只有ARM模式的50%左右,有助于减少存储空间的占用。
2. 功耗低:由于指令集的精简和高效执行,使得Thumb模式下的处理器功耗较低。
3. 兼容性:能够与ARM模式无缝兼容,使得程序在两种模式之间可以平滑切换。
三、多指令集处理器技术概述多指令集处理器(MISP)技术是指在一个处理器中同时支持多种指令集,以提高处理器的灵活性和效率。
MISP技术可以通过集成不同种类的指令集,实现单一处理器的高效执行多种任务的目标。
这种技术不仅提高了处理器的性能,还降低了系统的整体功耗和成本。
四、兼容ARMThumb指令的多指令集处理器设计为了实现多指令集处理器对ARMThumb指令的兼容性,需要进行以下设计:1. 指令集整合:将ARMThumb指令与其他指令集进行整合,确保在处理器中能够正确识别和执行这些指令。
2. 硬件架构设计:根据整合后的指令集,设计合适的硬件架构,包括寄存器组、数据通路和控制单元等。
3. 编译器优化:针对整合后的指令集,优化编译器,使其能够生成高效的机器代码。
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 数据处理指令的目的寄存器与其中一个源寄存器相同。
基于ARM内核的ARM与Thumb混合代码的生成
基于ARM内核的ARM与Thumb混合代码的生成
朱春芳;林晓明
【期刊名称】《计算机工程》
【年(卷),期】2004(30)7
【摘要】介绍了嵌入式系统领域中的常用RISC微处理器--ARM处理器的ARM 指令集与Thumb指令集,分析了应用程序的ARM代码与Thumb代码的各自的优势与不足,研究了生成高密度、执行效率高的混合代码的方法.
【总页数】3页(P73-75)
【作者】朱春芳;林晓明
【作者单位】武汉大学计算机学院,武汉,430079;武汉大学计算机学院,武
汉,430079
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.ARM内核目标系统中的代码运行时间测试 [J], 陈思勤;吴秋新
2.基于ARM的嵌入式系统程序开发要点(五)--ARM/Thumb的交互工作 [J], 费浙平
3.ST推出全新的STM32F0系列32位微控制器基于ARMCortex—MO内核——沿用STM32的DNA,M0系列多功能超值ARM Cortex微控制器简化家电和工业控制应用开发任务 [J], 无
4.基于ARM Cortex-M0内核单片机的指夹式脉搏血氧仪设计与实现 [J], 秦汉;王
瑞琦;卢超波
5.新的ARM Thumb-2内核技术带来高的代码密度和性能 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
基于ARM的嵌入式系统程序开发要点五——ARMThumb的交互工作
M O V PC, LR 函数的调用过程如图 2 所示。
上述过程中的一个特点是:f u n c 1 ()还是使用通常 的 BL 指令来进行子程序调用, 而 f u n c 2 ()返回时则直
void func1(void) {
… func2();
… }
func1
. . . BL func2 . .
func2
图 3 所示。
以仔细考虑。
① 两个函数 func1() 和 func2 () 被编译成不同的 指令集 (A R M 或 T h u m b )。
注意:func1 () 和 func2 () 在这里位于二个不同 的源文件中。
② 编译时必须告诉编译器和链接器足够的信息,一
5 V5 架构的扩展
A R M 在 V 5 版本的架构中,对 A R M / T h u m b 的交互增 加了新的支持。针对前面第 3 节中提到的函数调用和返 回问题,V 5 版本中专门对指令做了扩展。
线上预取指令的执行错误。 而如果用 B X 指令, 则执行 入一段链接代码(v e n e e r s )来实现状态转换。
后会进行流水线的刷新动作,清除流水线
上的残余指令,在新的状态下重新开始指 令预取, 从而保证状态转变时指令流的正 确衔接。
3 ARM/Thumb之间的函数调用
在无交互的子程序调用中,其过程比 较简单。 实现调用通常只需要一条指令:
◇ T h u m b 指令集在功能上只是 A R M 指令集的一个子 集, 某些功能只能在 ARM 状态下执行,如 CPSR 和 协处理器的访问。 ◇进行异常响应时,处理器会自动进入 A R M 状态。 ◇从系统优化考虑, 在宽带存储器上不应该放置 Thumb 代码, 很多窄带系统具有宽带的内部存储器。 ◇即使是一个单纯的 T h u m b 应用系统,也必须加一 个汇编的交互头程序,因为系统总是自动从 A R M 开始启动。
Thumb汇编指令实验二
Thumb汇编指令实验二实验目的通过实验掌握ARM处理器16位汇编指令的使用方法。
实验设备●硬件:PC机。
●软件:ADS1.2集成开发环境,Windows 2000/XP/2003。
实验内容●使用Thumb汇编语言,体会ARM与Thumb的区别。
●使用伪指令,加深对伪操作的理解。
实验原理(1) ARM与Thumb的混合编程所有的ARM指令都是可以条件执行的,而Thumb指令仅有一条指令(B指令)具备条件执行功能。
所以很多应用程序需要两者的混合编程,因此存在ARM与Thumb状态之间相互切换,而且相互之间的状态切换的开销几乎为零。
由于ARM处理器总是从ARM状态开始执行,故Thumb指令的执行必须由ARM状态转向Thum b状态,通常BX指令完成。
另外在Thumb指令前必须有CODE16伪指令指示汇编器以下指令为Thumb指令。
下面是一段直接进行状态切换的代码。
AREA AddReg,CODE,READONLYENTRYCODE32 ;程序从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 ;软中断参数设置SWI 0x123456 ;将CPU的控制权交给调试器END实验参考程序见课本page83-84:(1)ARM指令编写的“hello world”程序;(2)Thumb指令编写的“hello world”程序。
嵌入式设计复习题答案
嵌入式设计复习题答案一、填空题1、哈佛体系结构数据空间和地址空间(分开),ARM920T采用(哈佛)的内核架构。
2、 ARM7TDMI采用( 3 )级流水线结构,ARM920TDMI采用( 5 )级流水线。
3、ARM7TDMI中,T表示支持16位Thumb指令集,D表示(在片可调式),M表示内嵌乘法器Multiplier,I表示(嵌入式ICE ),支持在线断点和调试。
4、“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本要素。
5、ARM处理器共有37个寄存器,31个通用寄存器,6个状态寄存器。
寄存器R13通常用作堆栈指针,称作SP。
寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。
6、程序状态寄存器CPSR的N、Z、C、V分别指--,I=1指-禁止IRQ中断-、F=1指-禁止FIQ中断-,M[4:0]用做-处理器模式选择-。
7、ARM微处理器支持四种类型的堆栈,即:满递增堆栈、满递减堆栈、空递增堆栈、空递减堆栈。
8、ARM微处理器有7 种工作模式,它们分为两类特权模式、非特权模式。
其中用户模式属于非特权模式9、ARM支持两个指令集,ARM核因运行的指令集不同,分别有两个状态 ARM状态、thumb状态,状态寄存器CPSR的 T (或者填 D5 )位反映了处理器运行不同指令的当前状态10、ARM处理器有两种总线架构,数据和指令使用同一接口的是冯诺依曼结构,数据和指令分开使用不同接口的是哈佛结构11、ARM核有多个寄存器,其中大部分用于通用寄存器,有小部分作为专用寄存器, R15 寄存器用于存储PC,R13通常用来存储 SP (或者填堆栈指针)12、编译链接代码时,有两种存储代码和数据的字节顺序,一种是小端对齐,另一种是大端对齐13、不同的中断处理不同的处理模式,具有不同的优先级,而且每个中断都有固定的中断入口地址。
当一个中断发生时,相应的R14存储中断返回地址,SPSR存储状态寄存器CPSR的值。
第六章、ARM和Thumb程序混编及其与C语言的接口 6
1. ARM程序和Thumb程序混合使用的场合
通常,Thumb程序比ARM程序更加紧凑,而且 对于内存为8位或16位的系统,使用Thumb程 序效率更高。但是,在下面一些场合下,程 序必须运行在ARM状态,这时就需要混合使 用ARM程序和Thumb程序。 强调速度的场合。 有一些功能只有ARM程序能够完成。例如, 使用或者禁止异常中断。 当处理器进入异常中断处理程序时,程序自 动切换到ARM状态。 ARM处理器总是从ARM状态开始执行。
在C语言程序中使用内嵌的汇编指令
1. 在C/C++程序中使用的汇编指令的语法格式
在ARM C语言程序中使用关键词_asm来标识一段 汇编指令程序,其格式如下:
_asm { instruction [; instruction] … [instruction] } 其中,如果一行中有多个汇编指令,之间用分号隔开。 如果一条指令占多行,要使用续行符号(\)。在汇编指 令段中可以使用C语言的注释语句。
AREA globals, CODE, READONLY EXPORT asmsub IMPORT globv1 Asmsub LDR R1,=globv1 LDR R0, [R1] ADD R0, R0, #2 STR R0, [R1] MOV PC, LR END
REPORT
根据查阅相关资料书籍,写一篇文章。 内容要求:根据下列的题材选择一个或几个方 面进行展开:
当在编译或汇编时选用了选项-apcs/interwork。
汇编语言程序中通过用户代码支持 interwork
在ARM版本4中可以实现程序状态切换的指 令是BX 从ARM版本5开始,下面的指令也可以实现 程序状态的切换:
– BLX – LDR、LDM及POP
13ARM指令集与Thumb指令集
13ARM指令集与Thumb指令集指令格式ARM基本格式<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}opecode:指令助记符cond:执⾏条件助记符标志含义EQ Z=1相等NE Z=0不相等CS/HS C=1⽆符号数⼤于或等于CC/LO C=0⽆符号数⼩于MI N=1负数PL N=0正数或0VS V=1溢出VC V=0没有溢出HI C=1,Z=0⽆符号数⼤于LS C=0,Z=1⽆符号数⼩于或等于GE N=V有符号数⼤于或等于LT N!=V有符号数⼩于GT Z=0,N=V有符号数⼤于LE Z=1,N!=V有符号数⼩于或等于AL任何⽆条件执⾏(指令默认条件)S:指令是否影响CPSR寄存器.W和.N:宽度说明符,默认16位,32位使⽤ .W说明符。
ARM和Thumb都可以使⽤1。
跳转指令,4条1。
B跳转:B{cond} label2。
BL带链接跳转(类似单步步⼊)将当前指令下⼀条指令地址存⼊R14寄存器,常⽤来调⽤⼦程序:BL{cond} label3。
BX带状态切换跳转(在ARM与Thumb之间切换)处理器判断Rm的位[0]为1,是则将CPSR寄存器标志T置位,切换⾄Thumb,反之切换为ARM:RX{cond} Rm4。
BLX带链接和状态切换的跳转:BLX{cond} Rm2。
存储器访问指令:LDR:寄存器←存储器格式:LDR{type}{cond} Rd,label LDRD{cond} Rd,Rd2,labelType取值:B:⽆符号字节(加载时0扩展为32位)SB:有符号字节(加载时符号扩展为32位)H:⽆符号半字节(加载时0扩展为32位)SH:有符号半字节(加载时符号扩展为32位)Rd:加载寄存器Label:读取的内存地址LDRD:⼀次加载双字的数据STR:寄存器→内存STR{type}{cond} Rd,labelSTRD{cond} Rd,Rd2,labelType中的SB和HS对STR⽆效LDM可以指定多个存储单元:寄存器←内存LDM{addr_mode}{cond} Rn{!} reglistaddr_mode:IA:Increase After,基址寄存器在执⾏指令后增加,默认IB:Increase Before,基址寄存器在执⾏指令前增加(仅ARM)DA:Decrease After,基址寄存器在执⾏指令后减少(仅ARM)DB:Decrease Before,基址寄存器在执⾏指令之前减少FD:满递减堆栈,堆栈向低地址⽣长,堆栈指针指向最后⼀个⼊栈的有效数据项 FA:满递增堆栈,堆栈向⾼地址⽣长,堆栈指针指向下⼀个要放⼊的空地址ED:空递减堆栈,堆栈向低地址⽣长EA:孔递增堆栈,堆栈向⾼地址⽣长Rn:基地址寄存器,存储初始地址!:可选后缀,有则最终地址将写回到Rn寄存器reglist:存储数据的寄存器列表,多个连续寄存器可⽤“-”链接,不连续⽤“,”分隔 STM:寄存器列表数据→内存 STM{addr_mode}{cond} Rn{!} reglistPUSH:将寄存器推⼊满递减堆栈PUSH{cond} reglistPOP:从满递减堆栈弹出寄存器信息POP{cond} reglistSWP:寄存器←→内存SWP{B}{cond} Rd,Rm,[Rn]B:可选字节,有B则交换字节否则交换32位的字cond:执⾏条件Rd:从内存中加载数据的寄存器Rm:写⼊数据的到内存的寄存器Rn:需要交换数据的存储器地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
func1
: BL :
:
BX
连接程序生成 veneer
func2 (compiled for interworking)
: BX
刘海燕
Assemble Languag1e0of ARM
ARM 4T架构对交互编译的影响
leaf function使用 BX 返回.
Non_leaf function将被交互编译:
如果如此, armasm 将警告: INTERWORK area directive is obsolete. Continuing as if -apcs /inter selected.
刘海燕
Assemble Language9of ARM
交互子程序
任何包含使用交互调用函数的 C 模块的编译必须使用 -apcs /interwork 命令行选项. 编译器将使用 BX 实现函数返回来替代 MOV PC,LR.
连接器生成一小段代码(‘veneers’)来改变状态 当发现交互调用时自动加入目标文件 使用 armlink -info veneers 可以看到加入的“ veneers”的 大小。
连接程序将会自动加入ARM / Thumb交互 veneers到汇编源代码. 主调程序需要:
使用 armasm -apcs /interwork 汇编 导出自己的符号, e.g. EXPORT ThumbSub 使用 BX 实现返回
主调程序使用 BL 指令调用子程序.
Note: AREA 将包含: AREA Thumb,CODE,READONLY,INTERWORK
在入口处( 调用 BL 之前)压栈保护返回地址 在入口处保护所有函数使用的寄存器 使用 BX 实现返回操作 (替代弹出 PC).
C 源代码
void func(void) {
: sub(); : : }
armcc -apcs /interwork
func
STMFD sp!,{r4-r11,lr}
其中Rn 的 Bit-0 表明切换到何种状态.
刘海燕
Assemble Language4of ARM
状态切换
31
Rn
10
0/1 目的地址
31
PC
BX
10
ARM / Thumb 选择位 0 - ARM state 1 - Thumb state
刘海燕
Assemble Language5of ARM
与程序状态切换相关的伪操作
需要一些编译方法来解决在一种状态下的函数调用另一种状态下的 函数的问题.
涉及到的问题:
BL 不能完成状态切换
需要使用 BX 切换
BX 不能自动保存返回地址到 LR
需要其它方法来解决这个问题, BLX指令的引入 (ARM7不支持)
从子程序返回,要使用 BX LR 以便返回先前的状态
BL 在 Thumb 状态下可能设置了 LR 的 lsb (bit-0) 不能使用 MOV PC,LR 返回,因为不能实现状态切换
CODE16伪操作 CODE32伪操作
刘海燕
Assemble Language6of ARM
分支交换示例
CODE32
; Start off in ARM state
ADR r0,Into_Thumb+1 ; Generate branch target address and set
; bit 0, hence arrive in Thumb state.
第7章 ARM程序和Thumb程序 交互使用
交互需求
Thumb的代码密度和在窄存储器上性能 ,使得它用在很多有大量C 代码的系统上比较理想. 然而在很多应用中还是需要在 ARM/Thumb 两种状态之间切换: 在宽的存储器上 ARM 代码能提供很好的性能
在一个应用中,速度关键的部分用ARM代码实现是不错的 一些函数只能用 A止中断和状态的改变)
操作协处理器 异常处理
异常处理时自动进入 ARM 状态,但系统要求主程序用 Thumb 代码实现
独立的 Thumb 程序也需要一个ARM 的汇编程序头来切换,并调 用Thumb 程序
刘海燕
Assemble Language2of ARM
可以实现程序状态切换的指令
:
BL sub
:
LDMFD sp!,{r4-r11,lr}
BX
lr
刘海燕
tcc -apcs /interwork
func PUSH {r4-r7,lr} : BL sub : POP {r4-r7} POP {r3} BX r3
Assemble Languag1e1of ARM
汇编程序交互工作和Veneers
BX r0
; Branch exchange to Thumb state.
:
CODE16 Thumb.
; Assemble subsequent code as
Into_Thumb
:
ADR r5, Back_to_ARM to word aligned
; Generate branch target
BLX, BX LDR, LDM, POP
刘海燕
Assemble Language3of ARM
交互指令
交互的实现采用跳转交换指令(BX)
在Thumb状态 BX Rn
在ARM状态 (支持Thumb的内核) BX<条件> Rn
其中Rn可以是 (r0~r15)中的任何一个.
这将通过拷贝 Rn 到 PC 来实现在 4GB 空间内的 一个绝对跳转.
void func1 (void)
{
:
func2();
:
}
func1
. . BL func2 . .
func2
: MOV pc,lr
刘海燕
Assemble Language8of ARM
混合的ARM/Thumb子程序
在使用 C / C++ 写程序时,可以自由的编译为 ARM ( 使用 armcc/armcpp) 或 Thumb ( 使用tcc/tcpp).
BX r5
; ;
aBdradnr刘ecsh海se燕-xhcheanncegebibt a0ciksAtscosleemAabRler.LManguaAgeR7oMf
无交互子程序
实现一个通常的子程序调用需要如下两步: 保存返回地址到寄存器(LR) 跳转到对应的子程序地址
调用实现通常只需要一个指令: BL func2 返回实现通常只需从 LR 恢复 PC: MOV pc,lr