指令集汇总

  • 关于指令集
  • ARM指令集
  • Thumb指令集
  • 简单的指令集操作


关于指令集

指令集是汇编的基础,是芯片的架构,不懂指令集看着汇编就只能干瞪眼了,所以把ARM指令集全都记录下来做个笔记。

可能会和WIN32的指令集有出入,比如WIN32中MOV可以把数据从内存中加载到寄存器中去,但在ARM的RISC结构中,MOV只能将数据从寄存器移动到寄存器,WIM32的看小甲鱼的视频。说白了X86是复杂指令集(CISC),ARM是精简指令集(RISC)。
复杂指令集是将很多操作集成起来,精简是可以很细节的去处理。

ARM指令集

ARM指令是32位的,而Thumb指令时16位的。
如果在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb指令时,代码密度高。

助记符

操作

MOV

移动

ADD


SUB


RSB

反减

CMP

比较

TST

测试

AND

逻辑与

EOR

逻辑或

LSL

逻辑左移

ASR

算术右移

MUL

有符号长乘

SMUL


SMLAL

有符号长累乘

MSR

移入状态寄存器

B

分支

BX

分支与交换

LDR

载入字

LDRH

载入半字

LDRB

载入字节

LDRSH

载入有符号半字

LDRSB

载入有符号字节

LDM

载入乘

LDRBT

转化载入寄存器字节

LDRT

转化载入寄存器

MCR

移入协处理器

LDC

协处理器数据处理

MVN

移非

ADC

带进位加

SBC

带进位减

RSC

带进位反减

CMN

比较取反

TEQ

测试等价

BIC

位清零

ORR

逻辑 ( 包括 ) 或

MLA

累乘

UMULL

无符号长乘

UMLAL

无符号长累乘

MRS

由状态寄存器移出

BL

分支与链接

SWI

软件中断

STR

恢复字

STRH

恢复半字

STRB

恢复字节

STRBT

转化保存寄存器字节

STRT

转化保存寄存器

STM

多路保存

SWPB

交换字节

MRC

由协处理器移出

STC

由协处理器保存

Thumb指令集

PS:和C不同,在汇编中可不区分大小写。

助记符

操作

MOV

移动

ADD


SUB


CMP

比较

TST

测试

AND

逻辑与

EOR

逻辑或

LSL

逻辑左移

ASR

算术右移

MUL


B

分支

BX

分支与交换

LDR

载入字

LDRH

载入半字

LDRB

载入字节

LDRSH

载入有符号半字

LDMIA

载入乘

PUSH

将寄存器推入堆栈

MVN

移非

ADC

带进位加

SBC

带进位减

CMN

比较取反

NEG

去反

BIC

位清零

ORR

逻辑 ( 包括 ) 或

LSR

逻辑右移

ROR

右转

BL

分支与链接

SWI

软件中断

STR

保存字

STRH

保存半字

STRB

保存字节

LDRSB

载入有符号字节

STMIA

多路保存

PUSH 将寄存器推入堆栈 POP

将寄存器推出堆栈

Thumb不是完整的指令集
Thumb是ARM 指令集的一个子集
Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度【1】的问题而提出的,它具有16为的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。

在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。

Thumb 指令集分为:

  • 分支指令
  • 数据处理指令
  • 载入与保存指令
  • 批量载入与保存指令
  • 异常产生指令

Thumb模式下,R0~R7八个通用功能寄存器有效。与执行ARM指令时的R0~R7相同。 某些 Thumb 指令还访问程序计数器 (ARM 寄存器 15)、链接寄存器 (ARM 寄存器 14) 及
堆栈指针 (ARM 寄存器 13)。其他指令对 ARM 寄存器 8 ~ 15 的访问有所限制。

简单的指令集操作

mov ax,18		; 将18送入AX	ax=18
mov ah,78		;将78送入AH		ah=78
add ax,8		;将寄存器AX中的数值加上8	ax+=8
LDR R0,0x1234	;将0x1234这个地址存放到R0中

初学汇编,内容仅为笔记和参考。