ARM指令集详解(超详细!带实例!)

合集下载

第二讲ARM指令集课件

第二讲ARM指令集课件
S用于恢复CPSR和强制用户位。当程序计数器 PC包含在LDM指令的register_list中,且S为1时, 则当前模式的SPSR被拷贝到CPSR中,使处理器 的程序返回和状态的恢复成为一个原子操作。如 果register_list中不包含程序计数器PC,S为1则 加载或存储的是用户模式下的寄存器组。
第二讲 ARM指令集
块拷贝与栈操作的对应关系
栈操作
块拷贝
先 增

先 减

地址变化方向
向上
向下




STMIB
LDMIB
STMFA
LDMED
STMIA
LDMIA
STMEA
LDMFD
LDMDB
STMDB
LDMEA
STMFD
LDMDA
STMDA
LDMFA
前变址不回写形式: [<Rn>,+/-<Rm>] 前变址回写形式: [<Rn>,+/-< Rm >]! 后变址回写形式: [<Rn>],+/-< Rm >
第二讲 ARM指令集
偏移量为寄存器值的指令编码类型对应关 系 31 28 27 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0
内容提要
3.1 3.2 3.3 3.4
ARM指令的编码格式 数据处理指令寻址方式 Load/Store指令寻址 批量Load/Store指令寻址方式
第二讲 ARM指令集
3.1 ARM指令的编码格式
一般编码格式 指令条件码
第二讲 ARM指令集
一般编码格式
每条ARM指令占有4个字节,其指令长度为32位

常用ARM指令汇总

常用ARM指令汇总

常用ARM指令集及汇编一、ARM处理器的寻址方式二、指令集学习(一)ARM指令集1.指令格式2.条件码3.ARM存储器访问指令1)LDR/ STR-加载/ 存储指令2)LDM/ STM-多寄存器加载/ 存储指令3)SWP-寄存器和存储器交换指令4.ARM数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)RSB-逆向减法指令d)ADC-带进位加法指令e)SBC-带进位减法指令f)RSC-带进位逆向减法指令g)AND-逻辑“与”h)ORR-逻辑“或”i)EOR-逻辑“异或”j)BIC-位清除指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令d)TEQ-相等测试指令4)乘法指令a)MUL-32位乘法指令b)MLA-32位乘加指令c)UMULL-64位无符号乘法指令d)UMLAL-64位无符号乘加指令e)SMULL-64位有符号乘法指令f)SMLAL-64位有符号乘加指令5.ARM分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令6.ARM协处理器指令1)CDP-协处理器数据操作指令2)LDC-协处理器数据读取指令3)STC-协处理器数据写入指令4)MCR-ARM处理器到协处理器的数据传送指令5)MRC-协处理器到ARM处理器的数据传送指令7.ARM杂项指令1)SWI-软中断指令2)MRS-读状态寄存器指令3)MSR-写状态寄存器指令8.ARM伪指令1)ADR-小范围的地址读取伪指令2)ADRL-中等范围的地址读取伪指令3)LDR-大范围的地址读取伪指令4)NOP-空操作伪指令(二)Thumb指令集1.Thumb指令集和ARM指令集的区别2.Thumb存储器访问指令1)LDR/ STR-加载/ 存储指令2)PUSH/ POP-寄存器入栈 / 出栈指令3)LDMIA/ STMIA-多寄存器加载/ 存储指令3.Thumb数据处理指令1)数据传送指令a)MOV-数据传送指令b)MVN-数据非传送指令c)NEG-数据取负指令2)算术逻辑运算指令a)ADD-加法运算指令b)SUB-减法运算指令c)ADC-带进位加法指令d)SBC-带进位减法指令e)MUL-乘法运算指令f)AND-逻辑“与”g)ORR-逻辑“或”h)EOR-逻辑“异或”i)BIC-位清除指令j)ASR-算术右移指令k)LSL-逻辑左移指令l)LSR-逻辑右移指令m)ROR-循环右移指令3)比较指令a)CMP-比较指令b)CMN-负数比较指令c)TST-位测试指令4.Thumb分支指令1)B-分支指令2)BL-带连接的分支指令3)BX-带状态切换的分支指令5.Thumb杂项指令1)SWI-软中断指令6.Thumb伪指令1)ADR-小范围的地址读取伪指令2)LDR-大范围的地址读取伪指令3)NOP-空操作伪指令。

第三章 ARM指令集

第三章 ARM指令集


只有能够通过此构造方法得到的才是合法的立即数。 合法立即数:
0xFF;0x104;0xFF0;0xFF00
非法立即数: 0x101;0x102;0xFF1

