【汇编】寄存器相关
概述:寄存器相关整理
[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
fs 是 80386 起增加的两个辅助段寄存器之一,在这之前只有一个辅助段寄存器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/汇编/【汇编】寄存器相关/