VC中的伪寄存器


    在VC的集成开发环境中调试程序时,可以在“QuickWatch”、“Watch”窗口中方便地查看和修改变量的取值,也可以进行一些表达式计算,甚至可以在设置断点时使用这些变量生成条件表达式。“Watch”窗口还可以查看VC定义的一些特殊变量,它们被称为伪寄存器(Pseudo Registers)。伪寄存器及其用途参见下表:

伪寄存器

说明

@ERR

最近的错误号。也就是GetLastError()的返回值。调试时若想知道一个API调用的返回值,只需在Watch窗口中写上它,而不需要在代码中插入一堆DWORD dwErr = GetLastError();

@TIB

当前线程的线程信息块(Thread Information Block)。

@CLK

时钟寄存器

@EAX, @EBX, @ECX, @EDX, @ESI, @EDI, @EIP, @ESP, @EBP, @EFL

Intel CPU 寄存器

@CS, @DS, @ES, @SS, @FS, @GS

Intel CPU 段寄存器

@ST0, @ST1, @ST2, @ST3, @ST4, @ST5, @ST6, @ST7

Intel CPU 浮点运算寄存器

@HANDLES

VC++.NET才支持

@MM0,@MM1

@MM2,@MM3

@MM4,@MM5

@MM6,@MM7

@MXCSR

Intel MMX 寄存器

    我们还可以在“QuickWatch”和“Watch”窗口中使用格式符号来改变变量取值的显示方式。可用的格式符号包括:

符号

说明

示例取值

显示结果

d,I

带符号的整数

0xF000F065

-268373915

U

不带符号的整数

0x0065

101

o

不带符号的八进制数

0xF065

0170145

x,X

十六进制数

61541(十进制)

0x0000F065

l,h

用在d, i, u, o, x, X之前,l表示长整数,h表示短整数

00406042,hx

0x0c22

f

带符号的浮点数

3./2.

1.500000

E

带符号的科学记数法

3./2.

1.500000e+000

g

带符号的浮点数或带符号的科学记数法,采用二者之中较短的一种记法

3./2.

1.5

c

单个字符

0x0065

'e'

s

ANSI字符串

0x0012fde8

“Hello world”

su

UNICODE字符串

 

“Hello world”

st

ANSI字符串或UNICODE字符串,依赖于文件autoexp.dat中的UNICODE字符串设置

   

hr

HRESULT或WIN32错误码

0x00000000L

S_OK

wc

窗口类标记WC_xxx

0x00000040

WC_DEFAULTCHAR

wm

Windows消息

0x0010

WM_CLOSE

    对于指定内存地址中的内容,还可以采用以下的格式符号:

符号

说明

示例和显示结果

ma

显示64个 ASCII字符

0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1

m

以十六进制显示16字节的数据,后面是这16字节对应的ASCII字符

0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..

mb

同上

0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..

mw

显示8个word

0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000

md

显示4 个doubleword

0x0012ffac 00CB34B3 80943084 308A22FF 00002657

mq

显示4个 quadword

0x0012ffac 7ffdf00000000000 5f441a790012fdd4

mu

显示8个word,常用于显示UNICODE字符

0x0012fc60 8478 77f4 ffff ffff 0000 0000 0000 0000

    在字符数组名称前加上&,可以以字符串的形式显示该数组:&fruit_names。

    格式字符同样可以用在表达式后面:

fruit_names[1], mb
count,d

    可以使用操作BY, WO, DW查看指定地址或寄存器指向的值。其中BY返回指针指向处一个字节的内容,WO返回指针指向处一个字的内容,DW返回指针指向处一个双字的内容。这些操作可以用在变量、寄存器或常量后。

    也可以使用上下文操作{ }来查看指定地址处的内容。

    可以在未展开(即变量前面显示的还是+)的结构、数组、指针、对象后使用格式符。如果随后展开该变量,则指定的格式影响所有成员。不能对每个成员指定不同的格式。

    在指针变量后用数字n作为格式符,将以数组形式查看指向的地址处的n个数组成员。例如:

ptr,10

参考文献:

1、http://msdn.microsoft.com/library/techart/msdn_vc6mgrtn.htm
2、http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcug98/html/asug_symbols_for_watch_variables.asp
3、http://www.highprogrammer.com/alan/windev/visualstudio.html
4、http://www.codeproject.com/debug/pseudoregister.asp


Copyright 2000-2005,zedware_at_gmail_dot_com
Last modified on Thursday, 2004-09-09