【汇编】寄存器相关

概述:寄存器相关整理

[toc]

寄存器的易失性和保存方式

下表说明了每种寄存器在整个函数调用过程中的使用方法:

展开表

注册 状态 使用
RAX 易失的 返回值寄存器
RCX 易失的 第一个整型自变量
RDX 易失的 第二个整型自变量
R8 易失的 第三个整型自变量
R9 易失的 第四个整型自变量
R10:R11 易失的 必须根据需要由调用方保留;在 syscall/sysret 指令中使用
R12:R15 非易失的 必须由被调用方保留
RDI 非易失的 必须由被调用方保留
RSI 非易失的 必须由被调用方保留
RBX 非易失的 必须由被调用方保留
RBP 非易失的 可用作帧指针;必须由被调用方保留
RSP 非易失的 堆栈指针
XMM0、YMM0 易失的 第一个 FP 参数;使用 __vectorcall 时的第一个矢量类型参数
XMM1、YMM1 易失的 第二个 FP 参数;使用 __vectorcall 时的第二个矢量类型参数
XMM2、YMM2 易失的 第三个 FP 参数;使用 __vectorcall 时的第三个矢量类型参数
XMM3、YMM3 易失的 第四个 FP 参数;使用 __vectorcall 时的第四个矢量类型参数
XMM4、YMM4 易失的 必须根据调用方的需要保留;使用 __vectorcall 时的第五个矢量类型参数
XMM5、YMM5 易失的 必须根据调用方的需要保留;使用 __vectorcall 时的第六个矢量类型参数
XMM6:XMM15、YMM6:YMM15 非易失的 (XMM),易失的(YMM 的上半部分) 必须由被调用方保留。 YMM 寄存器必须根据需要由调用方保留。

当函数进入和退出 C 运行时库调用和 Windows 系统调用时,CPU 标志寄存器的方向位标志将被清除。

段寄存器

四个[段寄存器](【汇编】【实验楼】汇编教程笔记 #8086 寄存器组),分别是 CS 代码段寄存器、DS 数据段寄存器、ES 附加段寄存器、SS 堆栈段寄存器。

CS

存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。

SS

DS

ES

FS

fs80386 起增加的两个辅助段寄存器之一,在这之前只有一个辅助段寄存器ES FS寄存器指向当前活动线程的TEB结构(线程结构)

偏移 说明
00 只想SEH链表指针
04 线程堆栈顶部(地址最小)
08 线程堆栈底部(地址最大)
0c SubSystemTib
10 FiberData
14 ArbitraryUserPointer
18 FS 段寄存器在内存中的镜像
20 进程PID
24 线程ID
2c 指向线程局部存储的指针
30 PEB结构地址(进程结构)
34 上一个错误(LastError)

GS

x64 寄存器

Register 状态 请使用
RAX 易失的 返回值寄存器
RCX 易失的 第一个整型参数
RDX 易失的 第二个整型参数
R8 易失的 第三个整型参数
R9 易失的 第四个整型参数
R10:R11 易失的 必须根据需要由调用方保留;在 syscall/sysret 指令中使用
R12:R15 非易失的 必须由被调用方保留
RDI 非易失的 必须由被调用方保留
RSI 非易失的 必须由被调用方保留
RBX 非易失的 必须由被调用方保留
RBP 非易失的 可用作帧指针;必须由被调用方保留
RSP 非易失的 堆栈指针
XMM0 易失的 第一个 FP 参数
XMM1 易失的 第二个 FP 参数
XMM2 易失的 第三个 FP 参数
XMM3 易失的 第四个 FP 参数
XMM4:XMM5 易失的 必须根据需要由调用方保留
XMM6:XMM15 非易失的 必须根据需要由被调用方保留。

【汇编】寄存器相关
https://hodlyounger.github.io/B_Code/汇编/【汇编】寄存器相关/
作者
mingming
发布于
2023年11月3日
许可协议