Assembler / P02
.pdf
|
|
11 |
|
1.2) |
E адрес [список] |
Enter — ввод |
|
|
Ввод данных по указанному адресу. |
|
|
|
а) E адрес |
(список опущен) |
|
-e200
1C36:0200 01.02 12. 1B.0
вводим пробел для перехода к следующему байту
Результат:
-d200L3
1C36:0200 02 12 00
Итак, при нажатии пробельной клавиши отладчик выводит очередной байт и запрашивает его изменение, выводя точку. Для перехода к предыдущему бай-
ту нужно ввести дефис (попробуйте!).
Упражнение. С помощью команды E можно просматривать память. По-
смотрите, что будет происходить, если вы подадите команду efff0 и несколь-
ко раз нажмете пробельную клавишу. Перейдете ли Вы границу сегмента? А что произойдет, если вы наберете команду dfff0?
б) E адрес список
e200 02 12 00
Результат тот же, что и в предыдущем примере, но на этот раз замена дан-
ных ведется "вслепую".
Слова приходится заносить в память побайтно. Байты заносятся в обратном порядке. Например, для ввода по адресу (смещению) 120 слова 1234 подаем ко-
манду:
-e120 34 12
Пример ввода строки символов:
-e130 'string for example',D,A,'$'
(0Dh — код возврата каретки, 0Ah — код перевода строки. $ — терминатор
(ограничитель) строки, который нужен при использовании системной функции вывода строки на экран. Эту функцию мы изучим позднее.)
1.3) R [имя регистра] Register — регистр а) R (без параметра) — выводятся имена всех регистров и их содержимое.
Последняя строка вывода имеет формат:
адрес |
код команды |
мнемоника команды [содержимое памяти] |
12
1С36:0100 A10002 |
MOV AX,[0200] |
DS:0200=01E4 |
б) R имя регистра — debug выводит содержимое регистра, а на следую-
щей строке помещает двоеточие — приглашение к вводу нового значения. К
сожалению, можно указывать только 16-разрядные регистры.
-rbx 1107
: 1 (вводим новое содержимое регистра)
<Enter> -rah
br ERROR (недопустимое имя регистра)
в) RF выводит содержимое регистра флагов
NV UP DI NG NZ AC PE NC -
После дефиса можно ввести новые значения флагов: - PLCY (если задано более чем один код значения для флага, появляется сообщение об ошибке df error если задан код значения, отсутствующий в списке — сообщение bf error).
1.4) F область список Fill—заполнение
Если размер области превосходит длину списка, то список используется по-
вторно, пока область не будет заполнена. Остаток списка усекается.
Пример. Перед созданием программы в отладчике полезно заполнить уча-
сток памяти кодом команды nop (90h) (если это не сделать, "мусор" в памяти сбивает с толку начинающего пользователя).
-f100L100 90
|
Упражнение. Выполнить f400L10 1 2 3 и изучить результат. |
|
|
2) Работа с кодами команд. |
|
2.1) |
A [адрес] |
Assemble — ассемблировать |
|
Пример работы этой команды мы уже видели. Если в начале сеанса работы |
|
с debug не указывать адрес, то ассемблирование начнется с адреса XXXX:0100.
Отметим, что с использованием мини-ассемблера заполнение памяти дан-
ными осуществить даже проще, чем с помощью команды E:
-a200
1C36:0200 dw ffd0,12,a1c7
13
1C36:0206
-
(В результате [200]=FFD0h, [202]=0012h, [204]=A1C7h.)
-a200
1C36:0200 db "String",D,A,'$'
1C36:0209
|
Здесь использованы директивы dw (Define Word — задать слово) и db |
|
(Define Byte — задать байт). |
|
|
2.2) |
U [область] |
Unassemble — дисассемблировать |
|
Команда переводит коды из области памяти в мнемонику команд. |
|
|
Если перевод невозможен, то выводится ???? или DB число. Если параметр |
|
область опущен, то команда дисассемблирует 20 байт, начиная с текущего зна-
чения IP. Вновь введем U — следующие 20 байт и т.д. (аналогично команде D
без параметров). |
|
|
|
3) Выполнение программы. |
|
3.1) |
T[=стартовый адрес] [количество повторений] |
Trace — трассировка |
|
После выполнения каждой команды выводится информация, как при подаче |
|
команды R. Приведем примеры: |
|
|
|
а) t — выполнить одну команду, адрес которой в CS:IP; |
|
|
б) t5 — выполнить 5 команд, начиная с текущего адреса; |
|
|
в) t=106 8 — выполнить 8 команд, начиная с адреса CS:106. |
|
3.2) |
G[=стартовый адрес] [адрес останова] |
Go — прогон |
|
а) g — выполнить программу, начиная с адреса, хранящегося в IP. Про- |
|
грамма должна заканчиваться инструкциями завершения (эти инструкции мы изучим позднее — сейчас упоминаем о них только в справочных целях), напри-
мер, INT 20h или MOV AH,4Ch /INT 21h. После выполнения INT 20h debug выводит сообщение:
Program terminated normally (Выполнение программы завершено)
Теперь повторный запуск программы возможен только после выполнения ко-
манды L (см. ниже).
б) g=100 адрес команды nop
14
Мы рекомендуем на начальном этапе обучения завершать учебные про-
граммы, набираемые в debug, командой nop и использовать ее адрес в качестве адреса останова.
4) Работа с файлами и дисками.
4.1) |
N имя файла |
Name — имя |
|
Задание имени файла. Расширение указывать обязательно. Используется |
|
перед следующими двумя командами. |
|
|
4.2) |
L [адрес] |
Load — загрузка |
|
Содержимое файла переписывается в ОЗУ. Файлы с любым расширением |
|
кроме .exe — начиная с указанного адреса (если адрес опущен, то начиная с
CS:0100). Для файлов с расширением .exe адрес игнорируется, используется
стартовый адрес, записанный в самом файле. |
|
|
|
По окончании загрузки в BX:CX содержится размер файла в байтах. |
|
4.3) |
W [адрес] |
Write — запись |
|
Запись файла на диск. Предварительно в BX:CX нужно записать размер |
|
файла. Если адрес не указан, то подразумевается CS:0100. |
||
|
У команд L и W имеются также параметры для работы с секторами диска. |
|
Мы их не рассматриваем. |
|
|
|
5) Сервис. |
|
5.1) |
H <величина> <величина> |
Hex — шестнадцатеричный |
|
Встроенный калькулятор. Вычисляет сумму и разность указанных величин: |
|
H a b (a и b — слова) a+b a-b
Примеры: 1) Программа начинается по адресу 0100h и заканчивается по ад-
ресу 012Ah. Определить размер программы.
-h12a ff
0229 002B (Размер программы 2Bh)
2) В байте записано число FEh. Дополнительным кодом какого числа оно явля-
ется? Расширяем знак до размеров слова
-H0 fffe
fffe 0002 (Дополнительный код –2 есть FEh)
5.2) M область-источник адрес_приемника Move — перемещать
15
Пример. Предположим, мы набрали программу
-a100
11CF:0100 mov ax,1
11CF:0103 add ax,bx
11CF:0105 nop
11CF:0106
и обнаружили, что пропустили команду mov bx,2. Перемещаем часть про-
граммы "подальше". Размер области берем "с запасом".
-m103L20 200
Вводим недостающую команду
-a103
11CF:0103 mov bx,2
11CF:0106
Теперь мы знаем адрес назначения (0106) и перемещаем хвост программы
-m200L20 106
-u100 (проверяем правильность результата) ...
Упражнение. Разработайте последовательность действий, если нужно уда-
лить часть команд программы. О "перекрытии" области-приемника и области-
источника беспокоиться не нужно (проверьте!). |
|
5.3) C область1 адрес_области |
Compare — сравнение |
Выводится таблица в формате |
|
адрес1 байт1 байт2 адрес2 |
|
в том случае, если байт1 не совпадает с байт2.
Упражнение. Придумайте пример. С помощью команды E введите данные в две области памяти (например, две незначительно различающиеся строки) и
сравните содержимое областей с помощью команды C.
5.4) Search — поиск
Список — это список байтов или строка. Debug выдает все адреса байтов или строк, которые совпадают с указанными.
Упражнение. Придумайте примеры. 6) Остальные команды.
6.1) Q |
Quit — завершение |
16
Осуществляется выход из debug. При этом набранные программы и данные теряются, если они предварительно не были сохранены посредством команды
W.
6.2) ? Выводит на экран алфавитный список команд debug.
3.5. Как получить текст программы, набранной в debug.
После отладки внесения необходимых изменений в команды программы хотелось бы получить файл с текстом программы, чтобы добавить в него ком-
ментарии, распечатать и т.д. Можно рекомендовать следующую последователь-
ность действий.
1) Определяем размер программного кода. Если вся программа состоит из чистого кода, как pr1.com, даем команды
D:\USER\>debug pr1.com
-r
и читаем в регистрах BX:CX шестнадцатеричный размер программы. (В нашем случае 9h).
2) Создадим с помощью любого текстового редактора файл (например, pr1.cmd), содержащий команды отладчика:
U100L9
Q
(последнюю команду Q обязательно завершить нажатием Enter). Вновь запуска-
ем debug.
D:\USER\>debug pr1.com < pr1.cmd > pr1.txt
Входная информация поступает из pr1.cmd, выходная направляется в файл pr1.txt. Для этого используются символы > и < (перенаправление операций ввод-вывода).
Остается подправить содержимое файла pr1.txt в редакторе.
Упражнение. В предыдущей главе мы выясняли, какие флаги состояния бу-
дут выставлены центральным процессором при выполнении сложения слов: 2345h + 3219h и 5439h + 456Ah. Проверить правильность сделанных выводов,
используя debug.