一个合法的立即数可能有多种编码方法,将使某些指令的执 行产生不同的结果。
0x3F0
immed_8=0x3F,rot=0xE immed_8=0xFC,rot=0xF
寄存器R1的内容分别逻辑右移2位、R4位,再 与寄存器R2的内容相加,结果放入R3中。

2.3 寄存器间接寻址
寄存器间接寻址 ——就是以寄存器中的值作为操作数的地址,而操 作数本身存放在存储单元中。例如以下指令: LDR STR R0,[R1] R0,[R1] ;R0←mem32[R1] ; mem32[R1]←R0
操作码 0000 0001
条件助记符 EQ NE
标志 Z=1 Z=0 相等 不相等
含义
0010
0011 0100 0101
CS/HS
CC/LO MI PL
C=1
C=0 N=1 N=0
无符号数大于或等于
无符号数小于 负数 正数或零
0110
0111 1000 1001
VS
VC HI LS
V=1
V=0 C=1,Z=0 C=0,Z=1
Cond
001
Opcode S
Rn
Rd
Operand2
一条典型的ARM指令语法格式为: <Opcode>{<cond>}{s} <Rd>, <Rn>{, <Operand2>} Opcode:指令操作码。 cond:指令的条件码。 S:决定指令的操作是否影响cpsr的值。 Rd:目标寄存器。 Rn:包含第一个操作数的寄存器。 Operand2:第2操作数。 例:ADDS R2,R1,#1

arm指令集类型

arm指令集类型

arm指令集类型摘要:一、arm 指令集简介1.arm 指令集的发展历程2.arm 指令集的优势和特点二、arm 指令集的类型1.armv1 和armv2 指令集2.armv3 指令集3.armv4 指令集4.armv5 指令集5.armv6 指令集6.armv7 指令集7.armv8 指令集三、arm 指令集的应用领域1.嵌入式系统2.移动设备3.服务器和数据中心4.物联网设备正文:arm 指令集类型随着科技的飞速发展,arm 指令集在现代处理器中扮演着举足轻重的角色。

arm 指令集以其高性能、低功耗和强大的兼容性在全球范围内得到了广泛的应用。

本文将对arm 指令集的类型进行详细的介绍。

一、arm 指令集简介arm 指令集起源于英国Acorn 计算机公司,后由ARM 公司进行进一步研发和推广。

它具有高性能、低功耗、指令集简单、开发成本低等优点。

arm 指令集在嵌入式系统、移动设备、服务器和数据中心等领域有着广泛的应用。

二、arm 指令集的类型arm 指令集从armv1 到armv8,共经历了八个版本的迭代。

1.armv1 和armv2 指令集:这是arm 指令集的早期版本,主要用于嵌入式系统。

2.armv3 指令集:在armv2 的基础上进行了改进,增加了浮点运算指令。

3.armv4 指令集:引入了Thumb-1 指令集,是一种基于arm 指令集的压缩指令集,可以减少程序的存储空间和运行时间。

4.armv5 指令集:对armv4 指令集进行了优化,提高了性能。

5.armv6 指令集:引入了Thumb-2 指令集,是对thumb-1 指令集的升级,增加了更多的指令,提高了性能。

6.armv7 指令集:在armv6 的基础上进行了改进,引入了VFPv3 和NEON 协处理器,增强了浮点运算和多媒体处理能力。

7.armv8 指令集:这是arm 指令集的最新版本,采用了全新的架构,包括AArch32 和AArch64 两种执行状态,支持64 位计算,显著提高了性能。

ARM指令系统详解

ARM指令系统详解

3. 寄存器偏移寻址
寄存器偏移寻址是ARM指令集特有的寻 址方式。当第2个操作数是寄存器偏移方式时, 第2个寄存器操作数在与第1个操作数结合之 前,选择进行移位操作。 寄存器偏移寻址指令举例如下: MOV R0,R2,LSL #3 ;R2的值左 移3位,结果放人R0 ANDS R1,R1,R2,LSL R3;R2的 值左移R3位,与R1相“与”,结果放入R1
6. 多寄存器寻址
多寄存器寻址即是一次可传送几个寄存器值, 允许一条指令传送16个寄存器的任何子集或所有寄 存器。多寄存器寻址指令举例如下: LDMIA R1!,{R2-R7,R12};将R1指向的单 元中的数据读出到R2~R7、R12中,(R1自动加1) STMIA R0!,{R2-R7,R12};将寄存器R2~ R7、R12的值保存到R0指向的存储单元中(R0自动 加1) 使用多寄存器寻址指令时,寄存器子集的顺序 是按由小到大的顺序排列,连续的寄存器可用“-” 连接;否则用“,”分隔书写。
7. 堆栈寻址
堆栈寻址是隐含的,它使用一个专门的寄存器 (堆栈指针)指向一块存储区域(堆栈)。指针所指向的 存储单元即是堆栈的栈顶。 存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈。 向下生长:向低地址方向生长,称为递减堆栈。 堆栈指针指向最后压入的堆栈的有效数据项, 称为满堆栈; 堆栈指针指向下一个待压入数据的空位置,称 为空堆栈。 这样就有4种类型的堆栈表示递增和递减的满和 空堆栈的各种组合。
1. 指令格式
ARM指令的基本格式如下: <opcode>{<cond>}{S} <Rd>,<Rn>{, <operand2>} 其中: opcode 指令助记符,如LDR、STR等。 cond 执行条件,如EQ、NE等。 S 是否影响CPSR寄存器的值,书写时影响 CPSR。 Rd 目标寄存器。 Rn 第1个操作数的寄存器。 operand2 第2个操作数。

