0x01 寄存器
寄存器不严谨的可以分为通用寄存器和专用寄存器。
以 32 位寄存器为例:
通用寄存器有:eax、ebx、ecx、edx,它们可以在所有地方使用。
这四个并不是完全就是 “ 通用 ” ,它们还有各自的习惯用法。
源变址寄存器和目标变址寄存器有:esi、edi。esi 的作用是存放要处理的数据的内存地址,edi 的作用是存放处理后的数据的内存地址。
栈相关的寄存器有:SS、ebp、esp。其中 esp 存放的是栈顶的地址(高地址),ebp 相应的是存放栈底(低地址)的位置。
栈随着存储内容的增加,是向低地址增长,即 ebp 中的地址不断减小。
SS 是用在 16 位寄存器中的,32 位寄存器中虽有,但一般设为常量
代码段相关的寄存器有:CS、eip。其中 CS 存放代码段的基址,32 位寄存器中基本不用,设为常量,eip 是存放下一条指令地址的寄存器。
数据段相关的寄存器有:DS。常与 esi 一起使用。
附加段相关的寄存器有:ES。常与 edi 一起使用。
eflag 标志寄存器表示了指令执行中的一系列相关信息。
对于 64 位寄存器,其寄存器是将 8 个exx 寄存器改为 rxx ,同时增加了 8 个新寄存器:r8,r9,r10,r11,r12,r13,r14,r15。
使用方法基本参照 32 位寄存器
fastcall 传参寄存器:rcx,rdx,r8,r9(64 位系统中只有 fastcall 约定了)
scratch 寄存器:rbx,r12,r13,r14,r15(这些寄存器可以随意修改)
0x02 指令简介
汇编指令有很多,常用的汇编指令有:
- 传送指令
- 常见的有 mov、lea、push、pop
- 算术指令
- 例如加减乘除,位运算等
- 逻辑指令
- 逻辑与或非等运算
- 串操作指令
- 与字符串相关的指令,如字符串的拷贝、比较、长度计算等等
- 控制转移指令
- 有条件跳转指令、无条件跳转指令、中断指令
- 处理机控制指令
- 关机、重启等
- 汇编指令操作对象
- 立即数(常数、常量)、内存、寄存器
0x03 指令集
实际上指令集分为两种:复杂指令集(CISC)、精简指令集(RISC)。
精简指令集:提供了有限的操作,大多数指令在一个周期内完成,指令长度固定,各个指令使用频率相差不大。
复杂指令集:提供了庞大的操作,不同指令消耗时间差别较大,指令长度不定,各个指令使用频率相差很大。
0x04 指令集区别
两种指令集各有优缺点,所以两者的应用方向也都各有不同。
对与 CISC 而言其优点是高性能,但缺点也就是高功耗,这些个优缺点使得其更加适合于放在 PC 端上的 CPU 设计之中;
与之相对的 RISC 的优缺点又是相反的优点是低功耗,高效能,带来的缺点就是其性能较低,使得其更加适合与放在电池容量较小智能移动设备(如:手机,智能手表等)上。
两中指令集体系各自都有一个较为突出的指令集架构, CISC 的代表即为 Intel 的 X86 架构,多数应用于 PC 端中;RISC 的代表即为 ARM 架构。