汇编学习1

IA-32 架构寄存器详解

在IA-32架构中,各寄存器的位数和主要用途如下:

通用寄存器(General Purpose Registers)

  1. EAX - 累加器寄存器

    • 位数:32位
    • 低16位:AX
    • 低8位:AL(低8位)、AH(高8位)
    • 用途:用于算术和逻辑运算的默认寄存器。在系统调用中,EAX 用于存放系统调用号
  2. EBX - 基址寄存器

    • 位数:32位
    • 低16位:BX
    • 低8位:BL(低8位)、BH(高8位)
    • 用途:常用于存储数据地址。在系统调用中,EBX通常作为第一个参数
  3. ECX - 计数寄存器

    • 位数:32位
    • 低16位:CX
    • 低8位:CL(低8位)、CH(高8位)
    • 用途:在循环和字符串操作中使用。在系统调用中,ECX通常用于存放第二个参数
  4. EDX - 数据寄存器

    • 位数:32位
    • 低16位:DX
    • 低8位:DL(低8位)、DH(高8位)
    • 用途:用于扩展运算,特别是乘法和除法操作。在系统调用中,EDX通常用于存放第三个参数

指针寄存器(Pointer Registers)

  1. ESP - 栈指针寄存器

    • 位数:32位
    • 用途:指向当前栈的顶端。管理函数调用中的栈指针
  2. EBP - 基址指针寄存器

    • 位数:32位
    • 用途:用于函数调用时保存栈的基址,便于访问局部变量和参数

索引寄存器(Index Registers)

  1. ESI - 源索引寄存器

    • 位数:32位
    • 用途:在字符串操作中用作源地址。在系统调用中,ESI通常用于存放第四个参数
  2. EDI - 目的索引寄存器

    • 位数:32位
    • 用途:在字符串操作中用作目标地址。在系统调用中,EDI通常用于存放第五个参数

指令指针(Instruction Pointer)

  1. EIP - 指令指针
    • 位数:32位
    • 用途:指向当前执行的指令地址,CPU根据EIP读取和执行指令

标志寄存器(Flags Register)

  1. EFLAGS - 标志寄存器
    • 位数:32位
    • 用途:存储CPU状态标志,如零标志、进位标志、溢出标志等,影响条件分支的行为

系统调用中的寄存器分配

在Linux系统调用中,通常使用以下寄存器分配方式:

  • EAX:存放系统调用号
  • EBX:第一个参数
  • ECX:第二个参数
  • EDX:第三个参数
  • ESI:第四个参数
  • EDI:第五个参数
  • EBP:第六个参数

x86-64 架构寄存器详解

在x86-64架构中,寄存器分为通用寄存器、指针寄存器、索引寄存器、指令指针、标志寄存器等。每个寄存器的位数为64位,同时它们也可以分为32位、16位和8位的部分来访问

通用寄存器(General Purpose Registers)

  1. RAX - 累加器寄存器

    • 位数:64位
    • 32位:EAX
    • 16位:AX
    • 8位:AL(低8位)、AH(高8位)
    • 用途:算术和逻辑运算的默认寄存器。在系统调用中,RAX用于存放系统调用号
  2. RBX - 基址寄存器

    • 位数:64位
    • 32位:EBX
    • 16位:BX
    • 8位:BL(低8位)、BH(高8位)
    • 用途:常用于数据存储地址
  3. RCX - 计数寄存器

    • 位数:64位
    • 32位:ECX
    • 16位:CX
    • 8位:CL(低8位)、CH(高8位)
    • 用途:通常用于循环操作,作为计数器。部分指令(如字符串操作指令)依赖于此寄存器
  4. RDX - 数据寄存器

    • 位数:64位
    • 32位:EDX
    • 16位:DX
    • 8位:DL(低8位)、DH(高8位)
    • 用途:在扩展运算中使用,尤其是乘法和除法操作。在系统调用中,RDX用于存放第三个参数
  5. RSI - 源索引寄存器

    • 位数:64位
    • 32位:ESI
    • 16位:SI
    • 8位:SIL
    • 用途:在字符串操作中用作源地址。在系统调用中,RSI通常用于存放第二个参数
  6. RDI - 目的索引寄存器

    • 位数:64位
    • 32位:EDI
    • 16位:DI
    • 8位:DIL
    • 用途:在字符串操作中用作目标地址。在系统调用中,RDI通常用于存放第一个参数
  7. RBP - 基址指针寄存器

    • 位数:64位
    • 32位:EBP
    • 16位:BP
    • 8位:BPL
    • 用途:用于函数调用时保存栈的基址,便于访问局部变量和参数
  8. RSP - 栈指针寄存器

    • 位数:64位
    • 32位:ESP
    • 16位:SP
    • 8位:SPL
    • 用途:指向当前栈顶,用于管理函数调用栈
  9. R8R15 - 扩展通用寄存器

    • 位数:64位
    • 用途:这些额外的通用寄存器用于增加数据处理能力。在系统调用中,R8R9通常用于存放第五和第六个参数

指令指针(Instruction Pointer)

  1. RIP - 指令指针
    • 位数:64位
    • 用途:指向当前执行的指令地址,CPU根据RIP读取和执行指令

标志寄存器(Flags Register)

  1. RFLAGS - 标志寄存器
    • 位数:64位
    • 用途:存储CPU状态标志,如零标志、进位标志、溢出标志等,影响程序条件分支的行为

系统调用中的寄存器分配(Linux)

在x86-64(64位)架构中,Linux系统调用使用以下寄存器分配方式:

  • RAX:存放系统调用号
  • RDI:第一个参数
  • RSI:第二个参数
  • RDX:第三个参数
  • R10:第四个参数
  • R8:第五个参数
  • R9:第六个参数

对于超过六个参数的情况,额外的参数会通过栈传递