x86_64汇编

Kevin2li大约 4 分钟ComputerComposition

寄存器

在Intel CPU中,通常有以下类型的寄存器:

  • 通用寄存器:通用寄存器是最常用的寄存器类型,它们用于存储整数数据。在64位系统中,有16个通用寄存器,每个寄存器大小为64位。这些寄存器的名称是RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8-R15。
寄存器名称描述
RAX累加器寄存器(Accumulator Register),用于存储算术和逻辑运算的操作数和结果。在函数调用中,它通常用于存储函数的返回值。
RBX基址寄存器(Base Register),用于存储数据的基地址。在一些内存寻址方式中,它通常用于存储变量的地址。
RCX计数寄存器(Counter Register),用于在循环中计数。在函数调用中,它通常用于存储函数的参数。
RDX数据寄存器(Data Register),用于存储算术和逻辑运算的操作数和结果。在函数调用中,它通常用于存储函数的参数。
RSI源索引寄存器(Source Index Register),用于字符串操作中的源地址。
RDI目的索引寄存器(Destination Index Register),用于字符串操作中的目的地址。
RBP基址指针寄存器(Base/Frame Pointer Register),用于存储当前栈帧的基址。在函数调用中,它通常用于存储上一个栈帧的基址。
RSP栈指针寄存器(Stack Pointer Register),用于存储当前栈顶的地址。在函数调用和异常处理中,它通常用于存储函数的返回地址和异常处理的返回地址。
R8-R15扩展寄存器(Extended Register),这些寄存器是在64位系统中新增的。它们用于存储算术和逻辑运算的操作数和结果,以及函数调用的参数和返回值。

这些通用寄存器在程序设计中非常常用,它们可以用于存储各种类型的数据,包括整数、指针、地址等等。同时,它们也在汇编语言和计算机体系结构中扮演着重要的角色,对于理解程序的运行机制和进行编程优化都有着重要的意义。

  • 段寄存器:段寄存器用于存储内存段的地址和访问权限。在Intel CPU中,有4个段寄存器,分别是CS(代码段)、DS(数据段)、SS(堆栈段)和ES(附加数据段)。

  • 控制寄存器:控制寄存器用于控制CPU的工作模式和运行状态。在Intel CPU中,有多个控制寄存器,包括CR0、CR2、CR3、CR4等。

  • 标志寄存器:标志寄存器用于存储CPU的运行状态和结果。在Intel CPU中,标志寄存器的名称是RFLAGS。它包含了多个标志位,例如进位标志、零标志、符号标志、溢出标志等等。

  • 浮点寄存器:浮点寄存器用于存储浮点数和向量数据。在Intel CPU中,有8个浮点寄存器,每个寄存器可以存储64位或者128位的数据。这些寄存器的名称是XMM0-XMM7。

  • SIMD寄存器:SIMD寄存器用于存储向量数据和执行SIMD指令。在Intel CPU中,有16个SIMD寄存器,每个寄存器可以存储128位的数据。这些寄存器的名称是XMM0-XMM15。

  • Debug寄存器:Debug寄存器用于调试程序和CPU。在Intel CPU中,有多个Debug寄存器,包括DR0、DR1、DR2、DR3、DR6、DR7等。

  • 指令指针寄存器: 指令指针寄存器(Instruction Pointer Register),也称为程序计数器(Program Counter, PC)。%rip寄存器存储了CPU当前正在执行的指令的地址. 它不能被直接修改。它的值只能通过CPU执行指令时自动更新。因此,在程序中,%rip寄存器通常用于间接寻址,例如通过相对地址或者基址加偏移量来访问内存中的数据。

这些寄存器在CPU的运行过程中发挥着不同的作用,例如通用寄存器用于存储运算数据、段寄存器用于管理内存访问、标志寄存器用于存储运算结果状态等等。它们在计算机体系结构中扮演着非常重要的角色,对于理解计算机硬件和编程语言都有着重要的意义。

名称表示:

指令表示

操作码(opcode)+操作数(operand)

操作数的形式:

  • 常量:例如$0x2
  • 寄存器:例如%eax
  • 内存: 例如-0x4(%rbp)

常用指令:

指令执行过程

取指令->分析指令->执行指令->存储结果

程序内存空间

用户态和内核态

操作系统概念,p22