使用 adb 表达式
此部分描述了 adb 表达式的用法。
在表达式中使用整数
创建表达式时,可按 3 种格式使用整数:十进制、八进制和十六进制。 十进制整数必须以非零十进制数开头。 八进制数必须以 0 开头,并且仅含有八进制数字 (0-7)。 十六进制数字必须以前缀 0x 开头,并且可包含十进制数和从 a 到 f 的字母(大写和小写)。 以下是有效数字的示例:
Decimal Octal Hexadecimal
34 042 0x22
4090 07772 0xffa
在表达式中使用符号
符号是在正在调试的程序中定义的全局变量和函数的名称。 符号等价于给定变量或函数的地址。 它们存储在程序符号表中,如果该符号表尚未从程序文件中剥离出来,它们便可用。
在表达式中,可以将符号拼写成与它在源程序中或存储在符号表中的形式完全一致。 符号表中的符号长度不超过 8 个字符。
使用 时? 子命令, adb 程序使用在程序文件的符号表中找到的符号来创建符号地址。 因此, ? 子命令有时在显示数据时给出函数名。 如果 ? 子命令用于文本 (指令) , / 命令用于数据。
如果使用 -g 标记编译 C 语言源程序,那么对局部变量仅可寻址。
如果未使用 -g 标记编译 C 语言源程序,那么无法对局部变量寻址。 以下命令显示函数样本中局部变量 b 的值:
.sample.b / x - value of local variable.
.sample.b = x - Address of local variable.
在表达式中使用运算符
可将整数、符号、变量以及寄存器名与以下运算符组合在一起:
| 一元运算符: | |
|---|---|
| ~ (波浪号) | 按位实现 |
| - (短划线) | 整数否定词 |
| * (星号) | 返回位置的内容 |
| 二目运算符: | |
|---|---|
| + (加号) | 加法 |
| - (减号) | 减法 |
| * (星号) | 乘法 |
| % (百分比) | 整数除法 |
| & (ampersand) | 按位结合 |
| ] (右括号) | 按位分隔 |
| ^ (插入标记) | 模 |
| # (数字符号) | 上舍入最接近的倍数 |
adb 调试程序使用 32 位算术。 超过 2,147,483,647(十进制)的值均显示为负值。 以下示例显示了向变量 n 指定两个不同值,然后以十进制和十六进制显示该值的结果:
2147483647>n<
n=D
2147483647<
n=X
7fffffff
2147483648>n<
n=D
-2147483648<
n=X
80000000
一元运算符的优先顺序高于二目运算符。 所有二目运算符的优先顺序均相同,并且是按从左至右的顺序求值的。 因此,adb 程序按所示方式对以下二进制表达式求值:
2*3+4=d
10
4+2*3=d
18
可通过使用圆括号更改表达式中操作的优先顺序。 以下示例显示了如何使用圆括号更改先前的表达式:
4+(2*3)=d
10
一元运算符 *(星号)将给定地址作为指向数据段的指针使用。 使用此运算符的表达式等价于该指针指向的值。 例如,表达式:
*0x1234
等于数据地址 0x1234 处的值,而示例:
0x1234
等于 0x1234。