ARM指令大全

合集下载

ARM常见指令

ARM常见指令

C代码:对应的汇编代码:If(a > b) CMP R0,R1 ;R0(a)与R1(b)比较a++; ADDHI R0,R0,#1 ;若R0>R1,则R0=R0+1Else ADDLS R1,R1,#1 ;若R0≤1,则R1=R1+1b++;LDRSB R1,[R0,R3] ;将R0+R3地址上的字节数据读到R1,高24位;用符号位扩展LDRSH R1,[R9] ;将R9地址上的半字数据读出到R1,高16位用符号;位扩展LDRH R6,[R2],#2;将R2地址上的半字数据读出到R6,高16位用零扩;展,R2=R2+2STRH R1,[Ro,#2]! ;将R1的数据保存到R0+2地址中,只存储低2;字节数据,R0=R0+2MOV PC,R0 ;PC=R0,程序跳转到指定地址LDR R0,[R1],-R2 ;Rl所指存储器单元内容存人R0,且R1 = R1 - R2(1).寄存器寻址MOV R1,R2 ;将R2的值存入R1SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0MOV PC,R0 ;PC=R0,程序跳转到指定地址(R0)(2).立即数寻址SUBS R0,R0,#1 ;R0减1,结果放入R0,并且影响标志位MOV R0,#0xFF000 ;将立即数0xFF000装入R0寄存器(3).寄存器移位寻址MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0,即是R0=R2×8ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相“与”操作,结果放入R1 ADD R3,R2,R1,LSL #3 ;R3←R2+8*R1(LSL:逻辑左移LSR:逻辑右移ASR算术右移ROR循环右移RRX扩展为1的循环右移)(4).寄存器间接寻址LDR R1,[R2] ;将R2指向的存储单元的数据读出保存在R1中SWP R1,R1,[R2] ;将寄存器R1的值和R2指定的存储单元的内容交换(5).基址寻址LDR R2,[R3,#0x0C] ;读取R3+0x0C地址上的存储单元的内容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存到保存到R0指定的存储单元基址加偏移-前索引寻址LDR R0,[R1,#4] ;R0←[R1+4]基址加偏移-带自动索引的前索引寻址LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4基址加偏移-后索引寻址LDR R0,[R1],#4 ;R0←[R1]、R1←R1+4基址加索引寻址LDR R0,[R1,R2] ;R0←[R1+R2](6).多寄存器寻址LDMIA R1!,{R2-R7,R12} ;将R1指向的单元中的数据读出到R2~R7、R12中(R1自动加1)STMIA R0!,{R2-R7,R12} ;将寄存器R2~R7、R12的值保存到R0指向的存储单元中;(R0自动加1)(7).堆栈寻址向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。

常用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指令

常⽤ARM指令常⽤ARM指令1:数据处理指令 mov mvn MOV(MOVE)指令可完成从另⼀个寄存器、被移位的寄存器或将⼀个⽴即数加载到⽬的寄存器MOV R0,R1;R1的值传到R0MOV R3,#3 ;把常数3传给R3MVN( MOVE Negative)取反后再传值,⽐MOV多了⼀步取反MVN R0, #0 ;把0取反(即-1)传给R0MVN R1,R2 ;把R2的值取反传给R1 算术指令 add sub rsb adc sbc rsc ADD加法指令 ADD R0,R1,R2; R0=R1+R2 ADD R0,R1,#3 ;R0=R1+3 ADC带进位加法指令,即除了加两个数以外,还要把CPSR的C值也要带进来 通常⽤于⼤数(超过32Bit整数)相加,这时单⽤ADD不能处理,必须折成两步,其中⼀步⽤ADC. 以下是做64Bit的加法 ADDS R0,R1,R2; R0=R1+R2,ADDS中S表⽰把进位结果写⼊CPSR ADC R5,R3,R4 ;R5=R3+R4+C 逻辑指令 and orr eor bic AND位与指令 AND R0,R1,R2; R0=R1 & R2 AND R0,R1,#0xFF ;R0=R1 & 0xFF ORR位或指令 ORR R0,R1,R2; R0=R1 | R2 ORR R0,R1,#0xFF ;R0=R1 | 0xFF TST测试某⼀位是否为1,并把结果写⼊CPSR,供下⼀句使⽤ TST R1,#0xffe; 等同于if(R1 & 0xffe) TST R1,#%1;测试最低位是否为1,%表⽰⼆进制 BIC清位操作 BIC R0,R0,#0xF;等同于 R0 &=~(0xF) BIC R0,R0,#%1011;该指令清除 R0 中的位 0 1 3,其余的位保持; %表⽰是⼆进制,0x表⽰⼗六进制 ⽐较指令 cmp cmn tst teq CMP⽐较两个操作数,并把结果存⼊CPSR供下⼀句语句使⽤ CMP R0,R1; ⽐较R0,R1 乘法指令 mvl mla umull umlal smull small MUL R0,R1,R2 ;R0 = R1 × R2MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位 MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3MLAS R0× R2 + R3,同时设置CPSR中的相关条件标志位 SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 ;R1 = (R2 × R3)的⾼32位 加载/存储指令 LDR,STR LDR R0,[R1]; R1的值当成地址,再从这个地址装⼊数据到R0 (R0=*R1) LDR R1,=0x30008000 ; 把地址0x30008000的值装⼊到R1中 STR R0,[R1] ; 把R0的值,存⼊到R1对应地址空间上(*R1 = R0)。

