r
读取/设置寄存器值
r Register[:[Num]Type] [= [Value]]
举例:
r :打印所有寄存器
r rax
r eax
r @rax=0 设置寄存器的值
RegisterName:
关于不同架构上的寄存器名称
|63..32|31..16|15-8|7-0|
|AH..AL..|
|AX......|
|EAX...........|
|RAX...................|
所以对于 ax寄存器,是读取寄存器的不同长度
r al
r ax
r eax
r rax
可用的寄存器 如下
- rax 作为函数返回值使用。
- rsp 栈指针寄存器,指向栈顶
- rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数。。。
- rbx,rbp,r12,r13,14,15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改
- r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值
register | 状态 | 使用 |
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 寄存器必须根据需要由调用方保留。 |
关于 x86 和 x64寄存器介绍 可以参考一下文章:
https://msdn.microsoft.com/zh-cn/library/9z1stfyw.aspx
http://www.mouseos.com/x64/extend64.html