1. Цель работы: Ознакомиться с практическим применением программы – отладчика на примере DEBUG .
2. Литература:
Электронное описание лабораторной работы.
Приложение к лабораторной работе.
Конспект лекций по предмету.
3. Состав оборудования:
Компьютер типа IBM PC/AT.
4. Техника безопасности:
Не включать оборудование не прочитав описания к работе и не получив допуск к работе;
Когда машина включена, запрещается касаться ее корпуса и корпусов другого оборудования или заземления одновременно;
Запрещается закрывать дверцы дисководов без дискеты, а также вставлять туда посторонние предметы или диски, не используемые в процессе выполнения задач по работе;
Не следует закрывать вентиляционные отверстия в корпусе оборудования, во избежание его перегрева;
При работе в системе или оболочке запрещается запуск посторонних программ или изменение информации, содержащейся на винчестере;
С клавиатурой ЭВМ должен работать только один человек;
= ЗАПРЕЩАЕТСЯ = нажимать какие либо кнопки на корпусе компьютера, а так же на корпусе принтера не прочитав перед этим описание;
При “зависании” рабочей программы, системы или машины в целом следует пригласить преподавателя, зав. мастерской, техника или лаборанта для устранения неисправности;
При запахе гари или появлении дыма следует
прекратить работу и сообщить об этом преподавателю, зав. мастерской,
технику или лаборанту.
5. Подготовка к работе:
Изучить теоретический материал.
Ответить на следующие вопросы допуска к работе:
6. Порядок выполнения работы.
В четвертой теме мы рассмотрели алгоритм вывода на экран двоичных
чисел. Потребность в двоичном числовом формате возникает крайне редко.
Но метод, используемый для вывода двоичных чисел, можно использовать и
с другими числовыми форматами.
В последней теме был рассмотрен флаг переноса CF. В распечатке
регистров он представлен значениями NC или CY. Кроме CF листинг
регистров отображает значения еще семи флагов:
NV UP EI PL NZ NA PO NC
В ближайшее время нам потребуются три флага: ZF, SF, OF. Эти флаги хранят состояние, или статус последней арифметической операции.
Все флаги однобитовые, и могут находится в двух состояниях: "1" - установлен; "0" - сброшен.
i ZR (Zero) - ноль 2h - 2h = 0000h (ZR)
ZF i 2h + 2h = 0004h (NZ)
i NZ (Not Zero) - не ноль 2h - 3h = FFFFh (NZ)
i NG (Negative) - минус 0003h - 0009h = FFFAh (-6h) (NG)
SF i 0003h + 0007h = 000Ah (PL)
i PL (Plus) - плюс 7000h + 2000h = 9000h (-7000h) (NG)
i OV (Overflow) 7000h + 2000h = 9000h (-7000h) (OV)
OF i 6000h + 1000h = 7000h (NV)
i NV (Not Overflow) 7000h - 8000h = F000h (-1000h) (OV)
Придумайте несколько примеров для установки и сброса флагов: ZF,
SF, OF.
Очень часто в программе требуется выполнять переход на несколько инструкций вперед или назад. Например, программа печати двоичных чисел содержит инструкцию LOOP, которая 8 раз возвращает управление на 4 шага назад. Но существуют и другие варианты переходов:
Например, используем инструкцию JNZ для вывода на экран строки из девяти звездочек:
0ABD:0100 B402 |
![]() |
MOV AH,02 загружаем функцию печати символа |
Программа содержит условный переход на адрес 106. Перед инструкцией
JNZ выполняется
уменьшение регистра CL на 1. Когда CL достигнет нуля, произойдет
установка флага нуля, и
инструкция JNZ передаст управление прерыванию INT 20h.
Используя трассировку программы, проанализируйте действия инструкции
JNZ.
Задачи:
| Символ | ASCII код |
| 0 | 30h |
| 1 | 31h |
| 2 | 32h |
| 3 | 33h |
| 4 | 34h |
| 5 | 35h |
| 6 | 36h |
| 7 | 37h |
| 8 | 38h |
| 9 | 39h |
| : | 3Ah |
| ; | 3Bh |
| < | 3Ch |
| = | 3Dh |
| > | 3Eh |
| ? | 3Fh |
| @ | 40h |
| A | 41h |
| B | 42h |
| C | 43h |
| D | 44h |
| E | 45h |
| F | 46h |
Ранее мы рассмотрели алгоритм вывода на экран цифр 0 и 1, где код символа формировался сложением соответствующей цифры с числом 30h. Аналогичный метод можно применить для вывода на экран шестнадцатеричных чисел.
Из таблицы ASCII кодов видно, что коды
символов "0" ... "9" можно получить сложением 30h с соответствующим
числом:
30h + 9h = 39h (код символа "9").
Коды символов "A" ... "F" формируются
аналогично,
только вместо числа 30h используется число 37h:
37h + Dh = 44h (код символа "D").
Для вывода на экран шестнадцатеричных чисел, нам потребуются две новые инструкции:
Следующая программа выводит на экран одноразрядное шестнадцатеричное число из регистра BL:
0ABD:0100 B30E |
![]() |
MOV BL,0E исходное число |
В программе выполняется проверка кода
символа:
- если код меньше чем 3Ah (диапазон символов "0" ... "9"), то переходим
к печати символа;
- иначе, корректируем код (смещаемся в диапазон "A" ... "F"), и
печатаем символ.
Загружая в регистр BL числа от 0 до F,
выполните трассировку программы. Посмотрите, как изменяет флаги
инструкция CMP. Проанализируйте действия инструкции JL.
Последняя программа корректно работает с числами: 0 ... F. Например, загрузите в BL число 3Eh и выполните программу. Вместо ожидаемого результата "3E", вы получите букву "u".
Изменим программу так, чтобы она печатала любые числа от 0 до FFh. Для этого нам надо научиться выделять старшую и младшую цифры двузначного шестнадцатеричного числа.
Каждая цифра шестнадцатеричного числа занимает четыре бита. Для выделения четырех бит старшей цифры мы используем инструкцию SHR:
Например, необходимо выделить старшую цифру числа B9h:

