Этот раздел посвящен применению выражений в adb.
Рассматриваются следующие вопросы:
В выражении можно указывать целые числа в десятичном, восьмеричном и шестнадцатеричном формате. Десятичное целое должно начинаться с десятичной цифры, отличной от нуля. Восьмеричное число должно начинаться с нуля (0) и содержать цифры от 0 до 7. Шестнадцатеричное число должно начинаться с префикса 0x и может содержать десятичные цифры и буквы от a до f (как в нижнем, так и в верхнем регистре). Ниже приведены примеры правильной записи чисел:
Десятичные Восьмеричные Шестнадцатеричные 34 042 0x22 4090 07772 0xffa
Идентификаторы - это имена глобальных переменных и функций, определенных в отлаживаемой программе. Идентификаторы эквивалентны адресу данной переменной или функции. Они хранятся в таблице символьных имен (идентификаторов) программы и доступны, если эта таблица не удалена из программного файла.
В выражениях идентификатор может записываться в том виде, в каком он был задан в исходной программе, или в том виде, в каком он хранится в таблице символьных имен. Длина идентификатора в таблице не должна превышать 8 символов.
Если вы указываете команду ?, программа adb создает символьные адреса на основе имен из таблицы. В результате в выводе команды ? иногда встречаются имена функций. Этого не происходит, если команда ? используется для текста (команд), а команда / используется для данных.
Вы сможете обратиться к локальной переменной только в том случае, если при компиляции исходной программы на языке C был указан флаг -g.
Если флаг -g не был задан, адрес локальной переменной определить нельзя. Получить значение локальной переменной b функции sample можно с помощью следующей команды:
.sample.b / x - значение локальной переменной. .sample.b = x - адрес локальной переменной.
Целые числа, идентификаторы, переменные и имена регистров можно
использовать в выражениях со следующими операторами:
Унарные операторы: | |
---|---|
~ (тильда) | Побитовое дополнение |
- (тире) | Целое отрицание |
* (звездочка) | Возвращает содержимое ячейки с указанным адресом |
Бинарные операторы: | |
---|---|
+ (плюс) | Сложение |
- (минус) | Вычитание |
* (звездочка) | Умножение |
% (процент) | Целочисленное деление |
&(амперсанд) | Побитовое умножение |
] (правая квадратная скобка) | Побитовое сложение |
^ (символ вставки) | Модуль |
# (номер) | Округление до ближайшего большего кратного числа |
В программе 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.
Настройка программы отладки adb
Арифметические выражения и вывод текста
Просмотр и редактирование исходного файла с помощью программы adb
Применение выражений в программе adb