实用ARM指令全

实用ARM指令全

在讲指令之前,先简单地介绍一下Cortex-M3 中支持的算术与逻辑标志。

本书在后面还会展开论述。

它们是:APSR 中的5 个标志位4.2.1 分类指令表表4.2 16位数据操作指令表4.3 16位转移指令IT If-Then表4.4 16位存储器数据传送指令16 数据传送指令没有任何新内容,因为它们是Thumb 指令,在v4T 时就已经定格了——译注表4.5 其它16位指令表4.6 32位数据操作指令UXTH 半字被无符号扩展到32 位(高16 位清0——译注)表4.7 32位存储器数据传送指令表4.8 32位转移指令表4.9 其它32位指令4.2.2 未支持的指令有若干条Thumb 指令没有得到Cortex-M3 的支持,下表列出了未被支持的指令,以及不支持的原因。

表4.10 因为不再是传统的架构,导致有些指令已失去意义未支持的指令以前的功能BLX #im 在使用立即数做操作数时,BLX 总是要切入ARM 状态。

因为Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法fault。

SETEND由ARMv6 引入的,在运行时改变处理器端设置的指令(大端或小端)。

因为Cortex-M3 不支持动态端的功能,所以此指令也将引发faultCM3 也不支持有少量在ARMv7-M 中列出的指令。

比如,ARMv7M 支持Thumb2 的协处理器指令,但是CM3 却不能挂协处理器。

表4.11 列出了这些与协处理器相关的指令。

如果试图执行它们,则将引发用法fault(NVIC 中的NOCP (No CoProcessor)标志置位)。

表4.11 不支持的协处理器相关指令未支持的指令以前的功能MCR 把通用寄存器的值传送到协处理器的寄存器中MCR2把通用寄存器的值传送到协处理器的寄存器中MCRR 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个MRC把协处理器寄存器的值传送到通用寄存器中MRC2 把协处理器寄存器的值传送到通用寄存器中MRRC把协处理器寄存器的值传送到通用寄存器中,一次操作两个LDC 把某个连续地址空间中的一串数值传送至协处理器中STC从协处理器中传送一串数值到地址连续的一段地址空间中还有一个是改变处理器状态指令(CPS),它的一些用法也不再支持。

ARM的六大类指令集

ARM的六大类指令集

ARM的六大类指令集ARM的六大类指令集---LDR、LDRB、LDRH、STR、STRB、STRHARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。

常用的加载存储指令如下:— LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令— STR 字数据存储指令— STRB 字节数据存储指令— STRH 半字数据存储指令1、LDR指令LDR指令的格式为:LDR{条件} 目的寄存器,<存储器地址>LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。

该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。

当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。

指令示例:LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1,R2] !;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到目的寄存器中。

它使用一个进位标志位,这样就可以做比 32 位大的加法。

下列例子将加两个 128 位的数。

128 位结果: 寄存器 0、1、2、和 3第一个 128 位数: 寄存器 4、5、6、和 7第二个 128 位数: 寄存器 8、9、10、和 11。

ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。

ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD 将把两个操作数加起来,把结果放置到目的寄存器中。

操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。

AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

ARM指令集详解资料(000001)

ARM指令集详解资料(000001)

ARM指令集详解ARM可以用两套指令集:ARM指令集和Thumb指令集。

本文介绍ARM指令集。

在介绍ARM 指令集之前,先介绍指令的格式。

1 指令格式(1)基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

opcode 指令助记符,如LDR,STR 等cond 执行条件,如EQ,NE 等S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数指令格式举例如下:LDR R0,[R1] ;读取R1 地址上的存储器单元内容,执行条件ALBEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR 寄存器,带有SSUBNES R1,R1,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S (2)第2个操作数在ARM 指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:#immed_8r常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到。

合法常量0x3FC、0、0xF0000000、200、0xF0000001等都是合法常量。

