- запросить регистр CX командой: R CX [Return]
- отладчик выдаст на этот запрос CX 0000 (нулевое значение)
- указать длину программы - 6,
- записать измененную программу: W [Return]
В обоих случаях DEBUG выдает сообщение "Writing nnnn bytes." (Запись
nnnn байтов). Если nnnn равно 0, то произошла ошибка при вводе длины
программы, и необходимо повторить запись cнова.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
Отладчик DOS DEBUG это достаточное мощное средство, полезное для
отладки ассемблерных программ. Однако следует быть осторожным с ее
использованием, особенно для команды E (ввод). Ввод данных в неправильные
адреса памяти или ввод некорректных данных могут привести к
непредсказуемым результатам. На экране в этом случае могут появиться
"странные" символы, клавиатура заблокирована или даже DOS прервет DEBUG и
перезагрузит себя с диска. Какие-либо серьезные повреждения вряд ли
произойдут, но возможны некоторые неожиданности, а также потеря данных,
которые вводились при работе с отладчиком.
Если данные, введенные в сегмент данных или сегмент кодов, оказались
некорректными, следует, вновь используя команду E, исправить их. Однако,
можно не заметить ошибки и начать трассиpовку программы. Но и здесь
возможно еще использовать команду E для изменений. Если необходимо начать
выполнение с первой команды, то следует установить в регистре командного
указателя (IP) значение 0100. Введите команду R (register) и требуемый
регистр в следующем виде:
R IP [Return]
Отладчик выдаст на экран содержимое регистра IP и перейдет в ожидание
ввода. Здесь следует ввести значение 0100 и нажать для проверки результата
команду R (без IP). 0тладчик выдаст содержимое регистров, флагов и первую
выполняемую команду. Теперь можно, используя команду T, вновь выполнить
трассировку программы.
Если ваша программа выполняет какие-либо подсчеты, то возможно
потребуется очистка некоторых областей памяти и регистров. Но yбедитесь в
сохранении содержимого регистров CS, DS, SP и SS, которые имеют
специфическое назначение.
Прочитайте в руководстве по DOS главу о программе DEBUG. В настоящий
момент рекомендуется: вводный материал и следующие команды oтладчика: дамп
(D), ввод (E), шестнадцатиричный (H), имя (N), выход (Q), регистры (R),
трассировка (T) и запись (W). Можно oзнакомиться также и с другими
командами и проверить как они работают.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
2.1. Напишите машинные команды для
а) пересылки шест. значения 4629 в регистр AX;
б) сложения шест. 036A с содержимым регистра AX.
2.2. Предположим, что была введена следующая е команда:
E CS:100 B8 45 01 05 25 00
Вместо шест. значения 45 предполагалось 54. Напишите команду E для
корректировки только одного неправильно введенного байта, т.е.
непосредственно замените 45 на 54.
2.3. Предположим, что введена следующая е команда:
E CS:100 B8 04 30 05 00 30 CB
а) Что представляют собой эти команды? (Сравните с первой
программой в этой главе).
б) После выполнения этой программы в регистре AX должно быть
значение 0460, но в действительности оказалось 6004. В чем ошибка и
как ее исправить?
в) После исправления команд необходимо снова выполнить программу
с первой команды. Какие две команды отладчика потребуются?
2.4. Имеется следующая программа в машинных кодах:
B0 25 D0 E0 B3 15 F6 E3 CB
Программа выполняет следующее:
- пересылает шест. значение 25 в регистр AL;
- сдвигает содержимое регистра AL на один бит влево (в
результате в AL будет 4A);
- пересылает шест. значение 15 в регистр BL;
- умножает содержимое регистра AL на содержимое регистра BL.
Используйте отладчик для ввода (E) этой программы по адресу CS:100. Не
забывайте, что все значения представлены в шестнадцатиричном виде. После
ввода программы наберите D CS:100 для просмотра сегмента кода. Затем
введите команду R и необходимое число команд T для пошагового выполнения
программы до команды RET. Какое значение будет в регистре AX в результате
выполнения программы?
2.5. Используйте отладчик для ввода (E) следующей программы в
машинных кодах:
Данные: 25 15 00 00
Машинный код: A0 00 00 D0 E0 F6 26 01 00 A3 02 00 CB
Программа выполняет следующее:
- пересылает содержимое одного байта по адресу DS:00 (25) в
регистр AL;
- сдвигает содержимое регистра AL влево на один бит (получая в
результате 4A);
- умножает AL на содержимое одного байта по адресу DS:01 (15);
- пересылает результат из AX в слово, начинающееся по адресу
DS:02.
После ввода программы используйте команды D для просмотра сегмента
данных и сегмента кода. Затем введите команду R и необходимое число команд
T для достижения конца программы (RET). В этот момент регистр AX должен
содержать результат 0612. Еще раз используйте команду D DS:00 и заметьте,
что по адресу DS:02 значение записано как 1206.
2.6. Для предыдущего задания (2.5) постройте команды для записи
программы на диск под именем TRIAL.COM.
2.7. Используя команду A отладчика, введите следующую про грамму:
MOV BX,25
ADD BX,30
SHL BX,01
SUB BX,22
NOP
RET
сделайте ассемблирование и трассировку выполнения этой программы до
команды NOP.
ГЛАВА 3 Требования языка ассемблер
__________________________________________________________________________
Ц е л ь: показать основные требования к программам на языке
ассемблера и этапы ассемблирования, компановки и выполнения программы.
ВВЕДЕНИЕ
________________________________________________________________
В гл.2 было показано как ввести и выполнить программу на машинном
языке. Несомненно при этом ощутима трудность расшифровки машинного кода
даже для очень небольшой программы. Сомнительно, чтобы кто-либо серьезно
кодировал программы на машинном языке, за исключением разных "заплат"
(корректировок) в программе на языках высокого уровня и прикладные
программы. Более высоким уровнем кодирования является уровень ассемблера,
на котором программист пользуется символическими мнемокодами вместо
машинных команд и описательными именами для полей данных и адресов памяти.
Программа написанная символическими мнемокодами, которые используются
в языке ассемблера, представляет собой исходный модуль. Для формирования
исходного модуля применяют программу DOS EDLIN или любой другой подходящий
экранный редактор. Затем с помощью программы ассемблерного транслятора
исходный текст транслируется в машинный код, известный как объектная
программа. И наконец, программа DOS LINK определяет все адресные ссылки
для объектной программы, генерируя загрузочный модуль.
В данной главе объясняются требования для простой программы на
ассемблере и показаны этапы ассемблирования, компановки и выполнения.
КОММЕНТАРИИ В ПРОГРАММАХ НА АССЕМБЛЕРЕ
________________________________________________________________
Использование комментариев в программе улучшает ее ясность, oсобенно
там, где назначение набора команд непонятно. Комментаpий всегда начинаются
на любой строке исходного модуля с символа точка с запятой (;) и ассемблер
полагает в этом случае, что все символы, находящиеся справа от ; являются
комментарием. Комментарий может содержать любые печатные символы, включая
пробел.
Комментарий может занимать всю строку или следовать за командой на
той же строке, как это показано в двух следующих примерах:
1. ;Эта строка полностью является комментарием
2. ADD AX,BX ;Комментарий на одной строке с командой
Комментарии появляются только в листингах ассемблирования исходного
модуля и не приводят к генерации машинных кодов, поэтому можно включать
любое количество комментариев, не оказывая влияния на эффективность
выполнения программы. В данной книге команды ассемблера представлены
заглавными буквами, а комментарии - строчными (только для
удобочитаемости).
ФОРМАТ КОДИРОВАНИЯ
________________________________________________________________
Основной формат кодирования команд ассемблера имеет следующий вид:
[метка] команда [операнд(ы)]
Метка (если имеется), команда и операнд (если имеется) pазделяются по
крайней мере одним пробелом или символом табуляции. Максимальная длина
строки - 132 символа, однако, большинство предпочитают работать со
строками в 80 символов (соответственно ширине экрана). Примеры
кодирования:
Метка Команда Операнд
COUNT DB 1 ;Имя, команда, один операнд
MOV AX,0 ;Команда, два операнда
Метки
-------
Метка в языке ассемблера может содержать следующие символы:
Буквы: от A до Z и от a до z
Цифры: от 0 до 9
Спецсимволы: знак вопроса (?)
точка (.) (только первый символ)
знак "коммерческое эт" (@)
подчеркивание (-)
доллар ($)
Первым символом в метке должна быть буква или спецсимвол. Ассемблер
не делает различия между заглавными и строчными буквами. Максимальная
длина метки - 31 символ. Примеры меток: COUNT, PAGE25, $E10. Рекомендуется
использовать описательные и смысловые метки. Имена регистров, например,
AX, DI или AL являются зарезервированными и используются только для
указания соответствующих регистров. Например, в команде
ADD AX,BX
ассемблер "знает", что AX и BX относится к регистрам. Однако, в команде
MOV REGSAVE,AX
ассемблер воспримет имя REGSAVE только в том случае, если оно будет
определено в сегменте данных. В прил.3 приведен cписок всех
зарезервированных слов ассемблера.
Команда
---------
Мнемоническая команда указывает ассемблеру какое действие должен
выполнить данный оператор. В сегменте данных команда (или директива)
определяет поле, рабочую oбласть или константу. В сегменте кода команда
определяет действие, например, пересылка (MOV) или сложение (ADD).
Операнд
---------
Если команда специфицирует выполняемое действие, то операнд
определяет а) начальное значение данных или б) элементы, над которыми
выполняется действие по команде. В следующем примере байт COUNTER
определен в сегменте данных и имеет нулевое значение:
Метка Команда Операнд
COUNTER DB 0 ;Определить байт (DB) с нулевым значением
Команда может иметь один или два операнда, или вообще быть без
операндов. Рассмотрим следующие три примера:
Команда Операнд Комментарий
Нет операндов RET ;Вернуться