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

原文地址:https://www.cnblogs.com/ywnwa417/p/5678323.html