ARM指令集三篇

2024-09-12

ARM指令集 篇1

关键词:计算机科学与技术,ARM指令,指令编码格式,合法立即数,8位位图

在ARM指令集中,绝大多数指令都是三地址指令,这三个地址分别代表指令执行结果的存储地址,参与运算的第1操作数的存储地址和第2操作数的存储地址。ARM指令的寻址方式一共有8种[1]对于寄存器寻址、寄存器移位寻址、寄存器间接寻址、基址寻址、多寄存器寻址、块拷贝寻址、栈寻址和相对寻址,支持这8种寻址方式的指令只要按照其语法说明使用即可,但是对于立即数寻址指令,要求只有合法的立即数才能作为第2操作数立即数。如果在立即寻址方式的ARM指令中使用了不合法的立即数,ARM汇编器会报告语法错误,无法编译程序。这种要求给我们使用立即数寻址方式带来了一些困难,一是在编写ARM汇编程序时,要正确判断立即寻址方式的ARM指令中的立即数是否合法立即数;二是在一些情况下,待解决的问题恰好使该指令涉及了不合法立即数,这种情况在程序中应该如何处理。

1 ARM指令集简介

1.1 ARM指令分类

ARM指令集按功能分为10大类指令:分支指令(Branch Instructions)、数据处理指令(Data-processing Instructions)、扩展指令、杂项指令、状态寄存器存取指令(Status Register Transfer Instructions)、载入存回指令(Load and Store Instructions)、多寄存器装入存回指令、信号量指令(semaphore Instructions)、异常中断产生指令(Exception-generating Instructions)、协处理器指令(Coprocessor Instructions)、扩展中的指令集[2]。

1.2 ARM指令的格式

1.2.1 ARM指令的编码格式

ARM指令的编码格式是在存储器中存储一条ARM指令时的存储格式。ARM指令是固定字长指令,指令字长32位,将这32位以若干位为一组,组成几个字段来分别表示指令的要完成的具体操作类型、方式及操作数。ARM指令编码格式中的主要字段有:操作码(opcode)、条件码(cond)、第1操作数(Rn)、目标寄存器(Rd)、标志位更新码(S)、第2操作数。图1为数据处理类中支持立即数寻址的指令编码结构图。

不同类的ARM指令的编码格式不同,即使同类或同一指令,如果指令的寻址方式不同,指令的编码格式也有所区别。因此ARM指令集中的指令编码格式很多,在这里仅介绍支持立即数寻址的指令编码格式。在ARM指令集中,支持立即数寻址的指令主要有数据处理类指令(数据传送指令、算术逻辑运算指令、比较指令、测试指令)和状态寄存器存指令(MSR)。

1.2.2 ARM指令的语法格式

在ARM汇编程序中,一条典型的ARM指令的语法格式:{}{S},{,}。

其中,是指令助记符,决定了指令的操作。例如,ADD表示算术加操作指令。{}是指令执行的条件,这是可选项。大多数ARM指令可包含一个可选的条件,只有在程序状态寄存器(CP-SR)中的条件码标志满足既定的条件时,带条件码的指令才能执行。ARM指令的可选的执行条件有16种。在编程时若需要执行满足一定条件才执行,则在指令后可加这一选项。{S)决定指令的操作是否影响状态寄存器(CPSR)的值,也是可选项。大多数ARM数据处理指令均可以根据执行结果来选择是否更新条件码标志。若要更新条件码标志(CPSR寄存器中的条件标志位),则在指令中必须包含后缀“S”。表示目标寄存器,必选项。表示包含第1个操作数的寄存器。表示第2操作数,可选项,当指令仅需要一个操作数时可省略。

的格式一般有两种,以下从第2操作数的编码格式和语法格式两个方面进行介绍。

1)立即数型

(1)语法格式:“#<32位立即数>”。

例如,MOV R4,#0x8000 000A,其中#0x8000 000A是立即数。在ARM指令中这种表示操作数的寻址方式属于立即数寻址。

(2)编码格式如图1所示。

