文章目录

ARM指令集

1、ARM指令集格式

2、ARM指令集的特点

ARM汇编指令

1、ARM汇编指令的格式

2、ARM汇编指令用法

ARM指令集分为的五大类


ARM指令集

1、ARM指令集格式

ARM指令集(ARM920T的核(core)的指令集)的格式如下图所示,可以看出,无论哪一种指令,长度都是32位,属于典型的精简指令集(RISC)。

arm最新指令集架构 arm 指令集_指令集

2、ARM指令集的特点

(1)大多数指令可带条件码(Cond)执行;

(2)大多数指令带后缀的(S)码,即指令结果会影响标志位,有的指令带链接(L)执行;

(3)大多数指令在单个周期内可执行完成。访问存储单元使用Load-store规范的方式。带条件码(Cond)的32位ARM指令的格式如图1-9所示。

ARM汇编指令

1、ARM汇编指令的格式

<opcode> {<cond>}  {S} <Rd>,<Rn> {,<operand2>}

其中,{ }表示可选项,

opcode:操作码,

cond:条件码,

S:影响 CPSR 程序状态寄存器,

Rd:目标寄存器,

Rn:第一寄存器作为第一个操作数,

operand2:第二个操作数。


arm最新指令集架构 arm 指令集_arm最新指令集架构_02

cond 条件码

0000 = EQ-Z=1     (相等)
0001 = NE-Z=0     (不相等)

0010 =HS/CS-C=1   (无符号数大于或等于)
0011 =L0/CC-C=l   (无符号数小于)

0100 = MI-N=1     (负数)
0101 =PL-N=0      (正数或零)

0110 =VS-V=1      (溢出)
0111 = VC-V=0     (不)溢出

1000 =HI-C=1且Z=0 (无符号数大于)
1001 =LS-C=0或Z=1 (无符号数小于或等于)

1010 =GE-N=V      (有符号数大于或等于)
1011 =LT-N!=V     (有符号数小于)
1100 =GT-Z=0且N=V (有符号数大于)
1101 =LE-Z=1或N!=V (有符号数小于或等于)

1110 =AL     无条件执行

1111 =N      保留

2、ARM汇编指令用法

下面通过简单的例子说明ARM汇编指令用法:

ADDEQ RO,R1,R2;   //If zero flag is set,then RO=R1+R2

ADDS RO,R1,R2;     //RO=R1+R2,并影响标志位.

ADDEQS RO,R1,R2;       //如果CPSR的Z=1(即结果为0),则RO=R1+R2,并影响CPSR标志位.

ARM指令集分为的五大类

ARM汇编指令集可分为以下五大类:

  • (1)分支指令
  • (2)数据处理指令
  • (3)加载/存储指令
  • (4)协处理器指令
  • (5)其他指令

最典型的例子简述。

1、分支指令

不带链接的分支指令:

B Label;

带链接的分支指令:

BL Label; //LR=PC+4, 记住返回地址

2、数据处理指令

主要是算数运算,包括比较指令、逻辑运算和数据传输指令。

这些指令在reg里运行而不是在memory。它们一般都具有一个或两个操作数,第一个操作数总是一个寄存器Rn,而第二个操作数通过移位器送给 ALU。

3、加载/存储指令

ARM 的指令集属于RISC,对存储单元的访问采用了规范的加载(Load)/存储 (Store)方式。

比较重要的 Load/Store 命令有:

STMFD SP!,{R0-R12,LR,PC};   //将 R0-R12、LR、 PC 的内容存到 SP 指向的存储空间中去(压入堆栈)。
LDMFD SP!,{R0-R12,PC};     //将 SP 指向的存 储空间的内容放入 ARM 中的 R0-R12、PC 中去(弹出堆栈)。

这两个命令在函数调用中非常有用,在 C 语言中调用一个函数生成的 ARM 汇编通常如下图所示:


arm最新指令集架构 arm 指令集_指令集_03

在 C 语言中调用一个函数生成的 ARM 汇编

 

 

  

  • 对于上面的指令集,到底怎么理解?
  • ARM架构的指令集与常见的另一种x86架构的指令集有何不同?

↓↓可以看下面的这个视频作为参考↓↓


ARM架构和CPU的x86架构有啥区别?指令集又是什么?