指令集简述

​ "处理器只能执行由01组成的二进制序列".这句话相信已经在大家的脑海中回荡了数十年,那到底什么是处理器?所谓的二进制序列到底是什么?

​ 这个问题想必很多朋友都有考虑过,但是始终不得解.甚至是对指令集,汇编也只是模模糊糊的知道有这个东西.在这一切都开始前首先明确一个简单的逻辑知识点:逻辑门电路是最基本的运算单元.逻辑门电路可以实现简单的算术运算,而驱动逻辑门电路的却是所谓的电,在抽象一点就是"正负电信号".而这个里的"正负电信号"就是所谓的二进制序列.

​ 那么至此所谓的"二进制序列"就已经解释清楚了.但是二进制序列的组合方式无穷无尽,这就诞生了所谓的汇编.汇编可以理解为 按照 二进制序列的功能 对其进行命名,这样就可以在 英文单词 与 二进制序列 之间 搭起一个桥梁.

​ 最基本的加法运算在逻辑门电路中有数不清的实现方式,以此类推同样的功能在不同的厂商手中有不同的实现方式.经过多年发展不同的厂商都发展出了各自特定的实现方式,这就是所谓的指令集.可以认为每个处理器都有自己独特的指令集,一般情况下新的处理器兼容旧处理器的指令集.

​ 在嵌入式领域使用最多的就是 arm以及mips架构的处理器,本章接下去会对这两个汇编指令集做一些比较基本的介绍,方便大家在学习后面的章节时翻回来查阅

寄存器

名称作用备注
R0(a1)通用寄存器一般用于保存参数
R1(a2)通用寄存器一般用于保存参数
R2(a3)通用寄存器一般用于保存参数
R3(a4)通用寄存器一般用于保存参数
R4(v1)通用寄存器一般用于保存局部变量
R5(v2)通用寄存器一般用于保存局部变量
R6(v3)通用寄存器一般用于保存局部变量
R7(v4)通用寄存器一般用于保存局部变量
R8(v5)通用寄存器一般用于保存局部变量
R9(SB,V6)通用寄存器一般情况下约定:静态基址寄存器(内存寻址的基地址)
R10(SL,V7)通用寄存器一般情况下约定:数据栈限制指针(限制栈大小)
R11(FP,V8)通用寄存器一般情况下约定:栈底
R12(IP)通用寄存器一般情况下约定:内部程序调用暂存寄存器(变参,临时变量...)
R13(SP)堆栈指针栈顶
R14(LR)连接寄存器保存返回地址
R15(PC)程序计数器指向下一条要读取指令的地址
R16(CPSR)状态寄存器表示当前处理器的状态
R17(SPSR)状态保存寄存器异常处理中,备份 CPSR

数据传输指令

名称作用备注
mov r1, #0x1数据传送r1 = 0x1
LDR读取数据将指定地址上的字数据读入Rd
STR数据保存将Rd中的字数据存入指定地址
LDM批量加载内存中的寄存器
STM批量保存寄存器到内存中

跳转指令

助记符说明操作条件码位置
B label分支指令PC←labelB{cond}
BL label带链接的分支指令LR←(返回地址)-,PC←labelBL{cond}
BX Rm带状态切换的分支指令PC←Rm,切换处理器状态BX{cond}
BLX Rm/lable结合BX BL的功能结合BX BLBLX{cond}

乘法指令

mips的运算指令和常规的x86区别不大,这里主要介绍以下乘法指令:

助记符说明操作条件码位置
MUL Rd,Rm,Rs32位乘法指令Rd←Rm*Rs (Rd≠Rm)MUL{cond}{S}
MLA Rd,Rm,Rs,Rn32位乘加指令Rd←Rm*Rs+Rn (Rd≠Rm)MLA{cond}{S}
UMULL RdLo,RdHi,Rm,Rs64位无符号乘法指令(RdLo,RdHi) ←Rm*RsUMULL{cond}{S}
UMLAL RdLo,RdHi,Rm,Rs64位无符号乘加指令(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)UMLAL{cond}{S}
SMULL RdLo,RdHi,Rm,Rs64位有符号乘法指令(RdLo,RdHi) ←Rm*RsSMULL{cond}{S}
SMLAL RdLo,RdHi,Rm,Rs64位有符号乘加指令(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)SMLAL{cond}{S}

比较指令

助记符说明操作条件码位置
CMP Rn, operand2比较指令标志N、Z、C、V←Rn-operand2CMP{cond}
CMN Rn, operand2负数比较指令标志N、Z、C、V←Rn+operand2CMN{cond}
TST Rn, operand2位测试指令标志N、Z、C、V←Rn & operand2TST{cond}
TEQ Rn, operand2相等测试指令标志N、Z、C、V←Rn ^ operand2TEQ{cond}

条件执行

arm所有的指令可以实现条件执行,只要在目标指令后面跟上对应的条件描述就行:

标志含义
EQ相等
NEQ不相等
CS/HS无符号数 大于等于
CC/LO无符号数 小于
MI负数
PL正数或0
VS溢出
VC没有溢出
HI无符号数大于
LS无符号数 小于等于
GE有符号数 大于等于
LT有符号数 小于
GT有符号数 大于
LE有符号数 小于等于
AL无条件执行
NV永远不执行

其他注意事项:

在arm中的数据存储单位和传统的x86有些许的不一样:

  • 存储单位 表示 4个字节,数据存储指令 默认大小
  • 存储单位 半个字 表示 2个字节,数据存储指令特征的特征字符为 H
  • 存储单位 字节 表示 1个字节,数据存储指令特征的特征字符为 B
  • 数据存储指令特征的特征字符为 S 表示有符号数据处理
Last modification:January 21, 2021
如果觉得我的文章对你有用,请随意赞赏