在32位的ARM指令编码格式中,条件码和操作码等占用了一些必要的指令码位,32位立即数无法编码在指令中,因此,这种格式的指令中留给第2操作数的编码空间只有12位(在32位指令编码中位于bit[11:0]),需要利用这12位产生32位的立即数。将指令中第2操作数编码的低8位(bit[7:0])立即数作循环右移,循环右移次数由指令中的第2操作数编码的高4位(bit[11:8])的值乘以2指定。立即数#0x8000 000A是由8位立即数0xA8循环右移0x2位得到。

2)寄存器移位型

(1)语法格式:“Rm,(}”。

Rm是第2操作数寄存器,用来指定移位类型和位移量。例如,指令“ADD R0,R0,R0,LSL#2”,R0是第2操作三数寄存器,R0中的数据为待移位的数据,LSL表示进行逻辑左移移位,#2表示位移量是2位。在ARM指令中这种表示操作数的寻址方式属于寄存器移位寻址方式。

(2)寄存器移位型的编码格式根据移位类型和位移量的表示方式主要有3种编码格式。

在指令的第2操作数编码的bit[3:0]位,用来表示ARM核中的32个32位寄存器,可对寄存器中的数据进行移位或循环移位;移位类型主要有LSL (逻辑左移)、ISR(逻辑右移)、ASR(算术右移)、ROR(循环右移)和RRX(带进位循环右移)五种移位类型,除RRX外,其他四种移位类型与位移量表示方式有关,位移量的表示方式有两种:一种是立即数,其编码格式如图2所示。立即数位移量编码在bit[11:7],表示移位位数,共5个比特,可表示取指范围为0-31的移位位数,如上例中的#2在bit[11:7]上编码为00010;移位类型编码在bit[6:4](LSL(000),LSR(010),ASR(100),ROR(110)),上例中的LSL在bit[6:4]上被编码为000;另外一种是寄存器Rs,其编码格式如图3所示。位移量在第2操作数编码中位于bit[8:11],用来表示ARM核中32个32位寄存器,寄存器中的值表示移位位数,移位类型编码在bit[7:4]上(LSL(0001),LSR(O011,ASR(0101),ROR(0111)。

对于带进位循环右移(RRX),ARM规定只能带进位循环右移1次[4,5],因此移位类型和移位位数统一编码在bit[11:4](00000110),编码的bit[3:0]表示Rm寄存器,如图4所示。使用RRX进行移位的指令的语法格式也和其他四种移位方式不同,例如加法指令″ADD RO,RO,RO,RRX″,因RRX规定只能带进位右移一位,因此语法上省去了移位位数字段。

2合法立即数

2.1 合法立即数的定义

合法立即数是一个8位的立即数经过循环右移偶数位间接得到的[6]。例如指令“MOV R4,#0x8000000A”,立即数0x8000000A是由8位的OxA8循环右移2位得到,所以0x8000000A是合法立即数;而指令“MOV R2,#0x1FE”,0x1FE无法看成是8位的常数循环右移偶数位而得到的,因此是非法的立即数。

2.2 合法立即数的使用

在ARM指令集中,支持立即数寻址指令主要包括数据处理类和状态寄存器存取类中的部分指令。数据处理类指令中,这些指令包括数据传送指令(MOV和MVN)、算术逻辑运算指令、比较指令和测试指令;状态寄存器存取类指令只有两条,仅状态寄存器存储指令(MSR)支持立即数寻址。支持立即数寻址的指令中使用的立即数必须是合法立即数。

3 合法立即数的判断

3.1 8位位图原则

判断一个数是否符合8位位图的原则,首先看这个数的二进制表示中1的个数是否不超过8个。如果不超过8个,再看这n个1(n<=8)是否能同时放到8个二进制位中,如果可以放进去,再看这八个二进制位是否可以循环右移偶数位得到我们欲使用的数。如果可以,则此数符合8位位图原理,是合法的立即数,否则,不是合法立即数。

3.2 判断合法立即数的程序

3.2.1 算法描述