非法常量0x1FE、511、0xFFFF、0x1010、0xF0000010等都是非法常量。

常数表达式应用举例如下:MOV R0,#1 ;R0=1AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值。

ARM汇编指令集详解

ARM汇编指令集详解

ARM汇编指令集一、跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:Ⅰ.使用专门的跳转指令。

Ⅱ.直接向程序计数器PC写入跳转地址值。

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、B指令B指令的格式为:B{条件} 目标地址B指令是最简单的跳转指令。

一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。

注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。

它是24 位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26 位(前后32MB的地址空间)。

以下指令:B Label ;程序无条件跳转到标号Label处执行CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label 处执行BEQ Label2、BL指令BL指令的格式为:BL{条件} 目标地址BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。

该指令是实现子程序调用的一个基本但常用的手段。

以下指令:BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中3、BLX指令BLX指令的格式为:BLX 目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。

因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。

ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)算术和逻辑指令ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到⽬的寄存器中。

它使⽤⼀个进位标志位,这样就可以做⽐ 32 位⼤的加法。

下列例⼦将加两个 128 位的数。

128 位结果: 寄存器 0、1、2、和 3第⼀个 128 位数: 寄存器 4、5、6、和 7第⼆个 128 位数: 寄存器 8、9、10、和 11。

ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下⼀个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加⾼端的字,带进位如果如果要做这样的加法,不要忘记设置 S 后缀来更改进位标志。

这两个指令与普通指令在对操作数的限制上有所不同:1. 给出的所有操作数、和⽬的寄存器必须为简单的寄存器。

2. 你不能对操作数 2 使⽤⽴即值或被移位的寄存器。

3. ⽬的寄存器和操作数 1 必须是不同的寄存器。

4. 最后,你不能指定 R15 为⽬的寄存器。

译注:CMP 和 CMP 是算术指令,TEQ 和 TST 是逻辑指令。

把它们归⼊⼀类的原因是它们的 S 位总是设置的,就是说,它们总是影响标志位。

CMN : ⽐较取负的值(C o m pare N egative)CMN{条件}{P} <op 1>, <op 2>status = op_1 - (- op_2)CMN 同于 CMP,但它允许你与⼩负值(操作数 2 的取负的值)进⾏⽐较,⽐如难于⽤其他⽅法实现的⽤于结束列表的 -1。

这样与 -1 ⽐较将使⽤:CMN R0, #1 ; 把 R0 与 -1 进⾏⽐较详情参照 CMP 指令。

03ARM指令集

03ARM指令集
这种用法较少见,多是以立即数作偏移地址。
(5)堆栈寻址
当 SP 指向最后压入堆栈的数据时,称为满堆栈 (Full Stack),而当 SP 指向下一个将要放入数据的 空位置时,称为空堆栈(Empty Stack);
入栈时,SP 向高地址方向变化,称为递增堆栈 (Ascending Stack);SP 向低地址方向变化,称为递 减堆栈(Descending Stack)。
1、ARM 指令集概述
ARM指令集是32位的,程序的启动都是从ARM 指令开始;所有的ARM指令集都可以是可以条件执 行的。
从以下三个方面介绍: ① 指令集编码 ② 条件执行 ③ 指令分类及指令格式
① 指令集编码
ARM指令集是以32位二进制编码的方式给出的, 大部分的指令编码中定义了第一操作数、第二操作数、 目的操作数、条件标志影响位以及每条指令所对应的 不同功能实现的二进制位。
乘法指令的二进制编码: 乘法指令的详细列表:
(2)Load/Store 指令
唯一用于寄存器和存储器之间进行数据传送的指令:
单寄存器的存取指令(LDR,STR) 多寄存器存取指令(LDM,STM) 单寄存器交换指令(SWP)
LDR/STR:单字和无符号字节的数据传送指令 前变址格式
LDR|STR {<cond>}{B} Rd,[Rn,<offset>]{!} 后变址格式
(1)立即寻址
操作数本身就在指令中给出,只要取出指令也就
取到了操作数,这个操作数被称为立即数,对应的寻
址方式也就叫做立即寻址。例如以下指令:
ADD R0,R0,#1
;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
以上两指令中第二个源操作数即为立即数,要求 以“#”为前缀并声明其进制,如 0x、0d、0b等。

ARM指令集介绍

ARM指令集介绍

ARM指令集ARM(Advanced RISC Machines)是微处理器行业的一家知名企业。

设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。

1985年,第一个ARM原型在英国剑桥诞生。

ARM公司的特点是只设计芯片,而不生产。

ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。

利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。

ARM公司定义了6种主要的指令集体系结构版本。

V1---V6。

