伪寄存器
许多寄存器的名字取决于处理器的架构, 因此对于那些偶尔使用调试器的用户来说很难记住所有平台上的寄存器名字. 为了克服这个问题, 调试器的开发团队引入了各种伪寄存器(Pseudo-Register), 由调试器将这些伪寄存器对应到不同的硬件架构上.
所有的伪寄存器都由一个美元符号($)开始. 如果你使用MASM语法, 你可以在$符号之前添加一个@符号, 这个@字符会告诉debugger接下来的token是一个寄存器或是一个伪寄存器, 而不是一个符号(symbol). 如果你省略这个符号, 那么debugger的响应会慢很多, 因为它不得不搜索所有的符号表(symbol table).
如果有某个符号与伪寄存器的名字相同, 那么你必须添加这个@符.
在表达式中使用伪寄存器的时候, 必须使用转义字符@.
查看寄存器的r命令例外, 也就是r命令查看伪寄存器的时候, 不需要添加@符号. 因为在运行r命令的时候, debugger始终把后续的token解释为一个寄存器或伪寄存器.
一下是一些常用的伪寄存器.
- $ip: 指令指针寄存器;
- x86上, $ip = eip
- x64上, $ip = rip
- Itanium上, $ip = iip
- $ra: 当前函数返回地址;
- $retreg: 这是个主要的值寄存器, 在函数调用返回后, 函数的结果将放在这个寄存器中.
- x86上, $retreg = eax
- x64上, $retreg = rax
- Itanium上, $retreg = ret0
- $csp: 当前栈指针;
- x86上, $csp= esp
- x64上, $csp= rsp
- Itanium上, $csp= bsp
- $proc: 当前进程, 在这个伪寄存器中包含着用户态进程环境块(PEB)的地址, 或者内核态调试器中当前进程的EPROCESS结构的地址.
- $thread: 当前的线程, 在这个寄存器中包含着用户态线程环境块(TEB)的地址, 或者内核态调试器中当前线程的ETHREAD结构的地址.
- $tpid: 当前进程的标识(PID), 注意, 结果为十六进制.
- $tid: 当前线程的标识(TID), 注意, 结果为十六进制.
举例:
参考资料:
Pseudo-Register Syntax
http://msdn.microsoft.com/en-us/library/ff553485%28VS.85%29.aspx
Debugging Tips: Use windbg as a calculator, a chat client and more…
<<AWD>>