Исходное число загружаем в регистр DL.
Все восемь бит числа сдвигаем вправо,
через флаг переноса.

Число, после сдвига на четыре бита вправо:
(в освободившиеся ячейки регистра DL загружаются нули)
Программная реализация сдвига состоит из двух строк:
MOV CL,4 сдвиг на 4 бита
SHR DL,CL число в регистре DL сдвигается вправо на 4 бита
К сожалению Debug не позволяет указывать шаг сдвига непосредственно в инструкции, например: SHR DL,4 или RCL DL,4. Этот формат мы используем позже, при написании компилируемых ассемблерных программ.
Добавим логический сдвиг в программу печати шестнадцатеричной цифры:
0ABD:0100 B3B9 MOV BL,B9 загружаем исходное число
0ABD:0102 88DA MOV DL,BL копируем исходное число в DL
0ABD:0104 B402 MOV AH,02 загружаем функцию печати символа
0ABD:0106 B104 MOV CL,04 загружаем шаг сдвига
0ABD:0108 D2EA SHR DL,CL сдвигаем число в DL на CL бит вправо
0ABD:010A 80C230 ADD DL,30 формируем код символа
0ABD:010D 80FA3A CMP DL,3A определяем диапазон символа
0ABD:0110 7C03 JL 0115 если диапазон "0"..."9", то переход
0ABD:0112 80C207 ADD DL,07 иначе, корректируем код
0ABD:0115 CD21 INT 21 печатаем символ
0ABD:0117 CD20 INT 20
Регистр BL не принимает участия в программе, его задача - сохранить копию числа для вывода на экран младшей цифры.
Выполните программу c разными исходными числами. Убедитесь,
что на экран выводится старшая цифра шестнадцатеричного числа.
В предыдущем разделе мы освоили печать старшей цифры двузначного шестнадцатеричного числа. Остается освоить печать младшей цифры и объединить две программы в одну.
Для выделения четырех бит младшей цифры двузначного шестнадцатеричного числа, нужно обнулить четыре бита старшей цифры. Для обнуления заданной последовательности бит, мы используем инструкцию AND (логическое умножение двух чисел).
Рассмотрим все варианты логического умножения чисел 1 и 0:
0 AND 1 = 0 0 AND 0 = 0 1 AND 0 = 0 1 AND 1 = 1
Аналогично выглядит логическое умножение восьмиразрядных двоичных чисел:
10110101 10110110
AND 01110110 AND 00100101
00110111 00100100
Логическое умножение байта на маску 0Fh, позволяет обнулить старшую половину байта:
10111001 B9h
AND 00001111 U AND 0Fh
00001001 09h
Используем это свойство для вывода на экран младшей цифры шестнадцатеричного числа:
0ABD:0100 B3B9 MOV BL,B9 загружаем исходное число
0ABD:0102 88DA MOV DL,BL копируем исходное число в DL
0ABD:0104 B402 MOV AH,02 загружаем функцию печати символа
0ABD:0106 80E20F AND DL,0F обнуляем старшую половину байта
0ABD:0109 80C230 ADD DL,30 формируем код символа
0ABD:010C 80FA3A CMP DL,3A определяем диапазон символа
0ABD:010F 7C03 JL 0114 если диапазон "0"..."9", то переход
0ABD:0111 80C207 ADD DL,07 иначе, корректируем код
0ABD:0114 CD21 INT 21 печатаем символ
0ABD:0116 CD20 INT 20
Выполните программу c разными исходными числами. Убедитесь, что на экран выводится младшая цифра шестнадцатеричного числа.
Объединив два фрагмента кода, мы получим программу печати шестнадцатеричного байта:
0ABD:0100 B402 MOV AH,02
0ABD:0102 88DA MOV DL,BL
0ABD:0104 B104 MOV CL,04
0ABD:0106 D2EA SHR DL,CL
0ABD:0108 80C230 ADD DL,30
0ABD:010B 80FA3A CMP DL,3A
0ABD:010E 7C03 JL 0113
0ABD:0110 80C207 ADD DL,07
0ABD:0113 CD21 INT 21
0ABD:0115 88DA MOV DL,BL
0ABD:0117 80E20F AND DL,0F
0ABD:011A 80C230 ADD DL,30
0ABD:011D 80FA3A CMP DL,3A
0ABD:0120 7C03 JL 0125
0ABD:0122 80C207 ADD DL,07
0ABD:0125 CD21 INT 21
0ABD:0127 CD20 INT 20
В приведенном листинге нет загрузки исходного числа в регистр
BL. Это делает программу более универсальной. Для ввода чисел в регистр
используйте команду "R".
Задачи:
7. Содержание отчета:
8. Вопросы зачета: