ARM微处理器的指令集概述二——ARM应用系统开发详解笔记
的寄存器,操作数 1,操作数 2
SUB指令用于把操作数 1 减去操作数 2,并将结果存放到目的寄存器中。
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 < 1)
SBC 指令
SBC{条件}{S} 目的寄存器,操作数 1,操作数 2
SBC指令用于把操作数 1 减去操作数 2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设置 CPSR 的进位标志位
RSB 指令
RSB{条件}{S} 目的寄存器,操作数 1,操作数 2
RSB指令称为逆向减法指令,用于把操作数 2 减去操作数 1,并将结果存放到目的寄存器中。
RSB R0,R2,R3,LSL#1 ; R0 = (R3 < 1) - R2
RSC 指令
RSC{条件}{S} 目的寄存器,操作数 1,操作数 2
RSC指令用于把操作数 2 减去操作数 1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
AND 指令
AND{条件}{S} 目的寄存器,操作数 1,操作数 2
AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。该指令常用于屏蔽操作数 1 的某些位。
AND R0,R0,#3 ; 该指令保持 R0 的 0、1 位,其余位清零。
ORR 指令
ORR{条件}{S} 目的寄存器,操作数 1,操作数 2
该指令常用于设置操作数 1 的某些位。
EOR 指令
EOR{条件}{S} 目的寄存器,操作数 1,操作数 2
该指令常用于反转操作数 1 的某些位。
三 乘法指令与乘加指令
乘法指令与乘加指令共有以下 6 条:
— MUL 32 位乘法指令
— MLA 32 位乘加指令
— SMULL 64 位有符号数乘法指令
— SMLAL 64 位有符号数乘加指令
— UMULL 64 位无符号数乘法指令
— UMLAL 64 位无符号数乘加指令
MULS R0,R1,R2 ;R0 = R1 × R2,同时设置 CPSR 中的相关条件标志位
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同时设置 CPSR 中的相关条件标志位
SMLAL R0,R1,R2,R3;R0 = (R2 × R3)的低 32 位 + R0
;R1 = (R2 × R3)的高 32 位 + R1
;其中,操作数 1(R2) 和操作数 2(R3) 均为 32 位的有符号数。
四 程序状态寄存器访问指令
— MRS 程序状态寄存器到通用寄存器的数据传送指令
— MSR 通用寄存器到程序状态寄存器的数据传送指令
MRS 指令
MRS{条件}通用寄存器,程序状态寄存器(CPSR 或 SPSR) MRS R0,CPSR ;传送 CPSR 的内容到 R0
MRS R0,SPSR ;传送 SPSR 的内容到 R0
MSR 指令
MSR{条件} 程序状态寄存器(CPSR 或 SPSR)_<域>,操作数
MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为 4 个域:
位[31:24]为条件标志位域,用 f 表示;
位[23:16]为状态位域,用 s 表示;
位[15:8]为扩展位域,用 x 表示;
位[7:0]为控制位域,用 c 表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在 MSR 指令中指明将要操作的域。
MSR CPSR_c,R0 ;传送 R0 的内容到 SPSR,但仅仅修改 CPSR 中的控制位域
五 加载/存储指令
LDR指令LDR{条件} 目的寄存器,<存储器地址>
LDR R0,[R1,R2] ;将存储器地址为 R1+R2 的字数据读入寄存器 R0。
LDR R0,[R1,#8] ;将存储器地址为 R1+8 的字数据读入寄存器 R0。
LDR R0,[R1,R2] ! ;将存储器地址为 R1+R2 的字数据读入寄存器 R0,并将新地址 R1+R2 写入 R1。
LDRR0,[R1,#8] ! ;将存储器地址为 R1+8 的字数据读入寄存器 R0,并将新地址 R1+8 写入 R1。
LDRR0,[R1],R2 ;将存储器地址为 R1 的字数据读入寄存器 R0,并将新地址 R1+R2 写入 R1。
LDRR0,[R1,R2,LSL#2]! ;将存储器地址为 R1+R2×4 的字数据读入寄存器 R0,并将新地址 R1+R2×4 写入 R1。
LDRR0,[R1],R2,LSL#2 ;将存储器地址为 R1 的字数据读入寄存器 R0,并将新地址 R1+R2×4 写入 R1。
带!号的指令和[]外有寄存器的指令,都要将新地址写入R1
六 批量数据加载/存储指令
LDM(或 STM)指令LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{ }
LDM(或 STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多
个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}
为以下几种情况:
*IA 每次传送后地址加 1;
*IB 每次传送前地址加 1;
*DA 每次传送后地址减 1;
*DB 每次传送前地址减 1;
*FD 满递减堆栈;
*ED 空递减堆栈;
*FA 满递增堆栈;
*EA 空递增堆栈;
* {!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。
*基址寄存器不允许为 R15,寄存器列表可以为 R0~R15 的任意组合。
*{∧ }为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
ARM微处理器指令 相关文章:
- ARM应用系统开发详解:第3章 ARM微处理器的指令系统(11-20)
- ARM微处理器的指令集概述四——MOV和LDR的区别(11-20)
- ARM微处理器的指令集概述一——ARM应用系统开发详解笔记(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)