ARMV1:该版本的原型机是ARM1,没有用于商业产品。

ARMV2:对V1版进行了扩展,包含了对32位结果的乘法指令和协处理器指令的支持。

ARMV3:ARM公司第一个微处理器ARM6核心是版本3的,它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。

ARMV4:当前应用最广泛的ARM指令集版本。

ARM7TDMI、ARM720T、ARM9TDMI、ARM940T、ARM920T、Intel的StrongARM等是基于ARMv4T 版本。

ARMv5:ARM9E-S、ARM966E-S、ARM1020E、ARM 1022E以及XScale是ARMv5TE的。

ARM9EJ-S、ARM926EJ-S、ARM7EJ-S、ARM1026EJ-S是基于ARMv5EJ的。

ARM10也采用。

其中后缀意义如下:E:增强型DSP指令集。

包括全部算法和16位乘法操作。

J:支持新的Java。

ARMv6:采用ARMv6核的处理器是ARM11系列。

ARM1136J(F)-S基于ARMv6主要特性有SIMD、Thumb、Jazelle、DBX、(VFP)、MMU。

ARM1156T2(F)-S基于ARMv6T2 主要特性有SIMD、Thumb-2、(VFP)、MPU。

ARM1176JZ(F)-S基于ARMv6KZ 在ARM1136EJ(F)-S 基础上增加MMU、TrustZone。

ARM指令集讲解

ARM指令集讲解

ARM指令集讲解ARM指令和指令系统:指令是指示计算机某种操作的命令,指令的集合称为指令系统。

指令系统的功能强弱很大程度上决定了这类计算机智能的高低,它集中地反应了微处理器的硬件功能和属性。

ARM指令在机器中的表示格式是用32位的二进制数表示。

如ARM中有一条指令为ADDEQS R0,R1,#8;其二进制代码形式为:31~28 | 27~25 | 24~21 | 20 | 19~16 | 15~12 | 11~0 0000 | 001 | 0100 | 1 | 0001 | 0000 | 0000 0000 1000cond | opcode | Rn | Rd | Op2ARM指令格式一般如下:{}{s},{,}格式中< >的内容是必不可少的,{ }中的内容可忽略表示操作码。

如ADD表示算术加法{} 表示指令执行的条件域。

如EQ、NE等,缺省为AL。

{S} 决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行结果影响CPSR的值,否则不影响表示目的寄存器表示第一个操作数,为寄存器表示第二个操作数,可以是立即数。

寄存器和寄存器移位操作数ARM指令后缀:S、!S后缀:指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。

S后缀常用于对条件进行测试,如是否有溢出,是否进位等,根据这些变化,就可以进行一些判断,如是否大于,相等,从而影响指令执行的顺序。

!后缀:如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。

