1、ARM 应用系统开发详解 基于 S3C4510B 的系统设计 1 第 3章 ARM 微处理器的指令系统 本章介绍 ARM 指令集、 Thumb 指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解 ARM 微处理器所支持的指令集及具体的使用方法。 本章的主要内容有: ARM 指令集、 Thumb 指令集概述。 ARM 指令集的分类与具体应用。 Thumb 指令集简介及应用场合。 3.1 ARM 微处理器的指令集概述 3.1.1 ARM 微处理器的指令的分类与格式 ARM微处理器的指令集是加载 /存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对 系统
2、存储器的访问则需要通过专门的加载 /存储指令来完成。 ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器( PSR)处理指令、加载 /存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表 3-1所示(表中指令为基本 ARM指令,不包括派生的 ARM指令)。 表 3-1 ARM 指令及功能描述 助记符 指令功能描述 ADC 带进位加法指令 ADD 加法指令 AND 逻辑与指令 B 跳转指令 BIC 位清零指令 BL 带返回的跳转指令 BLX 带返回和状态切换的跳转指令 BX 带状态切换的跳转指令 CDP 协处理器数据操作指令 CMN 比较反值指令 CMP 比较指令
3、EOR 异或指令 LDC 存储器到协处理器的数据传输指令 LDM 加载多个寄存器指令 LDR 存储器到寄存器的数据传输指令 MCR 从 ARM 寄存器到协处理器寄存器的数据传输指令 MLA 乘加运算指令 MOV 数据传送指令 MRC 从协处理器寄存器到 ARM 寄存器的数据传输指令 MRS 传送 CPSR 或 SPSR 的内容到通用寄存器指令 MSR 传送通用寄存器到 CPSR 或 SPSR 的指令 MUL 32 位乘法指令 MLA 32 位乘加指令 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 2 MVN 数据取反传送指令 ORR 逻辑或指令 RSB 逆向减法指令 RSC 带
4、借位的逆向减法指令 SBC 带借位减法指令 STC 协处理器寄存器写入存储器指令 STM 批量内存字写入指令 STR 寄存器到存储器的数据传输指令 SUB 减法指令 SWI 软件中断指令 SWP 交换指令 TEQ 相等测试指令 TST 位测试指令 3.1.2 指令的条件域 当处理器工作在 ARM状态时,几乎所有的指令均根据 CPSR中条件码的状态和指令的条件域有条 件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条 ARM指令包含 4位的条件码,位于指令的最高 4位 31:28。条件码共有 16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使
5、用。例如,跳转指令 B可以加上后缀 EQ变为 BEQ表示“相等则跳转”,即当 CPSR中的 Z标志置位时发生跳转。 在 16种条件标志码中,只有 15种可以使用,如表 3-2所示,第 16种( 1111)为系统保留,暂时不能使用。 表 3-2 指令的条件码 条件码 助记符后缀 标 志 含 义 0000 EQ Z 置位 相等 0001 NE Z 清零 不相等 0010 CS C 置位 无符号数大于或等于 0011 CC C 清零 无符号数小于 0100 MI N 置位 负数 0101 PL N 清零 正数或零 0110 VS V 置位 溢出 0111 VC V 清零 未溢出 1000 HI C
6、置位 Z 清零 无符号数大于 1001 LS C 清零 Z 置位 无符号数小于或等于 1010 GE N 等于 V 带符号数大于或等于 1011 LT N 不等于 V 带符号数小于 1100 GT Z 清零且( N 等于 V) 带符号数大 于 1101 LE Z 置位或( N 不等于 V) 带符号数小于或等于 1110 AL 忽略 无条件执行 3.2 ARM 指令的寻址方式 所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前 ARM指令系统支持如下几种常见的寻址方式。 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 3 3.2.1 立即寻址 立即寻址也叫立即
7、数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令: ADD R0, R0, 1 ; R0 R0 1 ADD R0, R0, 0x3f ; R0 R0 0x3f 在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“ 0x”或“ &”。 3.2.2 寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令: ADD R0, R1, R2 ; R0 R
8、1 R2 该指令的执行效果是将寄存器 R1和 R2的内容相加,其结果存放在寄存器 R0中。 3.2.2 寄存器间接寻址 寄存器 间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令: ADD R0, R1, R2 ; R0 R1 R2 LDR R0, R1 ; R0 R1 STR R0, R1 ; R1 R0 在第一条指令中,以寄存器 R2 的值作为操作数的地址,在存储器中取得一个操作数后与 R1 相加,结果存入寄存器 R0 中。 第二条指令将以 R1 的值为地址的存储器中的数据传送到 R0 中。 第三条指令将 R0 的值传送到以 R1 的值为地址的存储器中。
9、3.2.3 基址变址寻址 基址变址寻址 就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下所示: 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 在第一条指令中,将寄存器 R1 的内容加上 4 形成 操作数的有效地址,从而取得操作数存入寄存器 R0 中。 在第二条指
10、令中,将寄存器 R1 的内容加上 4 形成操作数的有效地址,从而取得操作数存入寄存器 R0 中,然后, R1 的内容自增 4 个字节。 在第三条指令中,以寄存器 R1 的内容作为操作数的有效地址,从而取得操作数存入寄存器 R0中,然后, R1 的内容自增 4 个字节。 在第四条指令中,将寄存器 R1 的内容加上寄存器 R2 的内容形成操作数的有效地址,从而取得操作数存入寄存器 R0 中。 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 4 3.2.4 多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用 一条指令完成传送最多 16 个通用寄存
11、器的值。以下指令: LDMIA R0, R1, R2, R3, R4 ; R1 R0 ; R2 R0 4 ; R3 R0 8 ; R4 R0 12 该指令的后缀 IA 表示在每次执行完加载 /存储操作后, R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1 R4。 3.2.5 相对寻址 与基址变址寻址方式相类似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以 下程序段完成子程序的调用和返回,跳转指令 BL 采用了相对寻址方式: BL NEXT ;跳转到子程序 NEXT 处执行 NEXT MOV PC, LR ;从子程
12、序返回 3.2.6 堆栈寻址 堆栈是一种数据结构,按先进后出( First In Last Out, FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈( Full Stack),而当堆栈指针指向下一个将要放入数据的 空位置时,称为空堆栈( Empty Stack)。 同时,根据堆栈的生成方式,又可以分为递增堆栈( Ascending Stack)和递减堆栈( Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆
13、栈工作方式, ARM 微处理器支持这四种类型的堆栈工作方式,即: 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈:堆栈指针指 向下一个将要放入数据的空位置,且由低地址向高地址生成。 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。 3.3 ARM 指令集 本节对 ARM 指令集的六大类指令进行详细的描述。 3.3.1 跳转指令 跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转: 使用专门的跳转指令。 直接向程序计数器 PC 写入跳转地址值
14、。 通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之ARM 应用系统开发详解 基于 S3C4510B 的系统设计 5 前结合使用 MOV LR, PC 等类似指令,可以保 存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。 ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令: B 跳转指令 BL 带返回的跳转指令 BLX 带返回和状态切换的跳转指令 BX 带状态切换的跳转指令 1、 B 指令 B 指令的格式为: B条件 目标地址 B 指令 是最简单的 跳转指令 。一旦遇到一
15、个 B 指令, ARM 处理器将立即跳转到给定的 目标 地址,从那里继续执行。注意存储在 跳转 指令中的实际值是相对当前 PC 值的一个偏移量 , 而不是一个绝对地址 , 它的值由汇编器来计算 (参考寻址方式中的相对寻址)。 它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位 (前后 32MB 的地址空间 )。 以下指令: B Label ;程序无条件跳转到标号 Label 处执行 CMP R1, 0 ;当 CPSR 寄存器中的 Z条件码置位时,程序跳转到标号 Label 处执行 BEQ Label 2、 BL 指令 BL 指令的格式为: BL条件 目标地址
16、BL 是另一个 跳转 指令 ,但跳转 之前, 会 在寄存器 R14 中 保存 PC 的 当前 内容 ,因此, 可以 通过将 R14 的内容 重新加载 到 PC 中 , 来返回到 跳转指令 之后的那个指令 处执行。该指令 是 实现 子 程序调用 的一个基本但 常用 的 手段 。 以下指令: BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中 3、 BLX 指令 BLX 指令的格式为: BLX 目标地址 BLX 指令从 ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有 ARM 状态切换到 Thumb 状态 ,该指令同时将 P
17、C的 当前 内容 保存到 寄存器 R14 中 。因此,当子程序使用 Thumb 指令集,而调用者使用 ARM 指令集时,可以通过 BLX 指令实现子程 序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器 R14 值复制到 PC 中来完成。 4、 BX 指令 BX 指令的格式为: BX条件 目标地址 BX 指令跳转到指令中所指定的目标地址,目标地址处的指令 既可以是 ARM 指令,也可以是 Thumb指令。 3.3.2 数据处理指令 数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。 数据传送指令用于在寄存器和存储器之间进行数据的双向传输。 算术逻辑运算指令完成常用的
18、算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新 CPSR 中的相应 条件标志位。 比较指令不保存运算结果,只更新 CPSR 中相应的条件标志位。 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 6 数据处理指令包括: MOV 数据传送指令 MVN 数据取反传送指令 CMP 比较指令 CMN 反值比较指令 TST 位测试指令 TEQ 相等测试指令 ADD 加法指令 ADC 带进位加法指令 SUB 减法指令 SBC 带借位减法指令 RSB 逆向减法指令 RSC 带借位的逆向减法指令 AND 逻辑与指令 ORR 逻辑或指令 EOR 逻辑异或指令 BIC 位清除指令
19、 1、 MOV 指令 MOV 指令的格式为: MOV条件 S 目的寄存器,源操作数 MOV 指令可完成 从另一个寄存器、被移位的寄存器或 将 一个立即 数加 载到目的寄存器。 其中 S选项决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR 中条件标志位的值。 指令示例: MOV R1, R0 ;将寄存器 R0的值传送到寄存器 R1 MOV PC, R14 ;将寄存器 R14 的值传送到 PC,常用于子程序返回 MOV R1, R0, LSL 3 ;将寄存器 R0的值左移 3位后传送到 R1 2、 MVN 指令 MVN 指令的格式为: MVN条件 S 目的寄存
20、器,源操作数 MVN 指令可完成 从另一个寄存器、被移位的寄存器、或 将 一个立即 数加 载到目的寄存器。 与 MOV指令 不同之处是在传送之前 按 位被 取 反了, 即 把一个被取反的值传送到 目的 寄存器中。 其中 S 决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR 中条件标志位的值。 指令示例: MVN R0, 0 ;将立即数 0取反传送到寄存器 R0中,完成后 R0=-1 3、 CMP 指令 CMP 指令的格式为: CMP条件 操作数 1,操作数 2 CMP 指令用 于 把一个寄存器的内容 和 另一个寄存器的内容或立即 数 进行比较, 同时更新
21、CPSR 中条件标志位的值 。 该指令 进行一次减法 运算 ,但不存储结果, 只 更改 条件标志位 。标志 位 表示的是操作数 1 与操作 数 2 的关系 (大 、 小 、相等 ),例如,当 操作数 1 大于操作操作数 2,则此后的有 GT 后缀的指令将可以执行。 指令示例: CMP R1, R0 ;将寄存器 R1的值与寄存器 R0 的值相减,并根据结果设置 CPSR 的标志位 CMP R1, 100 ;将寄存器 R1的值与立即数 100 相减,并根据结果设置 CPSR 的标志位 4、 CMN 指令 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 7 CMN 指令的格式为 : C
22、MN条件 操作数 1,操作数 2 CMN 指令用于 把一个寄存器的内容 和 另一个寄存器的内容或立即 数取反后 进行比较, 同时更新CPSR 中条件标志位的值 。 该指令实际完成操作数 1 和操作数 2 相加 , 并根据 结果更改 条件标志位。 指令示例: CMN R1, R0 ;将寄存器 R1的值与寄存器 R0 的值相加,并根据结果设置 CPSR 的标志位 CMN R1, 100 ;将寄存器 R1的值与立即数 100 相加,并根据结果设置 CPSR 的标志位 5、 TST 指令 TST 指令的格式为: TST条件 操作数 1,操作数 2 TST 指令用于 把一个寄 存器的内容 和 另一个寄存
23、器的内容或立即 数进行按位的 与运算 , 并根据运算结果更新 CPSR 中条件标志位的值 。操作数 1 是要测试的数据 , 而操作数 2 是一个位掩码 ,该指令一般用 来 检测 是否设置了特定的位。 指令示例: TST R1, 1 ;用于测试在寄存器 R1 中是否设置了最低位(表示二进制数) TST R1, 0xffe ;将寄存器 R1的值与立即数 0xffe按位与,并根据结果设置 CPSR的标志位 6、 TEQ 指令 TEQ 指令的格式为: TEQ条件 操作数 1,操作数 2 TEQ 指令用于 把一个寄存器的内容 和 另一个寄存器的内容 或立即 数进行按位的 异或运算 , 并根据运算结果更新
24、 CPSR 中条件标志位的值 。 该指令通常用于比较 操作数 1 和 操作数 2 是否相等。 指令示例: TEQ R1, R2 ;将寄存器 R1的值与寄存器 R2 的值按位异或,并根据结果设置 CPSR 的标志位 7、 ADD 指令 ADD 指令的格式为: ADD条件 S 目的寄存器,操作数 1,操作数 2 ADD 指令用于 把两个操作数 相 加, 并将 结果 存放 到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。 指令示例: ADD R0, R1, R2 ; R0 = R1 + R2 ADD R0, R1, #256 ; R0
25、 = R1 + 256 ADD R0, R2, R3, LSL#1 ; R0 = R2 + (R3 1) 8、 ADC 指令 ADC 指令的格式为: ADC条件 S 目的寄存器,操作数 1,操作数 2 ADC 指令用于 把两个操作数 相 加, 再加上 CPSR 中的 C 条件标志位的值,并将 结果 存放 到目的寄存器中。它使用一个进位标志位,这样就可以做比 32 位大 的数 的加法 ,注意 不要忘记设置 S 后缀来更改进位标志。操作 数 1 应 是一个 寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数。 以下指令序列完成两个 128 位数的加法,第一个数由高到低存放在寄存器
26、 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 指令的格式为: ARM 应用系统开发详解 基于 S3C4510B 的系统设计 8 SUB条件 S 目的寄存器,操作数 1,操作数 2 SUB 指令用于 把操作数 1 减去操作数 2, 并将 结果 存放 到目的寄存器中 。 操作数 1 应 是一个寄存器,
27、操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。该指令可用于有符号数或无符号数的减法运算。 指令示例: SUB R0, R1, R2 ; R0 = R1 - R2 SUB R0, R1, #256 ; R0 = R1 - 256 SUB R0, R2, R3, LSL#1 ; R0 = R2 - (R3 1) 10、 SBC 指令 SBC 指令的格式为: SBC条件 S 目的寄存器,操作数 1,操作数 2 SBC 指令用于 把操作数 1 减去操作数 2, 再减去 CPSR 中的 C 条件标志位的反码, 并将 结果 存放 到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数
28、2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。该指令 使用进位标志来表示借位,这样就可以做大于 32 位的减法 , 注意 不要忘记设置 S后缀来更改进位标志。 该指令可用于有符号数或无符号数的减法运算。 指令示例: SUBS R0, R1, R2 ; R0 = R1 - R2 - ! C,并根据结果设置 CPSR 的进位标志位 11、 RSB 指令 RSB 指令的格式为: RSB条件 S 目的寄存器,操作数 1,操作数 2 RSB 指令称为逆向减法指令,用于 把操作数 2 减去操作数 1, 并将 结果 存放 到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数 2 可以是一个寄存
29、器,被移位的寄存器,或一个立即 数 。该指令可用于有符号数或无符号数的减法运算。 指令示例: RSB R0, R1, R2 ; R0 = R2 R1 RSB R0, R1, #256 ; R0 = 256 R1 RSB R0, R2, R3, LSL#1 ; R0 = (R3 1) - R2 12、 RSC 指令 RSC 指令的格式为: RSC条件 S 目的寄存器,操作数 1,操作数 2 RSC 指令用于 把操作数 2 减去操作数 1, 再减去 CPSR 中的 C 条件标志位的反码, 并将 结果 存放 到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存
30、器,或一个立即 数 。该指令 使用进位标志来表示借位,这样就可以做大于 32 位的减法 , 注意 不要忘记设置 S后缀来更改进位标志。 该指 令可用于有符号数或无符号数的减法运算。 指令示例: RSC R0, R1, R2 ; R0 = R2 R1 - ! C 13、 AND 指令 AND 指令的格式为: AND条件 S 目的寄存器,操作数 1,操作数 2 AND 指令用于 在两个操作数上进行逻辑与 运算 , 并 把结果放置到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。该指令常用于 屏蔽 操作数 1 的某些位 。 指令示例:
31、AND R0, R0, 3 ; 该指令保持 R0 的 0、 1位, 其余位清零。 14、 ORR 指令 ORR 指令的格式为: ORR条件 S 目的寄存器,操作数 1,操作数 2 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 9 ORR 指令用于 在两个操作数上进行逻辑 或运算 , 并 把结果放置到目的寄存器中 。 操作数 1应 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。该指令常用于设置 操作数 1 的某些位 。 指令示例: ORR R0, R0, 3 ; 该指令设置 R0 的 0、 1位,其余位保持不变。 15、 EOR 指令 EOR 指令
32、的格式为: EOR条件 S 目的寄存器,操作数 1,操作数 2 EOR 指令用于 在两个操作数上进行逻辑 异或运算 , 并 把结果放置到目的寄存器中 。 操作数 1 应 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即 数 。该指令常用于反转 操作数 1 的某些位 。 指令示例: EOR R0, R0, 3 ; 该指令反转 R0 的 0、 1位,其余位保持不变。 16、 BIC 指令 BIC 指令的格式为: BIC条件 S 目的寄存器,操作数 1,操作数 2 BIC 指令用于清除 操作数 1 的某些位 , 并 把结果放置到目的寄存器中 。 操作数 1 应 是一个寄存器,操
33、作数 2 可以是一个寄存器,被移位的寄存器,或一 个立即 数 。 操作数 2 为 32 位的掩码, 如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。 指令示例: BIC R0, R0, 1011 ; 该指令清除 R0 中的位 0、 1、和 3,其余的位保持不变。 3.3.3 乘法指令与乘加指令 ARM 微处理器支持的乘法指令与乘加指令共有 6 条,可分为运算结果为 32 位和运算结果为 64位两类,与前面的数据处理指令不同,指令中的所 有操作数、目的寄存器必须为 通用 寄存器 , 不能对操作数使用立即 数 或被移位的寄存器 ,同时, 目的寄存器和操作数 1 必须是不同的寄 存器
34、 。 乘法指令与乘加指令共有以下 6 条: MUL 32 位乘法指令 MLA 32 位乘加指令 SMULL 64 位有符号数乘法指令 SMLAL 64 位有符号数乘加指令 UMULL 64 位无符号数乘法指令 UMLAL 64 位无符号数乘加指令 1、 MUL 指令 MUL 指令的格式为: MUL条件 S 目的寄存器,操作数 1,操作数 2 MUL 指令完成将操作数 1 与操作数 2 的乘法运算, 并 把结果放置到目的寄存器中 ,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数或无符号 数。 指令示例: MUL R0, R1, R
35、2 ; R0 = R1 R2 MULS R0, R1, R2 ; R0 = R1 R2,同时设置 CPSR 中的相关条件标志位 2、 MLA 指令 MLA 指令的格式为: MLA条件 S 目的寄存器,操作数 1,操作数 2,操作数 3 ARM 应用系统开发详解 基于 S3C4510B 的系统设计 10 MLA 指令完成将操作数 1 与操作数 2 的乘法运算,再将乘积加上操作数 3, 并 把结果放置到目的寄存器中 ,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的有符号数或无符号数。 指令示例: MLA R0, R1, R2, R3 ; R
36、0 = R1 R2 + R3 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 位的有符号 数。 指令示例: SMU
37、LL R0, R1, R2, R3 ; R0 = ( R2 R3)的低 32 位 ; R1 = ( R2 R3)的高 32 位 4、 SMLAL 指令 SMLAL 指令的格式为: SMLAL条件 S 目的寄存器 Low,目的寄存器低 High,操作数 1,操作数 2 SMLAL 指令完成将操作数 1 与操作数 2 的乘法运算, 并 把结果 的低 32 位同 目的寄存器 Low 中的值相加后又 放置到目的寄存器 Low 中 , 结果 的高 32 位同 目的寄存器 High 中的值相加后又 放置到目的寄存器 High 中 ,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1
38、和操作数 2 均为 32 位的有符号数。 对于目的寄存器 Low,在指令执行前存放 64 位加数的低 32 位,指令执行后存放结果的低 32 位。 对于目的寄存器 High,在指令执行前存放 64 位加数的高 32 位,指令执行后存放结果的高 32位。 指令示例: SMLAL R0, R1, R2, R3 ; R0 = ( R2 R3)的低 32 位 R0 ; R1 = ( R2 R3)的高 32 位 R1 5、 UMULL 指令 UMULL 指令的格式为: UMULL条件 S 目的寄存器 Low, 目的寄存器低 High,操作数 1,操作数 2 UMULL 指令完成将操作数 1 与操作数 2
39、 的乘法运算, 并 把结果 的低 32 位 放置到目的寄存器 Low中 , 结果 的高 32 位 放置到目的寄存器 High 中 ,同时可以根据运算结果设置 CPSR 中相应的条件标志位。其中,操作数 1 和操作数 2 均为 32 位的无符号数。 指令示例: UMULL R0, R1, R2, R3 ; R0 = ( R2 R3)的低 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 位的无符号数。 对于目的寄存器 Low,在指令执行前存放 64 位加数的低 32 位,指令执行后存放结果的低 32 位。 对于目的寄存器 High,在指令执行前存放 64 位加数的高 32 位,指令执行后存放 结果的高 32位。