一个合法的立即数(32位)是通过8位立即数(8位位图)循环右移偶数位间接得到。假设数X是一个32位的合法立即数,根据8位位图原则,任意小于255无符号的数都是合法立即数,那么X肯定是由0~255范围中的某一个数循环右移偶数位得到。因此,采用逆向方法,将一个数循环左移2n位(n=0,1….15),如果移位后的数有一个小于255,那么该数就是合法的立即数。

经以上分析,判断一个数X是否是合法立即数的包括以下步骤:

1)n=0;

2)将X循环左移2*n位,移位结果为Y;

3)若Y<=255,打印X是Y循环右移2*n位得到的,它是合法立即数,退出程序;否则n++;

4)若n<=15,则跳到步骤(2)执行,否则退出程序。

3.2.2 不合法立即数的处理

在ARM汇编编程中,一些特殊情况下立即数寻址指令中的涉及的立即数是不合法立即数,可使用ARM汇编器提供的LDR伪指令[7,8]解决。

例如,在程序中,恰好需要把一个立即数0x12000001和寄存器R0相加,加法和放到寄存器R1。一般情况下完成这个操作的方法:“ADD R1,R0,#0x12000001”。但在立即数寻址指令中,使用了不合法的立即数,该指令无法成功编译。解决问题的办法是利用LDR伪指令将该立即数放到一个寄存器中,使用寄存器寻址的ADD指令则可完成该加法。该方案的程序代码如下:

LDR R2,=0x12000001;

ADD R1,R0,R2。

从程序中可看出,ADD指令使用了寄存器寻址,该寻址方式对寄存器中的数据是否合法没有要求,回避了立即数寻址指令必须要用合法立即数的要求。

4 结束语

ARM汇编语言是进行嵌入式系统底层开发的重要工具。ARM指令是ARM汇编程序的基础。只有深刻理解ARM指令,才能够在编程中正确、灵活的运用ARM指令解决编程中所遇到的难题。

参考文献

[1]俞建新,王健,宋健健.嵌入式系统基础教程[M].北京:机械工业出版社,2008.

[2]ARM Architecture Reference Manual.ARM Limited.2007.

[3]马忠梅,徐英慧.ARM嵌入式处理结构与应用基础[M].北京:北京航空航天大学出版社,2010.

[4]何加铭.嵌入式32位微处理器系统设计与应用[M].北京:电子工业出版社,2006.

[5]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社.2003.

[6]Wayne Wolf.Computers As Components:Principles of Embedded Computing System[M].China Machine Press,2008.

[7]熊茂华,杨震伦.ARM9嵌入式系统设计与开发应用[M].北京:清华大学出版社,2010.

ARM指令集 篇2

[关键词]CPU 精简指令集 复杂指令集 ARM指令集 X86指令集

所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。CPU的指令集从主流的体系结构上分为精简指令集(RISC)和复杂指令集(CISC)。嵌入式系统中的主流处理器——ARM处理器,所使用的就是精简指令集。而桌面领域的处理器大部分使用的是复杂指令集,比如Intel的X86系列处理器。我们把ARM处理器所使用的指令集称为ARM指令集,把X86处理器所使用的指令集称为X86指令集。由于ARM处理器与X86处理器采用不同类型的指令集,因而造成了处理器在性能、成本、功耗等方面的诸多差异。现从ARM指令集和X86指令集的特点、操作、功能方面做一比较,以说明两种处理器有诸多差异的原因。

第一,X86指令集随着计算机的功能越来越强大,计算机内部的元件越来越多,指令也相应的变得十分复杂,而在使用过程中,并不是每一条指令都要完全被执行,在技术人员的研究过程中发现,约有80%的程序只用到了20%的指令,而一些过于冗余的指令严重影响到了计算机的工作效率。而ARM指令集种类大大的减少,指令只提供简单的操作,使一个周期就可以执行一条指令。编译器或者程序员通过几条简单指令的组合来实现一个复杂的操作(例如,除法操作)。