加上此后缀后,基址寄存器中的值(指令执行后)= 指令执行前的值+ 地址偏移量(1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量(2)!后缀不能用于R15(PC)的后面(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDB R1!,{R3,R5,R7}”。

ARM指令详解

ARM指令详解

ARM指令详解Load/Store指令Load/Store指令用于寄存器和内存间数据的传送。

Load 用于把内存中的数据装载到寄存器中。

Store用于把寄存器中的数据存入内存。

该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。

Load/Store指令分为3类:(1)单一数据传送指令(LDR和STR等)(2)多数据传送指令(LDM和STM)(3)数据交换指令(SWP和SWPB)Load/Store指令1-11.LDR 字数据加载指令格式:LDR{<cond>} <Rd>,<addr>;功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。

地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。

寻址方式:Rn:基址寄存器。

Rm:变址寄存器。

Index:偏移量,12位的无符号数。

LDR Rd,[Rn];把内存中地址为Rn的字数据装入寄存器Rd中LDR Rd,[Rn,Rm];将内存中地址为Rn+Rm的字数据装入寄存器Rd中Load/Store指令1-2LDR Rd,[Rn,#index];将内存中地址为Rn+index的字数据装入Rd中LDR Rd,[Rn,Rm,LSL#5];将内存中地址为Rn+Rm×32的字数据装入RdLDR Rd,[Rn,Rm] !;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn LDR Rd,[Rn,#index] !;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index 写入RnLDR Rd,[Rn,Rm,LSL#5]!;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入RnLoad/Store指令1-3LDR Rd,[Rn],Rm;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入RnLDR Rd,[Rn],#index;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入RnLDR Rd,[Rn],Rm,LSL#5;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn例如:LDR R0,[R1,R2,LSL#5]!; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1Load/Store指令2LDRB 字节数据加载指令格式:LDR{<cond>}B <Rd>,<addr>;功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。

ARM指令集详解(超详细!带实例!)

ARM指令集详解(超详细!带实例!)

算术和逻辑指令ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC将把两个操作数加起来,并把结果放置到目的寄存器中。

它使用一个进位标志位,这样就可以做比32 位大的加法。

下列例子将加两个128 位的数。

128 位结果: 寄存器0、1、2、和3第一个128 位数: 寄存器4、5、6、和7第二个128 位数: 寄存器8、9、10、和11。

ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。

ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD将把两个操作数加起来,把结果放置到目的寄存器中。

操作数 1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。

AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

ARM指令集

ARM指令集

ARM寻址方式
立即寻址 寄存器寻址
第2操作数为寄存器型的移位操作 第2操作数移位方式 第2操作数的移位位数
寄存器间接寻址 基址加偏址寻址
前变址模式 自动变址模式 后变址模式 偏移地址 传送数据类型
堆栈寻址 块拷贝寻址 相对寻址
ARM指令详细介绍
数据处理指令 Load/Store指令 状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断产生指令 协处理器指令 未使用的指令空间
指令分类及指令格式
指令分类简述
数据处理指令、Load/Store指令、跳转指令、程序状 态寄存器处理指令、协处理器指令、异常产生指令
指令格式
<opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}
基本指令格式说明 opcode(操作码),cond(可选的条件码),S (可选后缀),Rd(目标寄存器),Rn(存放 第一操作数的寄存器),operand2(第2个操作 数)
数据处理指令
ADD、ADC、SUB、RSB、SBC和RSB AND、ORR、EOR和BIC MOV和MVN CMP和CMN TST和TEQ 乘法指令
Load/Store指令
单寄存器存取指令 多寄存器存取指令 存储器和寄存器交换指令SWP
状态寄存器与通用寄存器之间的传送 指令
状态寄存器到通用寄存器的传送指令 MRS 通用寄存器到状态寄存器的传送指令 MSR
转移指令
转移和转移链接指令(B、BL) 转移交换和转移链接交换(BX、BLX)
异常中断产生指令
软件中断指令SWI 断点指令(BK的数据操作 协处理器的数据存取 协处理器的寄存器传送

常用ARM指令集及汇编

常用ARM指令集及汇编

常⽤ARM指令集及汇编ARM7TDMI(-S)指令集及汇编ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和16 位 Thumb 指令集,ARM 指令集效率⾼,但是代码密度低,⽽ Thumb 指令集具有更好的代码密度,却仍然保持 ARM 的⼤多数性能上的优势,它是 ARM 指令集的⼦集。

所有 ARM 指令都是可以有条件执⾏的,⽽ Thumb 指令仅有⼀条指令具备条件执⾏功能。

ARM 程序和Thumb 程序可相互调⽤,相互之间的状态切换开销⼏乎为零。

ARM 处理器寻址⽅式寻址⽅式是根据指令中给出的地址码字段来实现寻找真实操作数地址的⽅式,ARM 处理器有 9 种基本寻址⽅式。

寄存器寻址操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执⾏时直接取出寄存器值操作。

寄存器寻址指令举例如下:MOV R1,R2;R2 -> R1SUB R0,R1,R2;R1 - R2 -> R0⽴即寻址⽴即寻址指令中的操作码字段后⾯的地址码部分就是操作数本⾝,也就是说,数据就包含在指令当中,取出指令也就取出了可以⽴即使⽤的操作数(⽴即数)。

⽴即寻址指令举例如下:SUBS R0,R0,#1 ;R0 – 1 -> R0MOV R0,#0xff00 ;0xff00 -> R0 ⽴即数要以“#”为前缀,表⽰ 16 进制数值时以“0x”表⽰。

寄存器偏移寻址寄存器偏移寻址是ARM指令集特有的寻址⽅式,当第2操作数是寄存器偏移⽅式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进⾏移位操作。

寄存器偏移寻址⽅式指令举例如下:MOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放⼊ R0,即 R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作,结果放⼊ R1 可采⽤的移位操作如下:LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0LSR:逻辑右移(Logical Shift Right),寄存器中字的⾼端空出的位补 0ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的⾼端空出的位补 0,否则补 1 ROR:循环右移(Rotate Right),由字的低端移出的位填⼊字的⾼端空出的位 RRX:带扩展的循环右移(Rotate Right eXtended by1place),操作数右移⼀位,⾼端空出的位⽤原 C 标志值填充。

arm指令集详解2

arm指令集详解2

arm指令集详解2Load/Store指令Load/Store指令用于寄存器和内存间数据的传送。

Load 用于把内存中的数据装载到寄存器中。

Store用于把寄存器中的数据存入内存。

该集合的指令使用频繁,在指令集中最为重要,因为其他指令只能操作寄存器,当数据存放在内存中时,必须先把数据从内存装载到寄存器,执行完后再把寄存器中的数据存储到内存中。

Load/Store指令分为3类:(1)单一数据传送指令(LDR和STR等)(2)多数据传送指令(LDM和STM)(3)数据交换指令(SWP和SWPB)Load/Store指令1-11.LDR 字数据加载指令格式:LDR{<cond>} <Rd>,<addr>;功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。

地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。

寻址方式:Rn:基址寄存器。

Rm:变址寄存器。

Index:偏移量,12位的无符号数。

LDR Rd,[Rn];把内存中地址为Rn的字数据装入寄存器Rd中LDR Rd,[Rn,Rm];将内存中地址为Rn+Rm的字数据装入寄存器Rd中Load/Store指令1-2LDR Rd,[Rn,#index];将内存中地址为Rn+index的字数据装入Rd中LDR Rd,[Rn,Rm,LSL#5];将内存中地址为Rn+Rm×32的字数据装入RdLDR Rd,[Rn,Rm] !;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入RnLDR Rd,[Rn,#index] !;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入RnLDR Rd,[Rn,Rm,LSL#5]!;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入RnLoad/Store指令1-3LDR Rd,[Rn],Rm;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入RnLDR Rd,[Rn],#index;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index 写入RnLDR Rd,[Rn],Rm,LSL#5;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn例如:LDR R0,[R1,R2,LSL#5]!; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1Load/Store指令2LDRB 字节数据加载指令格式:LDR{<cond>}B <Rd>,<addr>;功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。

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

算术和逻辑指令ADC:带进位的加法(Ad dition with C arry)ADC{条件}{S}<dest>,<op1>,<op2>dest=op_1+op_2+carryADC将把两个操作数加起来,并把结果放置到目的寄存器中。

它使用一个进位标志位,这样就可以做比32位大的加法。

下列例子将加两个128位的数。

128位结果:寄存器0、1、2、和3第一个128位数:寄存器4、5、6、和7第二个128位数:寄存器8、9、10、和11。

ADDS R0,R4,R8;加低端的字ADCS R1,R5,R9;加下一个字,带进位ADCS R2,R6,R10;加第三个字,带进位ADCS R3,R7,R11;加高端的字,带进位如果如果要做这样的加法,不要忘记设置S后缀来更改进位标志。

ADD:加法(Add ition)ADD{条件}{S}<dest>,<op1>,<op2>dest=op_1+op_2ADD将把两个操作数加起来,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0,R1,R2;R0=R1+R2ADD R0,R1,#256;R0=R1+256ADD R0,R2,R3,LSL#1;R0=R2+(R3<<1)加法可以在有符号和无符号数上进行。

AND:逻辑与(logical AND)AND{条件}{S}<dest>,<op1>,<op2>dest=op_1AND op_2AND将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:AND R0,R0,#3;R0=保持R0的位0和1,丢弃其余的位。

AND的真值表(二者都是1则结果为1):Op_1Op_2结果000010100111BIC:位清除(Bi t C lear)BIC{条件}{S}<dest>,<op1>,<op2>dest=op_1AND(!op_2)BIC是在一个字中清除位的一种方法,与OR位设置是相反的操作。

操作数2是一个32位位掩码(mask)。

如果如果在掩码中设置了某一位,则清除这一位。

未设置的掩码位指示此位保持不变。

BIC R0,R0,#%1011;清除R0中的位0、1、和3。

保持其余的不变。

BIC真值表:Op_1Op_2结果000010101110译注:逻辑表达式为Op_1AND NOT Op_2EOR:逻辑异或(logical E xclusive OR)EOR{条件}{S}<dest>,<op1>,<op2>dest=op_1EOR op_2EOR将在两个操作数上进行逻辑异或,把结果放置到目的寄存器中;对反转特定的位有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:EOR R0,R0,#3;反转R0中的位0和1EOR真值表(二者不同则结果为1):Op_1Op_2结果000011101110MOV:传送(Mov e)MOV{条件}{S}<dest>,<op1>dest=op_1MOV从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

你可以指定相同的寄存器来实现NOP指令的效果,你还可以专门移位一个寄存器:MOV R0,R0;R0=R0...NOP指令MOV R0,R0,LSL#3;R0=R0*8如果R15是目的寄存器,将修改程序计数器或标志。

这用于返回到调用代码,方法是把连接寄存器的内容传送到R15:MOV PC,R14;退出到调用者MOVS PC,R14;退出到调用者并恢复标志位(不遵从32-bit体系)MVN:传送取反的值(M o v e N egative)MVN{条件}{S}<dest>,<op1>dest=!op_1MVN从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。

不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。

这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值:MVN R0,#4;R0=-5MVN R0,#0;R0=-1ORR:逻辑或(logical OR)ORR{条件}{S}<dest>,<op1>,<op2>dest=op_1OR op_2OR将在两个操作数上进行逻辑或,把结果放置到目的寄存器中;对设置特定的位有用。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:ORR R0,R0,#3;设置R0中位0和1OR真值表(二者中存在1则结果为1):Op_1Op_2结果000011101111RSB:反向减法(R everse S u b traction)RSB{条件}{S}<dest>,<op1>,<op2>dest=op_2-op_1SUB用操作数two减去操作数one,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:RSB R0,R1,R2;R0=R2-R1RSB R0,R1,#256;R0=256-R1RSB R0,R2,R3,LSL#1;R0=(R3<<1)-R2反向减法可以在有符号或无符号数上进行。

RSC:带借位的反向减法(R everse S ubtraction with C arry)RSC{条件}{S}<dest>,<op1>,<op2>dest=op_2-op_1-!carry同于SBC,但倒换了两个操作数的前后位置。

SBC:带借位的减法(S u b traction with C arry)SBC{条件}{S}<dest>,<op1>,<op2>dest=op_1-op_2-!carrySBC做两个操作数的减法,把结果放置到目的寄存器中。

它使用进位标志来表示借位,这样就可以做大于32位的减法。

SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志。

所以,指令要对进位标志进行一个非操作-在指令执行期间自动的反转此位。

SUB:减法(Sub traction)SUB{条件}{S}<dest>,<op1>,<op2>dest=op_1-op_2SUB用操作数one减去操作数two,把结果放置到目的寄存器中。

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:SUB R0,R1,R2;R0=R1-R2SUB R0,R1,#256;R0=R1-256SUB R0,R2,R3,LSL#1;R0=R2-(R3<<1)减法可以在有符号和无符号数上进行。

移位指令ARM处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。

你还可以使用桶式移位器影响在LDR/STR操作中的变址值。

译注:移位操作在ARM指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。

如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。

如果数据处理指令的第二个操作数是立即值,在指令中用8位立即值和4位循环移位来表示它,所以对大于255的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。

在逻辑类指令中,逻辑运算指令由指令中S位的设置或清除来确定是否影响进位标志,而比较指令的S位总是设置的。

在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。

下面是给不同的移位类型的六个助记符:LSL逻辑左移ASL算术左移LSR逻辑右移ASR算术右移ROR循环右移RRX带扩展的循环右移ASL和LSL是等同的,可以自由互换。

你可以用一个立即值(从0到31)指定移位数量,或用包含在0和31之间的一个值的寄存器指定移位数量。

逻辑或算术左移(L ogical or A rithmetic S hift L eft)Rx,LSL#n orRx,ASL#n orRx,LSL Rn orRx,ASL Rn接受Rx的内容并按用‘n’或在寄存器Rn中指定的数量向高有效位方向移位。

最低有效位用零来填充。

除了概念上的第33位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中S位被设置了,则此位将成为从桶式移位器退出时进位标志的值。

考虑下列:MOV R1,#12MOV R0,R1,LSL#2在退出时,R0是48。

这些指令形成的总和是R0=#12,LSL#2等同于BASIC的R0=12<<2逻辑右移(L ogical S hift R ight)Rx,LSR#n orRx,LSR Rn它在概念上与左移相对。

把所有位向更低有效位方向移动。

如果逻辑类指令中S位被设置了,则把最后被移出最右端的那位放置到进位标志中。

它同于BASIC的register=value>>>shift。

算术右移(A rithmetic S hift R ight)Rx,ASR#n orRx,ASR Rn类似于LSR,但使用要被移位的寄存器(Rx)的第31位的值来填充高位,用来保护补码表示中的符号。

如果逻辑类指令中S位被设置了,则把最后被移出最右端的那位放置到进位标志中。

它同于BASIC的register=value>>shift。

循环右移(Ro tate R ight)Rx,ROR#n orRx,ROR Rn循环右移类似于逻辑右移,但是把从右侧移出去的位放置到左侧,如果逻辑类指令中S位被设置了,则同时放置到进位标志中,这就是位的‘循环’。

一个移位量为32的操作将导致输出与输入完全一致,因为所有位都被移位了32个位置,又回到了开始时的位置!带扩展的循环右移(R otate R ight with e x tend)Rx,RRX这是一个ROR#0操作,它向右移动一个位置-不同之处是,它使用处理器的进位标志来提供一个要被移位的33位的数量。

乘法指令指令格式这两个指令与普通算术指令在对操作数的限制上有所不同:1.给出的所有操作数、和目的寄存器必须为简单的寄存器。

相关文档
最新文档