汇编语言学习笔记(一)-寄存器

一直在犹豫汇编语言开始讲什么,如果只说指令,常用的也就几十条甚至十几条指令,如果认为学习汇编就是学习一些指令,那未免有点舍本逐末,如果从IA-32构架开始,又过于晦涩,纠结之下还是先对下基本寄存器做个介绍,为了完整性,顺便对其他高级寄存器做一个列举。

寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输,但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字,而且有些还有多个名字^_^

寄存器分类

IA-32构架提供了16个基本寄存器,这16个基本寄存器可以归纳为如下几类:

  • 通用寄存器
  • 段寄存器
  • 状态和控制寄存器
  • 指令寄存器

通用寄存器

32位通用寄存器有八个,eax, ebx, ecx, edx, esi, edi, ebp, esp,他们主要用作逻辑运算、地址计算和内存指针,具体功能如下:

eax —— 累加和结果寄存器
ebx —— 数据指针寄存器
ecx —— 循环计数器
edx —— i/o指针
esi —— 源地址寄存器
edi —— 目的地址寄存器
esp —— 堆栈指针
ebp —— 栈指针寄存器

当然,以上功能并未限制寄存器的使用,特殊情况为了效率也可作其他用途。这八个寄存器低16位分别有一个引用别名 ax, bx, cx, dx, bp, si, di, sp, 其中 ax, bx, cx, dx, 的高8位又引用至 ah, bh, ch, dh,低八位引用至 al, bl, cl, dl

在 64-bit 模式下,有16个通用寄存器,但是这16个寄存器是兼容32位模式的,32位方式下寄存器名分别为 eax, ebx, ecx, edx, edi, esi, ebp, esp, r8d – r15d. 在64位模式下,他们被扩展为 rax, rbx, rcx, rdx, rdi, rsi, rbp, rsp, r8 – r15. 其中 r8 – r15 这八个寄存器是64-bit模式下新加入的寄存器。

段寄存器

段寄存器 cs, ds, ss, es, fs, gs, 保存16位的段选择子,一个段选择子指定了一个段在内存的指针,以便再内存中访问段,访问方式与内存模式有关,段模式和平坦模式其代表的意义并不相同。

cs —— 代码段寄存器
ds, es, fs, gs —— 数据段寄存器
ss —— 堆栈段寄存器

在 64-bit 模式下,这6个寄存器并无变化,只是使用上略有区别。

状态和控制寄存器 eflags

这个寄存器表示的意义非常丰富,程序中并不直接操作此寄存器,并由此衍生出很多操作指令。

除去一些保留位,其他每位都代表一个具体的含义,其中 bits 0, 2, 4, 6, 7, 11 是状态位,标识了某此操作后的状态,8, 9, 10 位为控制标识

CF (bit 0) —— 进位标识,算术操作进行了进位和借位,则此位被设置
PF (bit 2) —— 奇偶标识,结果包含奇数个1,则设置此位
AF (bit 4) —— 辅助进位标识,结果的第3位像第4位借位,则此位被设置
ZF (bit 6) —— 零标识,结果为零,此位设置
SF (bit 7) —— 符号标识,若为负数则设置此位
OF (bit 11) —— 溢出标识,结果像最高位符号位进行借位或者进位,此标志被设置

TF (bit 8) —— 陷阱标识,设置进程可以被单步调试
IF (bit 9) —— 中断标识,设置能够响应中断请求
DF (bit 10) —— 方向标识,用于标示字符处理过程中指针移动方向。

在64-bit模式下,该寄存器被扩展为64位,rflags,但是其高32位保留未被使用,其低32位所表示含义与32位模式相同。

指令寄存器 EIP

EIP —— 标志当前进程将要执行指令位置 在64位模式下扩展为 RIP 64位指令寄存器。

控制寄存器

cr0, cr2, cr3, cr4

系统表指针寄存器

idtr —— 中断描述符表信息
gdtr —— 全局描述符表信息
ldtr —— 局部描述符表信息

任务寄存器tr

保存任务的状态信息 tss

调试寄存器 dr0 – dr7 控制和允许监视进程的调试操作

x87 FPU 寄存器

这组指令专门用过浮点运算,因为浮点运算尤其固有的特性,所以需要使用一组独立寄存器。 数据寄存器包括 r0 – r7 的8个 80 位寄存器,汇编程序中通过名字 st(x) 引用,另外还有3个16位寄存器,分别是控制寄存器,状态寄存器,标记寄存器。 这里的省略具体含义的介绍。

MMX 寄存器

MMX 为一种 SIMD 技术,即可通过一条指令执行多个数据运算,共有8个64位寄存器,分别为mm0 – mm7,他与其他普通64位寄存器的区别在于通过它的指令进行运算,可以同时计算2个32位数据,或者4个16位数据等等,可以应用为图像处理过程中图形 颜色的计算。另外需要特别注意的是,MMX并非一种新的寄存器,而是FPU 80位寄存器的低64位,也就是说,使用MMX指令集,会影响浮点运算!

XMM 寄存器

XMM 同 MMX,只是他有 8 个 128 位寄存器,分别为 xmm0 – xmm7,另外还包含计算过程中的状态和控制寄存器

这篇介绍列举了一些CPU寄存器并对某些寄存器进行了详细介绍,但并非完整详尽的介绍,略去了很多细节,因为寄存器本身只做存储之用,真正理解还需依靠其对应的指令操作,这里仅仅为之后的介绍做一些准备工作,如果有可能,我会努力完善此文。

Built with Hugo
主题 StackJimmy 设计