arm 汇编 指令

arm 汇编 指令

arm 汇编指令ARM汇编指令是一种用于编写ARM处理器程序的语言。

ARM处理器广泛应用于嵌入式系统和移动设备等领域。

ARM汇编指令与x86汇编指令有所不同,它基于RISC(精简指令集计算机)架构。

下面是一些基本的ARM汇编指令:1. 数据传输指令:用于在寄存器之间传输数据。

例如:- mov:将数据从一个寄存器传输到另一个寄存器。

- ldr:将数据从内存传输到寄存器。

2. 算术指令:用于执行加法、减法、乘法和除法等操作。

例如:- add:加法操作。

- sub:减法操作。

- mull:乘法操作。

- div:除法操作。

3. 逻辑指令:用于执行逻辑操作,如与、或、非等。

例如:- and:与操作。

- or:或操作。

- xor:异或操作。

4. 移位指令:用于对数据进行左移、右移或无符号右移。

例如:- lsr:无符号右移。

- asr:带符号右移。

- ror:循环右移。

5. 比较指令:用于比较两个寄存器的值。

例如:- cmp:比较两个寄存器的值,若相等则返回0,否则返回1。

6. 跳转指令:用于改变程序的执行流程。

例如:- b:条件跳转。

- bl:无条件跳转。

- bx:带状态跳转。

7. 循环指令:用于实现循环操作。

例如:- loop:内部循环。

- ldp:外部循环。

8. 调用指令:用于实现函数调用。

例如:- blx:带状态调用。

- bx:不带状态调用。

9. 系统调用指令:用于实现与操作系统交互的功能。

例如:- swi:执行系统调用。

10. 存储器访问指令:用于访问内存数据。

例如:- str:将数据存储到内存。

- ldr:从内存中加载数据。

以上仅为ARM汇编指令的一部分,实际上,ARM汇编指令还有很多其他功能。

为了更好地理解和使用ARM汇编指令,可以参考相关的教程和手册,并进行实际操作。

ARM指令集

ARM指令集

ARM指令集6种类型(53种主要助记符):数据处理指令(22种主要助记符)跳转指令(4种主要助记符)Load/Store指令(16种主要助记符)程序状态寄存器指令(2种主要助记符)协处理器指令(5种主要助记符)软件中断指令(2种主要助记符)数据处理指令数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;乘法指令比较指令。

数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。

所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。

数据处理指令1MOV 数据传送指令格式:MOV{<cond>}{S} <Rd>,<op1>;功能:Rd=op1op1可以是寄存器、被移位的寄存器或立即数。

例如:MOV R0,#5 ;R0=5MOV R0,R1 ;R0=R1MOV R0,R1,LSL#5 ;R0=R1左移5位数据处理指令22.MVN 数据取反传送指令格式:MVN{<cond>}{S} <Rd>,<op1>;功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;op1可以是寄存器、被移位的寄存器或立即数。

例如:MVN R0,#0 ;R0=-1数据处理指令33.ADD 加法指令格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2op2可以是寄存器,被移位的寄存器或立即数。

例如:ADD R0,R1,#5 ;R0=R1+5ADD R0,R1,R2 ;R0=R1+R2ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位数据处理指令44.ADC 带进位加法指令格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2+carryop2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。

实用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 指令
1、 内存访问指令 基本指令:
LDR:memory -> register (memory 包括 映射到内存空间的非通用寄存器)
STR:register -> memory
语法:
op{cond }{B}{T} Rd , [Rn ]
op{cond }{B} Rd , [Rn , FlexOffset ]{!}
;引用外部符号
EXPORT令定义程序
的开始
start
;此处定义了一个label
start
MOV r0, #10
MOV r1, #3
ADD r0, r0, r1
;r0 =r0 +r1
prog1
;此处定义了一个label
prog1
MOV r0, #0x18
;
7、 跳转指令 基本指令:
B:跳转 BL:跳转并将下一指令的地址存入 lr 寄存 器
语法:
op{cond} label label:要跳向的地址
例子:
loop1
~~~ b loop1
; 跳到地址 loop1 处
bl sub1
; 将下一指令地址写入 lr,并跳
至 sub1
~~~
sub1
~~~
mov pc, lr
op{cond }{B} Rd , label
op{cond }{B}{T} Rd , [Rn ],FlexOffset op:基本指令,如 LDR、STR cond:条件执行后缀 B:字节操作后缀 T:用户指令后缀 Rd:源寄存器,对于 LDR 指令,Rd 将保存从 memory 中读取的数值;对于 STR 指令,Rd 保存着将写入 memory 的数值 Rn:指针寄存器 FlexOffset:偏移量

ARM指令大全

