博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM 汇编指令学习:[2]ARM指令集
阅读量:4193 次
发布时间:2019-05-26

本文共 6388 字,大约阅读时间需要 21 分钟。

ARM 汇编指令学习:[2]ARM指令集


一、跳转指令

1、 B(跳转指令)及BL(带返回跳转指令)

B{L}{
}

其中:

L 决定是否保存当前PC寄存器地址到LR寄存器中。

<target_address> 为指令跳转的目标地址。这个地址的计算方法是:将指令中的24位带符号的补码立即数扩展为32位(扩展其符号位);将此32位数左移两位;将得到的值加到PC寄存器中,即得到跳转的目标地址。由这种计算方法可知跳转的范围大致为-32MB~+32MB。


2、 第一种BLX(带返回和状态切换的跳转指令)

BLX 

其中,<target_address>的用法与B及BL指令中的用法相同。


3、 第二种BLX(带返回和状态切换的跳转指令)

BLX{
}

其中:

<Rm> 该寄存器中为跳转的目标地址。当<Rm>寄存器的bit[0]值为0时,目标地址处的指令为ARM指令;当<Rm>寄存器的bit[0]值为1时,目标地址处的指令为Thumb指令。当<Rm>寄存器为R15(PC)时,会产生不可预知的结果(跑飞)。


4、 BX(带状态切换的跳转指令)

BX{
}

其中,<Rm>的用法与BLX指令中的用法相同。


二、数据处理指令

1、 MOV 数据传送指令

MOV{
}{S}
,

MOV指令将<shifter_operand>表示的数据传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。


2、 MVN 数据求反传送指令

MVN{
}{S}
,

MVN指令将<shifter_operand>表示的数据的反码传送到目标寄存器<Rd>中,并根据操作的结果更新CPSR中相应的条件标志位。


3、 CMP 比较指令

CMP{
}
,

CMP指令从寄存器<Rn>中减去<shifter_operand>表示的数据,并根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。


4、 CMN 基于相反数的比较指令

CMN{
}
,

CMN指令从寄存器<Rn>中加上<shifter_operand>表示的数据,并根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。


5、 TST 位测试指令

TST{
}
,

TST指令将<shifter_operand>表示的数据与寄存器<Rn>的值按位作逻辑与操作,并根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。


6、 TEQ 相等测试指令

TEQ{
}
,

TEQ指令将<shifter_operand>表示的数据与寄存器<Rn>的值按位作逻辑异或操作,并根据操作的结果更新CPSR中相应的条件标志位,后面的指令就可以根据CPSR中相应的条件标志位来判断是否执行。


7、 ADD 加法指令

ADD{
}{S}
,
,

ADD指令将<shifter_operand>表示的数据的与<Rn>的值相加,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


8、 SUB 减法指令

SUB{
}{S}
,
,

SUB指令从寄存器<Rn>中减去<shifter_operand>表示的数据,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


9、 RSB 逆向减法指令

RSB{
 }{S}
,
,

RSB指令从<shifter_operand>表示的数据中减去寄存器<Rn>的值,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


10、 ADC 带位加法指令

ADC{
}{S}
,
,

ADC指令将<shifter_operand>表示的数据的与<Rn>的值相加,再加上寄存器CPSR中的C条件标志位的值,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


11、 SBC 带位减法指令

SBC{
}{S}
,
,

SBC指令从寄存器<Rn>中减去<shifter_operand>表示的数据,再减去寄存器CPSR中的C条件标志位的反码,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


12、 RSC 带位逆向减法指令

RSC{
}{S}
,
,

RSC指令从<shifter_operand>表示的数据中减去寄存器<Rn>的值,再减去寄存器CPSR中的C条件标志位的反码,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


13、 AND 逻辑与操作指令

AND{
}{S}
,
,

AND指令将<shifter_operand>表示的数据与寄存器<Rn>的值按位作逻辑与操作,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


14、 BIC 位清除指令

BIC{
}{S}
,
,

BIC指令将<shifter_operand>表示的数据与寄存器<Rn>的反码按位作逻辑与操作,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


15、 EOR 逻辑异或操作指令

EOR{
}{S}
,
,

EOR指令将<shifter_operand>表示的数据与寄存器<Rn>的值按位作逻辑异或操作,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


16、 ORR 逻辑或操作指令

ORR{
}{S}
,
,

ORR指令将<shifter_operand>表示的数据与寄存器<Rn>的值按位作逻辑或操作,并把结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR中相应的条件标志位。


17、 乘法指令

  • MUL 32位乘法指令
MUL{
}{S}
,
,

示例

MUL R0, R1, R2 ;  R0=R1*R2

  • MLA 32位带加数的乘法指令
MLA{
}{S}
,
,
,

示例

MLA R0, R1, R2, R3 ;  R0=R1*R2+R3

  • SMULL 64位有符号数乘法指令
SMULL{
}{S}
,
,
,

示例

SMULL R1, R2, R3, R4 ;  R1=R3*R4的低32位;R2=R3*R4的高32位

  • SMLAL 64位带加数的有符号数乘法指令
SMLAL{
}{S}
,
,
,

示例

SMLAL R1, R2, R3, R4 ;  R1=R3*R4的低32位+R1;R2=R3*R4的高32位+R2

  • UMULL 64位无符号数乘法指令
UMULL{
}{S}
,
,
,

  • UMLAL 64位带加数的无符号数乘法指令
UMLAL{
}{S}
,
,
,

18、 杂类的算术指令

  • CLZ 前导0个数计数指令
CLZ{
}
,

CLZ指令用于计算寄存器中操作数最高端的0的个数。如果操作数的bit[31]为1,则指令返回0;如果操作数为0,则指令返回32。


