Windbg学习 (0x000b) 命令-寄存器控制
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