ARM指令大全

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寄存器方式,在寄存器方式下操作数即为寄存器的数值。

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

目录一、跳转指令 (4)1、B指令 (4)2、BL指令 (4)3、BLX指令 (4)4、BX指令 (5)二、数据处理指令 (5)1、MOV指令 (5)2、MVN指令 (5)3、CMP指令 (6)4、CMN指令 (6)5、TST指令 (6)6、TEQ指令 (7)7、ADD指令 (7)8、ADC指令 (7)9、SUB指令 (7)10、~~~~C指令 (8)11、R~~~~指令 (8)12、RSC指令 (8)13、AND指令 (9)14、ORR指令 (9)15、EOR指令 (9)16、BIC指令 (9)三、法指令与乘加指令 (10)1、MUL指令 (10)2、MLA指令 (10)3、SMULL指令 (10)4、SMLAL指令 (11)5、UMULL指令 (11)6、UMLAL指令 (11)四、程序状态寄存器访问指令 (12)1、MRS指令 (12)2、MSR指令 (12)五、加载/存储指令 (12)1、LDR指令 (12)2、LDRB指令 (13)3、LDRH指令 (14)4、STR指令 (14)5、STRB指令 (14)6、STRH指令 (15)六、批量数据加载/存储指令 (15)LDM(或STM)指令 (15)IA (15)IB (15)DA (15)DB (15)FD (15)ED (15)FA (15)EA (15)七、数据交换指令 (16)1、SWP指令 (16)2、SWPB指令 (16)八、移位指令(操作) (16)1、LSL(或ASL) (17)2、LSR (17)3、ASR (17)4、ROR (17)5、RRX (17)九、协处理器指令 (18)1、CDP指令 (18)2、LDC指令 (18)3、STC指令 (18)4、MCR指令 (19)5、MRC指令 (19)十、异常产生指令 (19)1、SWI指令 (19)2、BKPT指令 (20)一、符号定义(Symbol Definition)伪指令 (20)1、GBLA、GBLL和GBLS (20)2、LCLA、LCLL和LCLS (21)3、SETA、SETL和SETS (22)4、RLIST (22)二、数据定义(Data Definition)伪指令 (23)1、DCB (23)2、DCW(或DCWU) (23)3、DCD(或DCDU) (24)4、DCFD(或DCFDU) (24)5、DCFS(或DCFSU) (25)6、DCQ(或DCQU) (25)7、SPACE (25)8、MAP (26)9、FILED (26)三、汇编控制(Assembly Control)伪指令 (27)1、IF、ELSE、ENDIF (27)2、WHILE、WEND (28)3、MACRO、MEND (29)4、MEXIT (29)四、其他常用的伪指令 (30)1、AREA (30)2、ALIGN (31)3、CODE16、CODE32 (31)4、ENTRY (32)5、END (32)6、EQU (33)7、EXPORT(或GLOBAL) (33)8、IMPORT (34)9、EXTERN (35)10、GET(或INCLUDE) (35)11、INCBIN (36)12、RN (36)13、ROUT (37)一、跳转指令跳转指令用于实现程序流程的跳转,在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指令实现子程序的调用和处理器工作状态的切换。

同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。

4、BX指令BX指令的格式为:BX{条件} 目标地址BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。

二、数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和存储器之间进行数据的双向传输。

算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。

比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

数据处理指令共以下16条。

1、MOV指令MOV指令的格式为:MOV{条件}{S} 目的寄存器,源操作数MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。

其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR 中条件标志位的值。

指令示例:MOV R1,R0 ;将寄存器R0的值传送到寄存器R1MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R12、MVN指令MVN指令的格式为:MVN{条件}{S} 目的寄存器,源操作数MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。

与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。

其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR 中条件标志位的值。

指令示例:MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1 3、CMP指令CMP指令的格式为:CMP{条件} 操作数1,操作数2CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。

该指令进行一次减法运算,但不存储结果,只更改条件标志位。

标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。

指令示例:CMP R1,R0 ;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMPR1,#100 ;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位4、CMN指令CMN指令的格式为:CMN{条件} 操作数1,操作数2CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。

该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。

指令示例:CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位CMNR1,#100 ;将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位5、TST指令TST指令的格式为:TST{条件} 操作数1,操作数2TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。

操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。

指令示例:TST R1,#%1 ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)TSTR1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR 的标志位6、TEQ指令TEQ指令的格式为:TEQ{条件} 操作数1,操作数2TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。

该指令通常用于比较操作数1和操作数2是否相等。

指令示例:TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位7、ADD指令ADD指令的格式为:ADD{条件}{S} 目的寄存器,操作数1,操作数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)8、ADC指令ADC指令的格式为:ADC{条件}{S} 目的寄存器,操作数1,操作数2ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。

它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:ADDS R0,R4,R8 ;加低端的字ADCS R1,R5,R9 ;加第二个字,带进位ADCS R2,R6,R10 ;加第三个字,带进位ADC R3,R7,R11 ;加第四个字,带进位9、SUB指令SUB指令的格式为:SUB{条件}{S} 目的寄存器,操作数1,操作数2SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。

相关文档
最新文档