三、程序状态寄存器(PSR)传输指令

1、 MRS 状态寄存器到通用寄存器的传送指令

MRS{
}
, CPSR MRS{
}
, SPSR

2、 MSR 通用寄存器到状态寄存器的传送指令

MSR{
} CPSR_
, #
MSR{
} CPSR_
,
MSR{
} SPSR_
, #
MSR{
} SPSR_
,

四、Load/Store指令

  • LDR
  • LDRB
  • LDRBT
  • LDRH
  • LDRSB
  • LDRSH
  • LDRT
  • STR
  • STRB
  • STRBT
  • STRH
  • STRSB
  • STRSH
  • STRT
  • ……

详见我的上一篇文章。


信号量操作指令

  • SWP 交换指令
SWP{
}
,
, [
]

示例

SWP R1, R2, [R3] ;  将内存单元(R3)中的字数据读取到R1寄存器中,同时将R2寄存器的数据写入到内存单元(R3)中

  • SWPB 字节交换指令
SWPB{
}
,
, [
]

示例

SWPB R1, R2, [R3] ;  将内存单元(R3)中的字节数据读取到R1寄存器中,R1的高24位为0,同时将R2寄存器的低8位写入到内存单元(R3)中

五、协处理器指令

1、 CDP 协处理器数据操作指令

CDP{
}
,
,
,
,
,
CDP2
,
,
,
,
,

本指令是ARM处理器用于通知ARM协处理器执行特定的操作。该操作不涉及ARM寄存器和内存单元。

示例

CPD p5, 2, c12, c10, c3, 4 ;  协处理器p5的操作初始化。其中,操作码1为2,操作码2为4,目标寄存器为c12,源操作寄存器为c10和c3

2、 LDC 协处理器数据读取指令

LDC{
}{L}
,
,
LDC2{L}
,
,

LDC指令从一系列连续的内存单元将数据读取到协处理器的寄存器中。

示例

LDC p6, CR4, [R2, #4] ;  R2为ARM处理器,指令读取内存单元(R2+4)的字数据,传送到协处理器p6的CR4寄存器中

3、 STC 协处理器数据写入指令

STC{
}{L}
,
,
STC2{L}
,
,

STC指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中。

示例

STC p6, CR4, [R2, #4] ;  R2为ARM处理器,指令将协处理器p6的CR4寄存器中的字数据写入到内存单元(R2+4)中

4、 MCR ARM寄存器到协处理器寄存器的数据传送指令

MCR{
}
,
,
,
,
{,
} MCR2
,
,
,
,
{,
}

MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。

示例

MCR p14, 3, R7, c7, c11, 6 ;  指令将ARM寄存器中将数据传送到协处理器p14的寄存器中,其中R7为ARM处理器,存放源操作数;C7和C11为协处理器寄存器,为目标寄存器;操作码1为3,操作码2为6

5、 MRC 协处理器寄存器到ARM寄存器的数据传送指令

MRC{
}
,
,
,
,
{,
} MRC2
,
,
,
,
{,
}

MRC指令将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。

示例

MRC p14, 3, R7, c7, c11, 6 ;  指令将协处理器p14的寄存器中将数据传送到ARM寄存器中,其中R7为ARM处理器,为目标寄存器;C7和C11为协处理器寄存器,存放源操作数;操作码1为3,操作码2为6

六、异常中断产生指令

1、 SWI 软中断指令

SWI{
}

SWI指令用于产生软中断。


2、 BKPT 断点中断指令

BKPT 

BKPT指令用于产生软件断点中断。软件调试程序可以使用该中断。当系统使用硬件调试部件时可以忽略该中断。


参考自《ARM体系架构与编程》杜春雷


  • 我的个人主页:
  • 我的个人站点博客:
  • 我的CSDN博客:
  • 我的简书:
  • 我的GitHub:
    欢迎相互follow~

转载地址:http://unloi.baihongyu.com/

你可能感兴趣的文章
华为P50造型没跑了,后摄造型有点吓人!
查看>>
杨笠代言电脑遭投诉抵制,网友吵翻!英特尔回应了...
查看>>
苹果因不附赠充电头被罚200万美元,网友:该,大快人心!
查看>>
饿了么回应7道菜仅1道正品事件:先行赔付 停止骑手配送资格
查看>>
京东大数据研究院:智能马桶四年销量翻10倍
查看>>
张大奕网店关联公司被行政处罚:因以不合格产品冒充合格产品
查看>>
“有些重要的事要告诉你” !小米春季新品发布会定档3月29日
查看>>
李亚鹏要跪下?
查看>>
新浪完成私有化合并 从纳斯达克摘牌退市
查看>>
刚公布完价格就被骂?这款新机有点惨...
查看>>
李彦宏:百度回家了
查看>>
不会延期!iPhone 12S预计如期在9月发售:升级三星LTPO屏幕
查看>>
何小鹏:创业初期每月都去借钱 网易丁磊借了80万
查看>>
北漂眼泪滴落的速度,赶不上燕郊房价下跌的速度
查看>>
1.1万亿!华为第一!
查看>>
腾讯音乐2020全年财报惊艳:在线音乐付费用户达5600万,描绘中国数字音乐行业新蓝图...
查看>>
史上最贵!iPhone 12S系列9月亮相,全系标配激光雷达
查看>>
又增长了,微信及WeChat月活达12.25亿 !
查看>>
金山办公:因个人原因 葛珂辞去公司董事长职务
查看>>
哈苏相机加持!一加9 Pro海外抢先发布:采用120Hz LTPO屏幕
查看>>