ARM指令集-乘法指令与乘加指令
ARM汇编语言指令总结
ARM汇编语⾔指令总结ARM处理器有9种寻址⽅式:1、寄存器寻址,2、⽴即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。
ARM指令集:ARM指令基本格式如下:{}{S} ,{,}其中<>的内容是必须的,{}的内容是可选的。
OPCODE指令助记符,COND执⾏条件,S是否影响CPSR中的值,Rd⽬标寄存器,Rn 第⼀个操作数的寄存器,OPERAND2第⼆个操作数。
灵活的使⽤第2个操作数“operand2”能够提⾼代码效率。
它有如下的形式:1)#immed_8r ——常数表达式;2)Rm——寄存器⽅式;3)Rm,shift——寄存器移位⽅式(ASR算术右移,LSL逻辑左移,LSR 逻辑右移,ROR循环右移,RRX带扩展的右移1位)。
COND执⾏条件:下⾯介绍ARM指令:1、存储器访问指令。
存储器访问指令分为单寄存器操作指令和多寄存器操作指令。
单寄存器操作指令LDR/STR指令⽤于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。
LDR:从内存到寄存器,加载数据。
STR:将寄存器的数据存储到内存。
LDRB操作字节,LDRH操作半字,LDRSH操作有符号半字。
多寄存器操作指令LDM为加载多个寄存器;STM为存储多个寄存器。
允许⼀条指令传送16个寄存器的任何⼦集或所有寄存器。
它们主要⽤于现场保护、数据复制、常数传递等。
进⾏数据复制时,先设置好源数据指针和⽬标指针,然后使⽤块拷贝寻址指令LDMIA/STMIA(传送后地址加4)、LDMIB/STMIB(传送前地址加4)、LDMDA/STMDA(传送后地址减4)、LDMDB/STMDB(传送前地址减4)进⾏读取和存储。
进⾏堆栈操作操作时,要先设置堆栈指针(SP),然后使⽤堆栈寻址指令STMFD/LDMFD(满递减堆栈)、STMED/LDMED(空递减堆栈)、STMFA/LDMFA(满递增堆栈)和STMEA/LDMEA(空递增堆栈)实现堆栈操作。
常用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处理器程序的语言。
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指令集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为进位标志值。
乘法其他指令
3.2 ARM指令系统 指令系统 • ARM指令——乘法指令
助记符 MUL MLA Rd,Rm,Rs Rd,Rm,Rs,Rn 说明 32位乘法指令 32位乘加指令 64位无符号乘法指令 64位无符号乘加指令 64位有符号乘法指令 64位有符号乘加指令 操作 Rd←Rm*Rs (Rd≠Rm) Rd←Rm*Rs+Rn (Rd≠Rm) (RdLo,RdHi) ←Rm*Rs (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) (RdLo,RdHi) ←Rm*Rs (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) 条件码位置 MUL{cond}{S} MLA{cond}{S} UMULL{cond}{S} UMLAL{cond}{S} SMULL{cond}{S} SMLAL{cond}{S}
<MTSE1.0>
3.2 ARM指令系统 指令系统 • ARM指令——乘法指令
助记符 MUL MLA Rd,Rm,Rs Rd,Rm,Rs,Rn 说明 32位乘法指令 32位乘加指令 64位无符号乘法指令 操作 Rd←Rm*Rs (Rd≠Rm) Rd←Rm*Rs+Rn (Rd≠Rm) (RdLo,RdHi) ←Rm*Rs (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) (RdLo,RdHi) ←Rm*Rs (RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi) 条件码位置 MUL{cond}{S} MLA{cond}{S} UMULL{cond}{S}
MUL MULS MLA 错例: MUL MLA R15,R0,R3 R1 ,R1,R6 R1,R2,R3 ;R1=R2×R3
R0,R3,R7 ;R0=R3×R7,同时影响CPSR中的N位和Z位 R1,R2,R3,R0 ;R1=R2×R3+R0
arm指令
一、加减法指令:1、MOV(move):数据传送指令2、MVN(move negative):数据取反传送指令3、ADD(add):加法4、ADC(add with carry):带进位加法5、SUB(subtract):减法6、RSB(reverse subtract):反向减法7、SBC(subtract with carry):带借位的减法SBC{<cond>}{S} <Rd>,<Rn>,<op2> ;Rd=Rn-op2-carry8、RSC(reverse subtract with carry):带借位的反向减法RSC{<cond>}{S} <Rd>,<Rn>,<op3> ;Rd= op3-Rn-!carry二、逻辑指令1、AND:逻辑与2、ORR(logical or):逻辑或3、EOR(exclusive or):逻辑异或4、BIC(bit clear):位清零5、CLZ(count leading zeros):位计数。
CLZ{<cond>} <Rd>,<Rm>;计算存储在Rm寄存器中各位为0的总个数。
三、乘法指令1、MUL(multiply):32位乘法2、MLA(multiply accumulate):32位乘加MLA{<cond>} {S} <Rd>,<Rn>,<op2>,<op3>;3、SMULL(signed multiplication long):64位有符号数乘法SMULL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;Rdh Rdl=Rn×op2,结果的高32位存入Rdh,低32位存入Rdl。
ARMCortexM3指令集
ARMCortexM3指令集⼀、跳转指令跳转指令⽤于实现程序流程的跳转,在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 中。
ARM指令集详解
用于返回到调用代码,方法是把连接存放器的内容传送 到 R15: • MOV PC, R14 ; 退出到调用者 • MOVS PC, R14 ; 退出到精调品P用PT 者并恢复标志位
目的存放器中。操作数 Rn 是一个存放器,操作 数 op_2可以是一个存放器,被移位的存放器, 或一个立即值:
• RSB R0, R1, R2 ; R0 = R2 - R1
• RSB R0, R1, #256 ; R0 = 256 - R1
• RSB R0, R2, R3,LSL #1 ; R0 = (R3 << 1) - R2
• CMP R1,R2
• MOVNE R0,#0xff
精品PPT
比较指令
• CMN : 比较取负的值 • CMN{条件}{P} <op 1>, <op 2> • status = op_1 - (- op_2) • CMN 同于 CMP,但它允许你与小负值(操作数
2 的取负的值)进行比较,与 -1 比较将使用: • CMN R0, #1 ; 把 R0 与 -1 进行比较
• ADDS R0, R4, R8 ; 加低端的字
• ADCS R1, R5, R9 ; 加下一个字,带进位
• ADCS R2, R6, R10 ; 加第三个字,带进位
• ADCS R3, R7, R11 ; 加高端的字,带进位 如果要做这 样的加法,不要忘记设置 S 后缀来更改进位标志。
精品PPT
• TST R0, #0x3F8 精品PPT
测试指令
• TEQ{条件}{P} <op 1>, <op 2> • Status = op_1 EOR op_2 • TEQ 类似于 TST。区别是 EOR 而不是 AND。
一ARM微处理器的指令的分类与
一、ARM 微处理器的指令的分类与格式ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。
下面是ARM微处理器的基本指令。
助记符指令功能描述ADC 带进位加法指令ADD 加法指令AND 逻辑与指令B 跳转指令BIC 位清零指令BL 带返回的跳转指令BLX 带返回和状态切换的跳转指令BX 带状态切换的跳转指令CDP 协处理器数据操作指令CMN 比较反值指令CMP 比较指令EOR 异或指令LDC 存储器到协处理器的数据传输指令LDM 加载多个寄存器指令LDR 存储器到寄存器的数据传输指令MCR 从ARM 寄存器到协处理器寄存器的数据传输指令MLA 乘加运算指令MOV 数据传送指令MRC 从协处理器寄存器到ARM 寄存器的数据传输指令MRS 传送CPSR 或SPSR 的内容到通用寄存器指令MSR 传送通用寄存器到CPSR 或SPSR 的指令MUL 32 位乘法指令MLA 32 位乘加指令MVN 数据取反传送指令ORR 逻辑或指令RSB 逆向减法指令RSC 带借位的逆向减法指令SBC 带借位减法指令STC 协处理器寄存器写入存储器指令STM 批量内存字写入指令STR 寄存器到存储器的数据传输指令SUB 减法指令SWI 软件中断指令SWP 交换指令TEQ 相等测试指令TST 位测试指令--------------------------------------------------------------------------------------------------------------------------二、指令的条件域当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。
arm的指令集
arm的指令集
ARM(Advanced RISC Machine)是一种基于RISC(Reduced Instruction Set Computing)架构的处理器指令集。
ARM的指令集可以分为不同的版本和产品系列,主要包括以下几个主要的指令集:1. ARMv4:最早的ARM架构,包含基本的32位指令集。
支持基本的数据处理、数据传输、控制流和内存访问指令等。
2. ARMv5:在ARMv4的基础上添加了一些新的特性,如乘法指令、Jazelle Java加速指令等。
3. ARMv6:引入了Thumb指令集,将每个32位指令压缩为16位,以提高代码密度和节省存储空间。
4. ARMv7:包括ARMv7-A、ARMv7-R和ARMv7-M三个不同的配置。
ARMv7-A是面向应用处理器的指令集,增加了一些新的功能和内核特性,如NEON浮点数SIMD指令集、虚拟化扩展等。
ARMv7-R是面向实时处理器的指令集,增加了对实时操作系统和实时任务的支持。
ARMv7-M是面向嵌入式微控制器的指令集,专注于低功耗、低成本和实时性能。
5. ARMv8:引入了AArch64指令集,支持64位处理器架构,同时保持对32位指令的向后兼容。
ARMv8-A广泛用于高性能服务器、移动设备和嵌入式系统。
除了上述主要的指令集版本外,ARM还有一些针对特定应用领域的扩展指令集,如SIMD指令集(NEON)用于增强媒体和信号处理能力,以及加密扩展指令集(Crypto Extensions)用于加速数据加解密操作等。
ARM常用指令
ARM常用指令ARM常用指令一、数据传送指令1、 mov指令格式: mov{}{s} Rd,op操作: Rd = op;2、 mvn指令格式: mvn{}{s} Rd,op操作: Rd = ~op;二、算术指令1、 add加法指令格式: add{}{s} Rd,Rn,op操作: Rd = Rn + op;2、 adc带进位加法指令格式: adc{}{s} Rd,Rn,op操作: Rd = Rn + op + C;3、 sub减法指令格式: sub{}{s} Rd,Rn,op操作:Rd = Rn - op;4、 sbc带借位减法指令格式: sbc{}{s} Rd,Rn,op操作: Rd = Rn - op - (~C);5、 rsb逆向减法指令格式: rsb{}{s} Rd,Rn,op操作: Rd = op - Rn;6、 rsc带借位的逆向减法指令格式: rsc{}{s} Rd,Rn,op操作: Rd = op - Rn - (~C);三、移位1、 op立即数: #number //#label寄存器: Rm寄存器移位: Rm,<移位符> #number 或 Rm,<移位符> Rs 举例: mov r0,#100 //r0 = 100mov r0,r1 //r0 = r1mov r0,r1,lsr #1 //r0 = r1 >> 1mov r0,r1,lsr r2 //r0 = r1 >> r2add r0,r1,r2,lsr #1 //r0 = r1 + r2 >> 12、移位符lsl 逻辑左移 (unsigned)x << y说明:无符号左移补0lsr 逻辑右移 (unsigned)x >> y说明:无符号右移补0asl 算术左移 (signed)x << y说明:有符号左移补0注意:逻辑左移和算术左移结果一样asr 算术右移 (signed)x >> y说明:有符号右移正数补0,负数补1ror 循环右移 ((unsigned)x >> y) | (x << (32 - y))说明: x逻辑右移y | x逻辑左移 (32 - y)rrx 扩展循环右移 (C << 31) | ((unsigned)x >> 1) 说明:相当于33位循环右移注意:没有y,只移一位四、逻辑指令1、 and逻辑与指令格式: and{}{s} Rd,Rn,op操作: Rd = Rn & op;2、 orr逻辑或指令格式: orr{}{s} Rd,Rn,op操作: Rd = Rn | op;3、 eor逻辑异或指令格式: eor{}{s} Rd,Rn,op操作: Rd = Rn ^ op;4、 bic位清除指令格式: bic{}{s} Rd,Rn,op操作: Rd = Rn & (~op);五、比较指令(默认带S位)1、 cmp比较指令格式: cmp{} Rn,op操作: Rn - op2、 cmn反比较指令格式: cmn{} Rn,op操作: Rn + op3、 tst位测试指令格式: tst{} Rn,op操作: Rn & op4、 teq相等测试指令格式: teq{} Rn,op操作: Rn ^ op六、数据处理指令位图1、 op为寄存器xxxx 000a aaas nnnn dddd cccc cttt mmmm2、 op为立即数xxxx 001a aaas nnnn dddd rrrr bbbb bbbb3、条件xxxx见ARMv4v5v6.pdf P112只有条件为真时才会执行指令,否则忽略该指令,继续下一条4、数据处理指令aaaa见ARMv4v5v6.pdf P1155、条件标志s指令含s则该位为 1 ,否则为 06、寄存器Rd,Rn,Rm分别对应dddd,nnnn,mmmmR0 ---> R150000 ---> 1111没有寄存器的则对应位置为 0,如:mov没有Rn寄存器nnnn位为 0000 ,cmp没有Rd寄存器dddd位为 00007、移位数ccccc立即数方式:最大为 0x1f寄存器方式:第 1 - 4 个c为寄存器编号,第 5 个c为 08、移位符ttt移位符: lsl lsr asr ror立即数编码: 000 010 100 110寄存器编码: 001 011 101 111asl 与 lsl 的编码相同ttt == 110 && ccccc == 00000 表示 rrx9、立即数构造立即数= bbbb bbbb 循环右移 rrrr * 2 次这种方式并不能把所有的32位数都构造出来如: #12345,#0xffff七、常量的装载1、 ldr伪指令格式: ldr Rd,= //ldr只有带'='号时才是伪指令说明:将number或label的值赋给Rd,该指令会伪造成mov、mvn、ldr等可能的指令举例: ldr r0,=0x100 //mov r0,#0x100ldr r0,=0x0 //mvn r0,#0x0ldr r0,=0x12345 //ldr r0,[pc,#offset] //offset是该指令到.word 的偏移量减去8//...//.word 0x123452、 adr / adrl伪指令格式: adr Rd,=label说明:此指令不能用立即数,其他基本和ldr一样,小范围时用adr,大范围用时adrl八、乘法指令1、 mul乘法指令格式: mul{}{s} Rd,Rm,Rs操作: Rd = Rm * Rs;2、 mla乘累加指令格式: mla{}{s} Rd,Rm,Rs,Rn操作: Rd = Rm * Rs + Rn;九、分支指令1、分支指令格式: b{l}{} label位图: xxxx 101L jjjj jjjj jjjj jjjj jjjj jjjj汇编: code[23:0] = (offset - 8) >> 2//offset是label的地址减去当前指令的地址,正数向前跳,负数向后跳code[24] = Lcode[27:25] = 101code[31:28] =操作: if(L == 1)lr = pc - 8 + 4;//保存下一条指令,当把lr的值赋给pc时可实现函数返回pc = pc + (SignExtend_30(code[23:0]) << 2);//SignExtend_30表示有符号扩展30位ARM指令是按每 4 个字节对齐的(所有指令的地址最低两位都为所以可以先右移 2 位保存,取出值后再左移 2 位offset的有效位数是26,共64M,前后各32M2、分支切换指令格式: bx{} Rm操作: pc = Rm & 0xfffffffc;T = Rm[0];格式: blx{} Rm操作: lr = pc + 4 - 8;pc = Rm & 0xfffffffc;T = Rm[0];格式:blx{} label //label必须为thumb指令函数,只能前后各跳32M十、单寄存器load-store指令1、 ldr 32 位数据读取指令格式: ldr{} Rd,addr //addr用法请见内存寻址方式操作: val = *(int *)addr;2、 ldr 16 位数据读取指令格式: ldr{}h Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;3、 ldr 16 位有符号数据读取指令格式: ldr{}sh Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;if(Rd[15] == 1)Rd |= 0xffff0000;4、 ldr 8 位数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff;5、 ldr 8 位有符号数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff; if(Rd[7] == 1)Rd |= 0xffffff00;6、 str 32 位数据写入指令格式: str{} Rd,addr操作: *(int *)addr = Rd;7、 str 16 位数据写入指令格式: str{}h Rd,addr操作: *(short *)addr = Rd[15:0];8、 str 8 位数据写入指令格式: str{}b Rd,addr操作: *(char *)addr = Rd[7:0];注:没有str有符号数据写入指令十一、内存寻址方式1、 label举例: ldr r0,labellebel:.word 0x12345操作: r0 = *(int *)label;2、前变址格式: [Rn,op]操作: addr = Rn + op;注: addr只是地址,还没有取值举例: ldr R0,[R1,#8]操作: addr = R1 + 8;R0 = *(int *)addr;3、回写前变址格式: [Rn,op]!操作: addr = Rn + op;Rn = Rn + op;4、后变址格式: [Rn],op操作: addr = Rn;Rn = Rn + op;5、 ldr、ldrb、str、strb指令的op立即数: #+/-offset_12寄存器: +/-Rm寄存器移位: +/-Rm,<移位符> #number注: #+/-offset_12(与前面的立即数构造方法一样)number最大为0x1f,没有+/-Rm,<移位符> Rs方式的寄存器移位+号可以省略立即数等于 0 可以省略6、 ldrh、ldrsh、ldrsb、strh指令的op立即数: #+/-offset_8寄存器: +/-Rm注: offset_8最大为255,没有寄存器移位7、Rn == pc说明:当Rn == pc时,addr = 当前指令的地址 + 8 + op举例: 0 ldr r0,[pc,#-4]4 .word 0x123458这两行指令等于mov r0,#0x12345,但是0x12345 不能构造成立即数,所以可以通过这种方式来赋值我们不能写成 ldr r0,[pc,#4],因为执行这条指令时pc已经执行地址 8 的指令,应该减去 4 而不是加 4十二、多寄存器方式1、 ldm / stm格式: {}{ia|ib|da|db} Rn{!},R_list//{r0 - r15}^ / {r0,r5,r9,pc},如果顺序不对,编译器会自动按从R0-R15调整// ^表示cpsr --> spsr或spsr -->cpsr操作: if(cond==1){if(ia == 1)//执行后增加,如果寻址模式为空,默认是iaaddr = Rn;else if(ib == 1)//执行前增加addr = Rn + 4;else if(da == 1)//执行后减少addr = Rn - sizeof(R_list) + 4; //sizeof(R_list) == 寄存器数 * 4else //db == 1//执行前减少addr = Rn - sizeof(R_list);if(ldm == 1)ldm_func(addr,R_list);else //stm == 1stm_func(addr,R_list);if(! == 1){if(ia == 1 || ib == 1)Rn += sizeof(R_list);else //da == 1 || db == 1Rn -= sizeof(R_list);}}void ldm_func(addr,R_list) {for(i = 0;i <= 14;i++){if(R_list[i] == 1)R_list[i] = *(int *)addr;addr += 4;}if(R_list[15] == 1){pc = *(int *)addr & 0xfffffffc; }if(^ == 1){cpsr = spsr;}}void stm_func(addr,R_list) {for(i = 0;i <= 15;i++){if(R_list[i] == 1)*(int *)addr = R_list[i];addr += 4;}if(^ == 1){spsr = cpsr;}}2 、更新基地址的指令对,可实现栈的push和pop操作stmia <=======> ldmdbstmib <=======> ldmdastmda <=======> ldmibstmdb <=======> ldmia举例: stmdb sp!,{r1,r2,r3}ldmia sp!,{r1,r2,r3}执行后 sp,r1,r2,r3 的值保持不变3、栈操作栈向高地址扩展的为递增栈(A,ascending),向低地址扩展的为递减栈(D,descending)栈指针(sp)指向的是有效数据称为满栈(F,full),指向的是无效数据称为空栈(E,empty)在ARM-Thumb过程调用标准(ATPCS)中,栈被定义为递减式满栈寻址方式说明 push =stm pop =ldmFA 递增满 stmfa stmib ldmfa ldmdaFD 递减满 stmfd stmdb ldmfd ldmia //arm汇编的push和pop 操作指令EA 递增空 stmea stmia ldmea ldmdbED 递减空 stmed stmda ldmed ldmib十三、程序状态寄存器指令1、 mrs格式: mrs{} Rd,2、 msr格式: msr{} {_fields},fields可以是f、x、s、f的任意组合,表示只对该域操作,默认全部f 表示标志域 psr[31:24]s 表示状态域 psr[23:16]x 表示扩展域 psr[15:8]c 表示控制域 psr[7:0]。
ARM汇编指令集
ARM汇编指令集ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产⽣指令6⼤指令。
⼀、跳转指令跳转指令⽤于实现程序流程的跳转,在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(LR)中3、BLX指令BLX指令的格式为:BLX ⽬标地址BLX指令从ARM指令集跳转到指令中所指定的⽬标地址,并将处理器的⼯作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
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指令集
IRQ(Interrupt Request)
IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚 输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入 FIQ异常时,IRQ可能被屏蔽。
若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位 清零,处理器会在指令执行完之前检查IRQ的输入。注意只 有在特权模式下才能改变I位的状态。
不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ 处理程序均会执行以下指令从IRQ模式返回:
SUBS PC , R14_irq , #4
该指令将寄存器R14_irq的值减去4后,复制到程序计数器PC 中,从而实现从异常处理程序中的返回,同时将SPSR_mode 寄存器的内容复制到当前程序状态寄存器CPSR中。
2、将CPSR复制到相应的SPSR中。 3、根据异常类型,强制设置CPSR的运行模式位。 4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相
应的异常处理程序处。
还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地 址加载入PC时,处理器自动切换到ARM状态。
半字需要2字节对齐(地址的最低位为0)。
5.1 引言--存储器组织
Little- and big-endian memory organizations
5.1 引言—特权模式
ARM operating modes and register usage.
SPSR----每一种特权模式(系统模式除外)都有一个与之相关的程序状态保存寄存器SPSR
0x00
0x00
0x00
0x12
8位常数
00000100100000000000000000000000
ARM指令集
ARM处理器的指令集ARM处理器的指令找了好久都没有找到完整版,在这里我把所有用过的ARM指令都整理下来,方便大家参考。
ADC(不更改状态寄存器): 带进位的加法(Addition with Carry)ADCS(更改状态寄存器)R1, R5, R9 ; R1=R5+R9,带进位ADD : 加法(Addition)ADD R0, R1, #256 ; R0 = R1 + 256AND : 逻辑与(logical AND)AND R0, R0, #3 ; R0 = 保持R0 的位0和1,丢弃其余的位。
BIC : 位清除(Bit Clear)BIC R0, R0, #%1011 ; 清除R0 中的位0、1、和3。
保持其余的不变。
EOR : 逻辑异或(logical Exclusive OR)EOR R0, R0, #3 ; 反转R0 中的位0 和1MOV : 传送(Move)MOV PC, R14 ; PC=R14MOVS PC, R14 ; 退出到调用者并恢复标志位(不遵从32-bit 体系)MVN : 传送取反的值(MoveNegative)MVN R0, #4 ; R0 = -5ORR : 逻辑或(logical OR)ORR R0, R0, #3 ; 设置R0 中位0 和1RSB : 反向减法(Reverse Subtraction)RSB R0, R1, R2 ; R0 = R2 - R1RSC : 带借位的反向减法(Reverse Subtraction with Carry)RSC{条件}{S} <dest>, <op 1>, <op 2>dest = op_2 - op_1 - !carrySBC : 带借位的减法(Subtraction with Carry)SBC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 - op_2 - !carrySUB : 减法(Subtraction)SUB R0, R1, #256 ; R0 = R1 - 256ARM 处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。
ARM v8复数乘法指令
ARM v8复数乘法指令
ARM v8复乘法指令是复数的基本运算之一,指已知两复数求它们的积的运算,乘法法则如下:两个代数形式的复数相乘,可按照多项式乘法法则进行,并把所得结果中的 i2 换成 -1,即 (a+bi)(c+ di)=(ac-bd)+(ad+bc)i。
一般说来,用复数三角形式特别是指数式作乘法较为简便。
复乘法运算满足下列运算定律:
1、(交换律)
2、(结合律)
3、(乘法对加法的分配律).
在复数的乘法中,复数 z 与实数单位 1 的乘法运算仍满足:(z 是任一复数)。
同时,对于任一非零复数 z ,都有倒数(逆元)存在,记为z-1,它们满足:
ARM v8复乘法指令充分必要条件是,即 a 与 b 不同时为零。
ARM的乘法与分支指令
ARM的乘法与分支指令实验目的●熟悉使用ADS开发环境。
●通过实验掌握ARM乘法与分支指令的使用方法。
实验设备●硬件:PC机。
●软件:ADS集成开发环境,Windows 2000/XP/2003。
实验原理ARM7TDMI具有三种乘法指令,分别为:▪32×32位乘法指令;▪32×32位乘加指令;实验内容1.调试测试下面指令,操作数寄存器自设初始值,每条语句写出功能注释。
MUL R1,R2,R3MULS R0,R3,R7MLA R1,R2,R3,R0UMULL R0,R4,R5,R6UMLALS R4,R5,R3,R8SMLALLES R8,R9,R7,R6SMULLNE R0,R1,R9,R02.修改下面错误的地方,每条语句写出功能注释。
MUL R15,R0,R3MLA R1 ,R1,R6UMULL R1,R15,R10,R2SMULLLE R0,R1,R0,R53. 假定R0、R1中的内容为带符号数,R2、R3中的内容为无符号数,写出指令实现以下判断:●若R3的内容超过R2的内容,则转去执行EXCEED。
CMP R3,R2BHI EXCEED●若R1的内容超过R0的内容,则转去执行EXCEED。
CMP R1,R0BGT EXCEED●若R2的内容等于零,则转去执行ZERO。
CMP R2,#0BEQ ZERO●若R0的内容和R1的内容相等,则转去执行EQU。
CMP R0,R1BEQ EQU4.读下面一段程序,试分析其功能。
EORS R4,R0,R1BPL KMOV R3,0B END0K MVN R0,R0MOV R3,R0END功能:判R0和R1中的数据是否同号,若是,则把R0中的数据取反并送到R3中,否则O →R3。
ARM的杂项指令实验目的●熟悉使用ADS开发环境。
●通过实验掌握ARM协处理与杂项指令的使用方法。
实验设备●硬件:PC机。
●软件:ADS集成开发环境,Windows 2000/XP/2003。
ARM无符号整数乘除法
ARM的无符号整数乘除法ARM无符号整数乘法一、实验目的掌握ARM的汇编语言程序设计方法。
二、实验原理及基本技术线路图ARM的乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。
长整形的“乘累加”要使用代表64位的一对寄存器,最终的结果放在一个目标寄存器或者一对寄存器中。
乘法指令的语法:MLA {<cond>}{S} Rd,Rm,Rs,Rn长整型乘法指令产生64位的结果。
由于结果太大,不能存放在一个32位寄存器,所以把结果存放在2个32位的寄存器RdLo和RdHi中。
RdLo存放低32位,RdHi存放高32位。
利用UMULL和SUMLL指令可以进行32位宽度的无符号或有符号的整数乘法运算,得到64位的结果。
在实际应用中,有许多需要长整型乘法运算的应用。
例如,处理C中long long整型算术运算等。
对于64位整数乘法运算可利用如下页图所示的扩展方法来实现。
其中:R0,R1分别存放被乘数的低32位和高32位;R2,R3分别存放乘数的低32位和高32位;128位结果由低到高依次存放在R4,R5,R6,R7中。
三、实验内容依据图2-1框图所示方法编制2个64位无符号整数乘法的程序。
四、所用仪器、材料PC一台EmbestIDE Education Edition for ARM五、实验方法、步骤●在Embest IDE环境中新建工程,编写程序;●编译成功后,连接下载进行调试。
六、实验过程原始记录(数据、图表、计算等)1. 实验A源程序:.global _start.text_start:MOV R8,#20 @低32位初始化为20MOV R9,#0 @高32位初始化为0MOV R0,R8,#1 @初始化计数器Loop:MOV R1,R9 @暂存高位值UMULL R8,R9,R0,R8×+图2-1:2个64位无符号整数乘法的扩展方法LHL HH H LLMlLA R9,R1,R0,R9SUBS R0,R0,#1BNE loopStop:B Stop.end七、实验结果、分析和结论(误差分析与数据处理、成果总结等。
ARM乘法指令
ARM乘法指令
ARM 乘法指令:一类为32 位的乘法指令,即乘法操作的结果为32 位;另一类为64 位的乘法指令,即乘法操作的结果为64 位。
(1)MUL 32 位乘法指令
MUL 提供32 位整数乘法。
如果操作数是有符号的,则可以假定结果也是有符号的。
(2)MLA 32 位带加法的乘法指令
MLA 的行为同MUL,但它把操作数3 的值加到结果上,这在求总和时有用。
(3)SMULL 64 位有符号数乘法指令
SMULL 指令实现两个32 位的有符号数的乘积,乘积结果的高32 位存放到一个32 位的寄存器<RdHi>中,低32 位存放到另一个32 位的寄存器(RdLo>中,同时可以根据运算结果设置CPSR 寄存器中相应的条件标志位。
考虑指令执行的效率,指令中所有操作数都放在寄存器中。
(4)SMLAL 64 位带加法的有符号数乘法指令
SMLAL 指令将两个32 位有符号数的64 位乘积结果与<RdLo>和
<RdHi>中的64 位数相加,相加结果的高32 位存放到一个32 位的寄存器
<RdHi)中,低32 位存放到另一个32 位的寄存器(RdLo>中,同时可以根据运算结果设置∷CPSR 寄存器中相应的条件标志位。
(5)UMULL 64 位无符号数乘法指令
UMULL 指令实现两个32 位有符号数的乘积,乘积结果的高32 位存放到一个32 位的寄存器<RdHi)中,乘积结果的低32 位存放到另一个32 位的寄存器(RdLo>中,同时可以根据运算结果设置CPSR 寄存器中相应的条件标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MUL 指令的格式为:
MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL 指令完成将操作数1 与操作数2 的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数或无符号数。
指令示例:
; R1 = ( R2 × R3 )的高 32 位
6、 UMLAL 指令
UMLAL 指令的格式为:
UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低 32 位同目的寄存器 Low 中的值相加后又放置到目的寄存器 Low 中,结果的高 32 位同目的寄存器 High 中的值相加后又放置到目的寄存器 High 中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的无符号数。
MLAS R0 , R1 , R2 , R3 ; R0 = R1 × R2 + R3 ,同时设置 CPSR 中的相关条件标志位
3、 SMULL 指令
SMULL 指令的格式为:
SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低 32 位放置到目的寄存器 Low中,结果的高 32 位放置到目的寄存器 High 中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数。
R1 = ( R2 × R3 )的高 32 位 + R1
对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32 位。 对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32 位。
指令示例:
UMLAL R0 , R1 , R2 , R3 ; R0 = ( R2 × R3 )的低 32 位 + R0;
。
对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32 位。
对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32位。
指令示例:
SMULL R0 , R1 , R2 , R3 ; R0 = ( R2 × R3 )的低 32 位
; R1 = ( R2 × R3 )的高 32 位
4、 SMLAL 指令
SMLAL 指令的格式为:
SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
MLA 指令完成将操作数1 与操作数2 的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数或无符号数。
指令示例:
MLA R0 , R1 , R2 , R3 ; R0 = R1 × R2 + R3
UMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低 32 位放置到目的寄存器 Low中,结果的高 32 位放置到目的寄存器 High 中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的无符号数。
指令示例:
UMULL R0 , R1 , R2 , R3 ; R0 = ( R2 × R3 )的低 32 位
乘法指令与乘加指令共有以下 6 条:
— MUL 32 位乘法指令
— MLA 32 位乘加指令
— SMULL 64 位有符号数乘法指令
— SMLAL 64 位有符号数乘加指令
— UMULL乘加指令
1、 MUL 指令
指令示例:
SMLAL R0 , R1 , R2 , R3 ; R0 = ( R2 × R3 )的低 32 位 + R0 ; R1 = ( R2 × R3 )的高 32 位 + R1
5、 UMULL 指令
UMULL 指令的格式为:
UMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
MUL R0 , R1 , R2 ; R0 = R1 × R2
MULS R0 , R1 , R2 ; R0 = R1 × R2 ,同时设置 CPSR 中的相关条件标志位
2、 MLA 指令
MLA 指令的格式为:
MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
ARM指令集-乘法指令与乘加指令
ARM 微处理器支持的乘法指令与乘加指令共有 6 条,可分为运算结果为 32 位和运算结果为 64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数 1 必须是不同的寄存器。
SMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低 32 位同目的寄存器 Low 中的值相加后又放置到目的寄存器 Low 中,结果的高 32 位同目的寄存器 High 中的值相加后又放置到目的寄存器 High 中,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数