x86 寄存器

发布时间:2024年01月18日

16 位(8086)

8086 是 Intel 公司第一款 16 位处理器,诞生于 1978 年。
8086 处理器内部有 8 个 16 位的通用寄存器,分别被命名为 AX、BX、CX、DX、SI、DI、BP、SP。
这 8 个寄存器中的前 4 个,即 AX、BX、CX 和 DX,又各自可以拆分成两个 8 位的寄存器来使用,总共可以提供 8 个 8 位的寄存器 AH、AL、BH、BL、CH、CL、DH、DL。
在这里插入图片描述
在 8086 处理器里,有一个特殊的寄存器,叫做标志寄存器 FLAGS。

32 位(80386)

1985 年的 80386 处理器是 Intel 公司的第一款 32 位产品。
Intel 32 位处理器架构简称 IA-32(Intel Architecture,32-bit),是以 1978 年的 8086 处理器为基础发展起来的。
32 位处理器在 16 位处理器的基础上,扩展了这 8 个通用寄存器的长度
在这里插入图片描述
为了在汇编语言程序中使用经过扩展(Extend)的寄存器,需要给它们命名,它们的名字分别是 EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP。
另外,在 16 位处理器中,标志寄存器 FLAGS 是 16 位的,在 32 位处理器中,扩展到了 32 位,低 16 位和原先保持一致。
在这里插入图片描述

64 位(x86_64)

x86_64 架构有 16 个通用寄存器,相比 IA32 多了 8 个(r8 至 r15 是 x86_64 新增的)。
在这里插入图片描述
x86_64 中的一个通用寄存器有 4 种用法。以 RAX 为例:

  • 可以被当做 RAX 使用——64位
  • 可以被当做 EAX 使用——32位
  • 可以被当做 AX 使用——16位
  • 可以被当做 AL 使用——8位

对于通用寄存器的用途,有一些隐含的规定,有时候某些指令必须使用特定的寄存器来进行操作,例如:

  • 有符号乘法指令 imul 默认会将乘积存放在 RDX:RAX,EDX:EAX,DX:AX,或 AX 中。
  • 有符号除法指令 idiv 默认要求被除数放在 RDX:RAX,EDX:EAX,DX:AX,或 AX 中。
  • x86 的字符串操作要求源操作数和目的操作数的地址分别存放在 RSI 和 RDI 中
  • RBP 是栈基址指针,RSP 是栈顶指针。通常,x86_64 中的栈的操作单位是 8 字节,有些运行环境也可能是16 字节。
  • 等等

x86_64 中,RFLAGS 是一个 64 位寄存器,其每一个比特位有不同的含义。其中,最常用的标记位有:

  • 进位标识 CF:无符号数的算数运算产生溢出会导致 CF 被设置;寄存器移位指令也可能会导致 CF 被设置;等等
  • 溢出标识 OF:两个有符号数的算数运算可能导致 OF 被设置
  • 奇偶校验位 PF
  • 符号位 SF:用于标识算数指令和逻辑运算指令运算结果的符号
  • 零标识位 ZF:用于标识算数指令和逻辑运算指令运算结果是不是 0

指令寄存器 RIP 包含下一条将要被执行的指令的逻辑地址。通常情况下,每取出一条指令后,RIP 会自增指向下一条指令。在 x86_64 中 RIP 的自增也即偏移 8 字节。
但是 RIP 并不总是自增,也有例外,例如 call 指令和 ret 指令。call 指令会将当前 RIP 的内容压入栈中,将程序的执行权交给目标函数;ret 指令则执行出栈操作,将之前压入栈的 8 个字节的 RIP 地址弹出,重新放入 RIP。

文章来源:https://blog.csdn.net/lyndon_li/article/details/135391684
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。