Для того чтобы после каждой машинной инструкции выдавался текущий адрес, введите следующую команду:
main , 5 ? ia
Если эта команда используется с приведенным здесь примером программы adbsamp, то ее вывод будет выглядеть следующим образом:
.main: .main: mflr 0 .main+4: st r0, 0x8(r1) .main+8: stu rs, (r1) .main+c: li l r4, 0x1 .main+10: oril r3, r4, 0x0 .main+14:
Для того чтобы показать, что текущий адрес не относится к команде, стоящей с ним в одной строке, добавьте к вводимой команде символ перехода на новую строку (n):
.main , 5 ? ian
Перед символом форматирования можно указать число повторений данного формата.
Для просмотра списка инструкций с указанием адреса каждой четвертой инструкции введите следующую команду:
.main,3?4ian
Если эта команда будет выполнена для примера программы adbsamp, то будут показаны следующие данные:
.main:
                 mflr 0
                 st r0, 0x8(r1)
                 stu r1, -56(r1)
                 lil r4, 0x1
 
.main+10:
                 oril r3, r4, 0x0
                 bl .f
                 l r0, Ox40(r1)
                 ai r1, r1, 0x38
 
.main+20:
                 mtlr r0
                 br
                 Invalid opcode
                 Invalid opcode
 
.main+30:
Внимательно выбирайте позицию числа в аргументах команды.
Следующая команда похожа на предыдущую, однако ее вывод будет другим:
main,3?i4an
.main:
.main:           mflr  0
.main+4:         .main+4:        .main+4:         .main+4:
                 st  r0,  0x8(r1)
.main+8:        .main+8:         .main+8:         .main+8:
                stu  r1,    (r1)
.main+c:        .main+c:         .main+c:         .main+c:
Можно комбинировать форматы и выдавать на экран информацию в достаточно сложном виде. Например, для просмотра мнемонических имен команд и их шестнадцатеричных эквивалентов можно ввести такую команду:
.main,-1?i^xn
В этом примере выдача начинается с адреса main. Отрицательное число (-1) приводит к вызову команды в бесконечном цикле, так что вывод на дисплей продолжается до тех пор, пока не произойдет ошибка (например, будет достигнут конец файла). В записи формата i выдает мнемоническую команду, ^ (знак вставки) перемещает текущий адрес к началу команды, а x выдает шестнадцатеричный эквивалент команды. Наконец, n отправляет на терминал символ новой строки. Вывод имеет примерно следующий вид:
.main:
.main:           mflr  0
                 7c0802a6
                   st r0, 0x8(r1)
                 9001008
                   st r1, -56(r1)
                 9421ffc8
                   lil r4, 0x1
                 38800001
                   oril r3, r4, 0x0
                 60830000
                   bl  -  .f
                 4bffff71
                   l r0, 0x40(r1)
                 80010040
                   ai r1, r1, 0x38
                 30210038
                   mtlr r0
                 7c0803a6
В следующем примере показано, как можно комбинировать форматы в командах ? или / для выдачи на экран различных типов значений, хранящихся в одной и той же программе. В примере используется программа adbsamp. Для выбора переменных необходимо сначала задать точку прерывания для останова программы, а затем запустить программу, которая будет выполнена до точки прерывания. Точка прерывания устанавливается с помощью команды :b:
.main+4:b
Для того чтобы убедиться, что данная точка прерывания установлена, воспользуйтесь командой $b:
$b breakpoints count bkpt command 1 .main+4
Запустите программу и дождитесь останова в точке прерывания:
:r adbsamp: running breakpoint .main+4: st r0, 0x8(r1)
Теперь вы можете просматривать информацию о состоянии программы. Для выдачи на экран значения какой-либо переменной укажите в команде / (косая черта) имя переменной и требуемый формат. Например, для просмотра содержимого переменной str1 в виде строки нужно ввести следующую команду:
str1/s str1: str1: Это строка символов
Для просмотра переменной number в виде десятичного целого числа нужно ввести такую команду:
number/D number: number: 456
Можно просматривать значения переменных в различных форматах. Например, с помощью следующих команд вы можете вывести на экран значение переменной lnum как 4-байтовое десятичное, восьмеричное или шестнадцатеричное число:
lnum/D lnum: lnum: 1234 lnum/O lnum: lnum: 2322 lnum/X lnum: lnum: 4d2
Можно просматривать значения переменных и в других форматах. В следующем примере выдается последовательность шестнадцатеричных значений некоторых переменных, занимающая пять строк, по восемь значений в строке:
str1,5/8x
str1:
str1:   5468  6973  2069  7320  6120  6368  6172  6163
         7465  7220  7374  7269  6e67  0   0   0     0
 
number:  0      1c8     0     0     0    d2     0     0 
         3fa0     0     0     0  5468  6973  2069  7320
         7468  6520  7365  636f  6e64  2063  6861  7261
Поскольку данные могут содержать комбинацию числовых и строковых значений, то можно выводить каждое значение и как число, и как символ, чтобы можно было видеть, где в действительности находятся строки. Это можно сделать с помощью команды
str1,5/4x4^8Cn
str1:
str1:    5468  6973  2069  7320      Это стр
          6120  6368  6172  6163      ока симв
          7465  7220  7374  7269      олов~@~@
          6e67     0     0     1      ~@~@~@~@~@~@~A
          0    1c8   0       0      ~@~@~A~<c8>~@~@~@~@
В данном случае команда выдает четыре значения в шестнадцатеричном виде, а затем повторяет те же значения как восемь символов ASCII. Символ ^ (знак вставки) используется четыре раза перед выдачей символов, чтобы снова сделать текущим начальный адрес данной строки.
Для того чтобы можно было легко разобраться в данных, показанных на дисплее, вставляйте между числами и символами символы табуляции, и печатайте адрес каждой строки:
str1,5/4x4^8t8Cna str1: str1: 5468 6973 2069 7320 Это стр str1+8: 6120 6368 6172 6163 ока симв str1+10: 7465 7220 7374 7269 олов~@~@ str1+18: 6e67 0 0 1 ~@~@~@~@~@~@~A number: number: 0 1c8 0 0 ~@~@~A~<c8>~@~@~@~@ fpt:
Применение выражений в программе adb
Просмотр и редактирование исходного файла с помощью программы adb
Пример программы adb: adbsamp2
Пример программы adb: adbsamp3