汇编语言表达式
更新:2007 年 11 月
本主题适用于:
版本 |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
速成版 |
仅限本机 |
|||
标准版 |
仅限本机 |
|||
专业团队版 |
仅限本机 |
表格图例:
适用 |
|
不适用 |
|
默认情况下隐藏的一条或多条命令。 |
调试器可以正确计算汇编语言表达式,但有某些限制。用于某些汇编语言表达式的语法不同于用于汇编语言开发系统(如 Microsoft Macro Assembler (MASM))中的语法。
内存运算符
内存运算符是返回直接内存操作结果的一元运算符。这些运算符主要用于调试汇编语言代码。
{BY | WO | DW} address
BY 运算符返回包含地址处的第一个字节的短整型。该运算符模拟 BYTE PTR。
WO 运算符返回包含地址处的字的值(两个字节)的短整型。该运算符模拟 Microsoft Macro Assembler 的 WORD PTR 操作。DW 运算符返回包含地址处的前四个字节的值的长整型。此运算符模拟 DWORD PTR。
用在一些示例中的 x 格式说明符导致结果以十六进制显示。
示例
显示位于变量 sum 地址处的第一个字节:
BY sum
显示位于变量 new_set 地址处的第一个字:
WO new_set
显示位于 sum 地址处的双倍长字:
DW sum
显示位移为 6 的 EBP 寄存器指向的字节:
BY ebp+6,x
显示堆栈指针指向的字(压入堆栈的最后一个字):
WO esp,x
显示 ESI 寄存器指向的双倍长字:
DW esi,x
寄存器间接寻址
调试器不识别指示寄存器所指向的内存位置的方括号 ([ ])。相反,请使用 BY、WO 和 DW 运算符引用相应的字节、字或双字的值。
MASM 表达式 |
调试器表达式 |
C++ 表达式 |
---|---|---|
BYTE PTR [bx] |
BY ebx |
*(unsigned char) ebx |
WORD PTR [bp] |
WO ebp |
*(unsigned short *) ebp |
DWORD PTR [bp] |
DW ebp |
*(unsigned long *) ebp |
带置换的寄存器间接寻址
若要执行带位移的基本、索引的或基本索引的间接寻址模式操作,请使用带加法运算符的 BY、WO 和 DW 运算符。
MASM 表达式 |
调试器表达式 |
---|---|
BYTE PTR [edi+6] |
BY edi+6 |
BYTE PTR Test[ebx] |
BY &Test+ebx |
WORD PTR [esi][ebp+6] |
WO esi+ebp+6 |
DWORD PTR [ebx][esi] |
DW ebx+esi |
变量地址
使用 C address-of 运算符 (&),而不是 MASM OFFSET 运算符。
MASM 表达式 |
调试器表达式 |
---|---|
OFFSET Var |
&Var |
PTR 运算符
将 address-of 运算符 (&) 与类型强制转换或 BY、WO 和 DW 运算符结合使用,以替换汇编语言 PTR 运算符。
MASM 表达式 |
调试器表达式 |
---|---|
BYTE PTR Var |
BY &Var |
*(unsigned char*) |
&Var |
WORD PTR Var |
WO &Var |
DWORD PTR Var |
DW &Var |
*(unsigned long*) |
&Var |
汇编语言字符串
在变量名之后添加字符串格式说明符 ,s。
MASM 表达式 |
调试器表达式 |
---|---|
String |
String,s |
因为 C 字符串以空字符 (ASCII 0) 结尾,因此当请求字符串显示时,调试器显示从变量的第一个子节直到内存中下一个空字节之间的所有字符。如果打算调试汇编语言程序,并且要在“监视”窗口中查看字符串,应当用一个空字符分隔字符串变量。一种查看以空终止或未终止的字符串的简便方法是使用“内存”窗口。
数组和结构元素
用 address-of 运算符 (&) 做数组名称的前缀并添加所需的偏移量。偏移量可以是表达式、数字、寄存器名称或变量。
下面的示例说明如何为字节、字和双倍长字的数组执行该操作。
MASM 表达式 |
调试器表达式 |
---|---|
String[12] |
BY &String+12*(&String+12) |
aWords[bx+di] |
WO &aWords+bx+di*(unsigned*)(&aWords+bx+di) |
aDWords[bx+4] |
DW &aDWords+bx+4*(unsigned long*)(&aDWords+bx+4) |