第二,由于X86指令集是属于CISC类型的指令集,其每条指令的长度是不固定的,而且有几种不同的格式,这样一来,就造成了X86处理器的解码工作非常复杂。为了提高处理器的工作频率,就不得不延长处理器中的流水线。而过长的流水线在分支如果出现预测出错的情况,又会带来CPU工作停滞时间较长的弊端。而ARM指令集大多数指令采用相同的字节长度,并且在字边界上对齐,字段位置固定,特别是操作码的位置。这就非常适合采用流水线技术,允许流水线在当前指令译码阶段去取其下一条指令。

第三,X86指令采用了可访问内存地址的方法,这样的方法容易造成处理器与内存之间的不平衡工作,从而降低处理器的工作效率。而ARM处理器则是使用Load/Store的存储模式,其中只有Load和Store指令才能从内存中读取数据到寄存器,所有其他指令只对寄存器中的操作数进行计算。因此,每条指令中访问的内存地址不会超过1个,指令访问内存的操作不会与算术操作混在一起。

第四,X86构架处理器中的FPU(Floating Point Unit)浮点运算单元的运算能力较差,其主要原因就是X86指令集中所使用的一个操作数堆栈。如果在运算过程中,没有足够的寄存器进行计算,系统就不得不使用堆栈来存放数据,这样一来会浪费大量的时间来处理FXCH指令,才能将正确的数据放到堆栈的顶部。ARM 处理器本身不支持浮点运算,所有的浮点运算都在一个特殊的浮点模拟器中运行,并且速度很慢,经常需要进行数千个时钟周期才能完成浮点函数的计算。

第五,在流水线方面,ARM指令的处理过程被拆分成几个更小的、能够被流水线并行执行的单元。在理想情况下,流水线每周期前进一步,可获得最高的吞吐率;而X86指令集的执行需要调用微代码的一个微程序,在执行速度上不如ARM指令集。

第六,X86指令对于各种扩展部件的限制也是十分不利的。首先,X86架构的处理器对于4GB的内存容量上限制,虽然现在目前主流的个人电脑的内存大小为512MB和1GB,但是相信随着操作系统和应用软件的不断提升,会快将会突破4GB的内存容量。而ARM则相反,它可以支持丰富的扩展部件。

第七,为了提高X86架构的处理器的性能,而出现像寄存器重命名、缓冲器巨大、乱序执行、分支预测、X86指令转化等等现象,都使得处理器的核心面积变得越来越大,这也限制了处理器工作频率的进一步提升,设计成本增加,此外,处理器所集成的这些庞大数目的晶体管都只是为了解决X86指令的问题。而ARM指令集可以大大简化处理器的控制器和其他功能单元的设计,不必使用大量专用寄存器,特别是允许以硬件线路来实现指令操作,从而节约的处理器的制造成本,核心面积小。

ARM指令集 篇3

1、告警查询指令

(查看BSC元所有告警)

2、小区相关操作指令

(查看小区信道状态)

(查看小区参数DCHNO,HOP等)

(开关跳频)

(查小区名及CGI,BCCHNO等参数)

(查看小区功率)

(更改功率,必须为奇数;)

(闭掉小区)

(激活小区)

3、MO相关操作指令

(根据CELL查TG号)

(根据TG查CELL)

(小区信道配置)

(查看所有MO状态)

(查看TG状态)

(查看CF状态)

(查看CON状态)

(查看IS状态)

(查看TF状态)

(查看TRX状态)

(查看TX状态)

(查看RX状态)

(查看TS状态)

(闭MO)

(测MO)

(解MO)

(使MO进入服务状态)

(使MO退出服务状态)

(看PCM时隙与DCP关系及各时隙占

用情况)

(建立PCM与DCP的连接关系)

(打印MO的定义数据,使用所有的MO)

(定义MO数据)

4、传输相关操作指令

(定义CELL与TG对应关系)

(查看传输通、断状态)

(查看传输误码情况)

(查看传输滑码情况)

(查看MO所用传输的DEV号)

(根据传输的DEV号查DIP号)2

上一篇:防治西葫芦病毒病下一篇:TDP治疗甲沟炎论文