汇编学习1
IA-32 架构寄存器详解
在IA-32架构中,各寄存器的位数和主要用途如下:
通用寄存器(General Purpose Registers)
EAX - 累加器寄存器
- 位数:32位
- 低16位:AX
- 低8位:AL(低8位)、AH(高8位)
- 用途:用于算术和逻辑运算的默认寄存器。在系统调用中,EAX 用于存放系统调用号
EBX - 基址寄存器
- 位数:32位
- 低16位:BX
- 低8位:BL(低8位)、BH(高8位)
- 用途:常用于存储数据地址。在系统调用中,EBX通常作为第一个参数
ECX - 计数寄存器
- 位数:32位
- 低16位:CX
- 低8位:CL(低8位)、CH(高8位)
- 用途:在循环和字符串操作中使用。在系统调用中,ECX通常用于存放第二个参数
EDX - 数据寄存器
- 位数:32位
- 低16位:DX
- 低8位:DL(低8位)、DH(高8位)
- 用途:用于扩展运算,特别是乘法和除法操作。在系统调用中,EDX通常用于存放第三个参数
指针寄存器(Pointer Registers)
ESP - 栈指针寄存器
- 位数:32位
- 用途:指向当前栈的顶端。管理函数调用中的栈指针
EBP - 基址指针寄存器
- 位数:32位
- 用途:用于函数调用时保存栈的基址,便于访问局部变量和参数
索引寄存器(Index Registers)
ESI - 源索引寄存器
- 位数:32位
- 用途:在字符串操作中用作源地址。在系统调用中,ESI通常用于存放第四个参数
EDI - 目的索引寄存器
- 位数:32位
- 用途:在字符串操作中用作目标地址。在系统调用中,EDI通常用于存放第五个参数
指令指针(Instruction Pointer)
- EIP - 指令指针
- 位数:32位
- 用途:指向当前执行的指令地址,CPU根据EIP读取和执行指令
标志寄存器(Flags Register)
- EFLAGS - 标志寄存器
- 位数:32位
- 用途:存储CPU状态标志,如零标志、进位标志、溢出标志等,影响条件分支的行为
系统调用中的寄存器分配
在Linux系统调用中,通常使用以下寄存器分配方式:
- EAX:存放系统调用号
- EBX:第一个参数
- ECX:第二个参数
- EDX:第三个参数
- ESI:第四个参数
- EDI:第五个参数
- EBP:第六个参数
x86-64 架构寄存器详解
在x86-64架构中,寄存器分为通用寄存器、指针寄存器、索引寄存器、指令指针、标志寄存器等。每个寄存器的位数为64位,同时它们也可以分为32位、16位和8位的部分来访问
通用寄存器(General Purpose Registers)
RAX - 累加器寄存器
- 位数:64位
- 32位:EAX
- 16位:AX
- 8位:AL(低8位)、AH(高8位)
- 用途:算术和逻辑运算的默认寄存器。在系统调用中,RAX用于存放系统调用号
RBX - 基址寄存器
- 位数:64位
- 32位:EBX
- 16位:BX
- 8位:BL(低8位)、BH(高8位)
- 用途:常用于数据存储地址
RCX - 计数寄存器
- 位数:64位
- 32位:ECX
- 16位:CX
- 8位:CL(低8位)、CH(高8位)
- 用途:通常用于循环操作,作为计数器。部分指令(如字符串操作指令)依赖于此寄存器
RDX - 数据寄存器
- 位数:64位
- 32位:EDX
- 16位:DX
- 8位:DL(低8位)、DH(高8位)
- 用途:在扩展运算中使用,尤其是乘法和除法操作。在系统调用中,RDX用于存放第三个参数
RSI - 源索引寄存器
- 位数:64位
- 32位:ESI
- 16位:SI
- 8位:SIL
- 用途:在字符串操作中用作源地址。在系统调用中,RSI通常用于存放第二个参数
RDI - 目的索引寄存器
- 位数:64位
- 32位:EDI
- 16位:DI
- 8位:DIL
- 用途:在字符串操作中用作目标地址。在系统调用中,RDI通常用于存放第一个参数
RBP - 基址指针寄存器
- 位数:64位
- 32位:EBP
- 16位:BP
- 8位:BPL
- 用途:用于函数调用时保存栈的基址,便于访问局部变量和参数
RSP - 栈指针寄存器
- 位数:64位
- 32位:ESP
- 16位:SP
- 8位:SPL
- 用途:指向当前栈顶,用于管理函数调用栈
R8 至 R15 - 扩展通用寄存器
- 位数:64位
- 用途:这些额外的通用寄存器用于增加数据处理能力。在系统调用中,R8至R9通常用于存放第五和第六个参数
指令指针(Instruction Pointer)
- RIP - 指令指针
- 位数:64位
- 用途:指向当前执行的指令地址,CPU根据RIP读取和执行指令
标志寄存器(Flags Register)
- RFLAGS - 标志寄存器
- 位数:64位
- 用途:存储CPU状态标志,如零标志、进位标志、溢出标志等,影响程序条件分支的行为
系统调用中的寄存器分配(Linux)
在x86-64(64位)架构中,Linux系统调用使用以下寄存器分配方式:
- RAX:存放系统调用号
- RDI:第一个参数
- RSI:第二个参数
- RDX:第三个参数
- R10:第四个参数
- R8:第五个参数
- R9:第六个参数
对于超过六个参数的情况,额外的参数会通过栈传递