Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Использование стандартного отладчика debug.exe
Использование стандартного отладчика debug.exe
Сегодня мы рассмотрим стандартный отладчик debug.exe, входящий в любую версию DOS/Windows. Должен заметить, что этот отладчик не такой мощный, как гиганты SoftICE или Turbo Debugger. Однако, в то же время debug.exe очень прост и доступен, и просто идеально подходит для начинающих программистов на языке Ассемблер. Итак, запускаем debug.exe (для этого заходим в Пуск->Выполнить и выполняем команду debug) и начинаем изучать этот замечательный отладчик
Команды debug.exe
Для начала разберемся с правилами набора команд debug.exe:
· В debug.exe не различается регистр букв.
· Пробелы в командах используется только для разделения параметров.
· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.
· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого - 40[0]h).
Разобравшись с правилами, давайте перейдем к изучению команд debug.exe. Замечу, что работа с командами debug.exe в чем-то похожа на работу с командной строкой DOS. Поcле загрузки отладчика на экране появится приглашение, выглядещее в виде дефиса:
Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы, а рабочая области в памяти будет начинаться с адреса этого префикса + 100h. Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.
Краткая таблица всех команд debug.exe
Команда
| Описание
| Формат
| A (Assemble)
| Транслирование команд ассемблера в машинный код; адрес по умолчанию - CS:0100h.
| A [<адрес_начала_кода>]
| C (Compare)
| Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов.
| C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
| D (Display/Dump)
| Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон.
| D [<начальный_адрес> [L<длина>]] D [начальный_адрес конечный_адрес]
| E (Enter)
| Ввод в память данные или инструкции машинного кода; по умолчанию используется DS.
| E [<адрес> [<инструкции/данные>]]
| F (Fill)
| Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон.
| F <начальный_адрес_1> L<длина> '<данные>' F <начальный_адрес> <конечный_адрес> '<данные>'
| G (Go)
| Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес.
| G [=<начальный_адрес>] <адрес_останова> [<адрес_останова>...]
| H (Hexadecimal)
| Вычисление суммы и разности двух шестнадцатеричных величин.
| H <величина_1> <величина_2>
| I (Input)
| Считывание и вывод одного байта из порта.
| I <адрес_порта>
| L (Load)
| Загрузка файла или данных из секторов диска в память; по умолчанию - CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe.
| L [<адрес_в_памяти_для_загрузки>] L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]]
| M (Move)
| Копирование содержимого ячеек памяти; по умолчанию используется DS. Можно указывать как длину, так и диапазон.
| M <начальный_адрес> L<длина> <адрес_назначения> M <начальный_адрес> <конечный_адрес> <адрес_назначения>
| N (Name)
| Указание имени файла для команд L и W.
| N <имя_файла>
| O (Output)
| Отсылка байта в порт.
| O <адрес_порта> <байт>
| P (Proceed)
| Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции с префиксами REPnn, переходя к следующей инструкции.
| P [=<адрес_начала>] [<количество_инструкций>]
| Q (Quit)
| Завершение работы debug.exe.
| Q
| R (Register)
| Вывод содержимого регистров и следующей инструкции.
| R <имя_регистра>
| S (Search)
| Поиск в памяти символов из списка; по умолчанию используется DS. Можно указывать как длину, так и диапазон.
| S <начальный_адрес> L<длина> '<данные>' S <начальный_адрес> <конечный_адрес> '<данные>'
| T (Trace)
| Пошаговое выполнение программы. Как и в команде P, по умолчанию используется пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P.
| T [=<адрес_начала>] [<количество_выполняемых_команд>]
| U (Unassemble)
| Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению, debug.exe некорректно дизассемблирует специфические команды процессоров 80286+, хотя они все равно выполняются корректно.
| U [<начальный_адрес>] U [<начальный_адрес конечный_адрес>]
| W (Write)
| Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если он не был загружен. А программы записываются только в виде файлов.COM!
| W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]]
| Примечание. Символами [] отмечены необязательные параметры.
Просмотр областей памяти
В этой части нашей статьи мы рассмотрим подробно работу команды D, позволяющей просматривать содержимое отдельных областей памяти. Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240:
-d 0159:0240
0159:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00..........l.....
0159:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
0159:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
0159:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
0159:0280 00 00 00 00 00 00 00 00-00 FF FF FF FF 00 00 00................
0159:0290 FF 00 00 00 00 00 00 00-00 00 4E 4F 20 4E 41 4D..........NO NAM
0159:02A0 45 20 20 20 20 00 26 81-4F 03 00 01 CB 00 00 00 E.&.O.......
0159:02B0 00 00 00 00 00 00 00 00-00 00 00 01 07 04 FF 02................
-_
Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:
· Адрес первого слева показанного байта в формате сегмент:смещение.
· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.
· Символы этого же параграфа в ASCII-формате.
Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегяая вычисление адресов байтов в параграфе.
Итог
А теперь, после небольшого обзора возможностей стандартного отладчика debug.exe давайте подведем итоги. Итак:
· debug.exe можно применять для наблюдений и отладки программ на ассемблере и машинных кодах.
· debug.exe позволяет трассировать программу, устанавливать точки останова, просматривать области памяти, вводить программы непосредственно в память компьютера.
· debug.exe представляет загружаемые программы как программы .COM.
· debug.exe воспринимает только числа в шестнадцатеричной системе.
· debug.exe не различает регистр букв.
Лабораторная работа № 1
Тема: «Отладчик DEBUG».
Краткая аннотация: данная работа посвящена знакомству с отладчиком DEBUG, который позволяет:
- набирать небольшие фрагменты ассемблерного кода;
- выполнять трассировку фрагментов кода;
- отслеживать состояние регистров процессора и ячеек оперативной памяти в процессе трассировки;
- тестировать, корректировать, отлаживать набранные в отладчике или загруженные в отладчик фрагменты кода;
- сохранять на диске (в виде исполняемых файлов com-типа) и загружать в отладчик фрагменты кода.
Студент должен освоить макрокоманды отладчика DEBUG, научиться набирать, тестировать, трассировать небольшие фрагменты кода (в пределах 10-20 ассемблерных команд).
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей
ЦЕЛЬ: Знакомство с макрокомандами отладчика, процедурами набора, выполнения и трассировки фрагментов ассемблерного кода.
Лабораторная работа № 2
Тема: «Микропроцессор i8086: способы адресации на примере простейших команд».
Краткая аннотация: данная работа посвящена знакомству с важнейшими способами адречации микропроцессора на примере простейших команд. К числу этих важнейших способов адресации относятся:
- прямая адресация;
- косвенная адресация.
Студент должен освоить важнейшие способы адресации процессора, научиться применять их для простейших команд процессора.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей
ЦЕЛЬ: Знакомство со способами адресации микропроцессора i8086 на примере простейших команд.
Введение.
Лабораторная работа № 3
Тема: «Ассемблер i8086: типовые примеры».
Краткая аннотация: данная работа посвящена знакомству с типовыми примерами, выполненными с использованием команд ассемблера i8086. Перечень тем рассматриваемых ниже примеров таков:
- копирование ячеек указанного диапазона;
- занесение в ячейки указанного диапазона заданного ряда чисел;
- поиск и замена образцов указанного диапазона;
- подсчёт количества образцов указанного диапазона;
- суммирование содержимого ячеек заданного диапазона;
- нахождение минимального значения в заданном диапазоне;
- нахождение максимального значения в заданном диапазоне.
Студент должен освоить типовые примеры. Последнее означает:
- умение выполнять ручную трассировку ассемблерного кода для диапазона из 3-4 ячеек;
- умение составлять ассемблерный код для 2-х диапазонов.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.
ЦЕЛЬ: Знакомство с простейшими типовыми примерами ассемблерных программ.
Студент должен освоить типовые примеры. Последнее означает:
- умение выполнять ручную трассировку ассемблерного кода для диапазона из 3-4 ячеек;
- умение составлять ассемблерный код для 2-х диапазонов.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.
Типовые примеры ассемблерных программ.
В данной лабораторной работе собраны 7 простейших типовых программ-примеров:
- Копирование ячеек указанного диапазона.
- Занесение в ячейки указанного диапазона заданного ряда чисел.
- Поиск и замена образцов указанного диапазона.
- Подсчёт количества образцов указанного диапазона.
- Суммирование содержимого ячеек заданного диапазона.
- Нахождение минимального значения в заданном диапазоне.
- Нахождение максимального значения в заданном диапазоне.
К разряду простейших эти примеры отнесены по простой причине: ни в одном из них не требуется выводить символы на экран. Во всех случаях действия осуществляются с числами, располагающимися в ячейках оперативной памяти. Во всех случаях просмотр результатов предполагает использование отладчика DEBUG. Все рассматриваемые программы-примеры собраны в рабочей папке, где хранятся файлы описания данной лабораторной работы. Для загрузки этих файлов следует вспомнить раздел 1-ой лабораторной работы, в котором речь идёт о работе с файлами.
Команды, используемые в типовых примерах.
INT 20— команда, завершающая работу программы, размещённой в файле com-типа
INC Operand — увеличение значения операнда Operand на единицу (+1)
LOOP adress — команда цикла (CX<-CX-1, после чего, если CX<>0- переход на adress)
CMP Opr_1,Opr_2 — сравнение левого и правого операндов Opr_1 и Opr_2
JNZ adress — условный переход, если результат сравнения Opr_1 ≠ Opr_2
JBE adress — условный переход, если результат сравнения Opr_1 ≤ Opr_2
JAE adress — условный переход, если результат сравнения Opr_1 ≥ Opr_2
ADC Opr_1,0 — увеличение значения операнда Opr_1 на единицу, если Carry Flag = 1
|
Типовой пример №1.
Копирование ячеек заданного диапазона:
УСЛОВИЕ ЗАДАНИЯ:
Скопировать содержимое ячеек диапазона 130..13F в диапазон,
начинающийся с адреса 150. (все данные в 16-ой системе)
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса диапазона-источника= 130,
стартового адреса диапазона-приёмника= 150,
числа шагов цикла= 10).
(все данные в 16-ой системе)
Примечание. Расчет значения счетчика цикла:
CX= (13F - 130) + 1 = F + 1 = 10
(расчёты в 16-ой системе)
2. Организация цикла: AL <- [SI]
[DI]<- AL
(последовательное копирование содержимого
ячеек 130,131,132,...,13F
в ячейки 150,151,152,...,15F соответственно)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV SI,0130; SI <- 130 (стартовый адрес диапазона-источника= 130)
103 MOV DI,0150; DI <- 150 (стартовый адрес диапазона-приёмника= 150)
106 MOV CX,0010; CX <- 10 (число шагов цикла = размеру дипазона = 10)
; цикл по перебору ячеек диапазона:
109 MOV AL,[SI]; AL <- [SI] (копирование в регистр AL содержимого очередной ячейки диапазона)
10B MOV [DI],AL; [DI] <- AL (размещение в очередной ячейке диапазона-приёмника содержимого AL)
10D INC SI; SI <- SI + 1 (наращивание адреса диапазона-источника: +1)
10E INC DI; DI <- DI + 1 (наращивание адреса диапазона-приёмника: +1)
10F LOOP 109; CX <- CX-1 После чего, если CX <> 0 - переход по адресу 109
111 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
Кроме того, будем считать, что изначально в ячейках 130..132
находятся следующие числа:
[130] = 10 [131] = 11 [132] = 12
100: SI = 130
103: DI = 150
106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
109: AL = [130] = 10
10B: [150]= AL= 10 (содержимое 1-ой ячейки скопировано)
10D: SI= 130+1= 131
10E: DI= 150+1= 151
10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109)
109: AL= [131]= 11
10B: [151] = AL = 11 (содержимое 2-ой ячейки скопировано)
10D: SI= 131+1= 132
10E: DI= 151+1= 152
10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109)
109: AL= [132]= 12
10B: [152]= AL = 12 (содержимое 3-ей ячейки скопировано)
10D: SI= 132+1= 133
10E: DI= 152+1= 153
10F: CX= 1-1= 0 (CX= 0, поэтому цикл заканчивается)
111: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
[150]= 10 [151]= 11 [152]= 12
| Типовой пример №2.
Заполнение ячеек заданного диапазона указанным рядом чисел:
УСЛОВИЕ ЗАДАНИЯ:
Ввести в ячейки с адреса 120 числа 7,B,...,FF (все данные в 16-ой системе)
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(начального числа= 7,
стартового адреса= 120,
числа шагов цикла= 3F).
Примечание. Расчет значения счетчика цикла:
CX= (FF-7):4 + 1 = F8:4+1= 3E+1= 3F
2. Организация цикла: [DI]<- AL
(последовательное заполнение ячеек 120,121,122,... числами 7,B,F,...,FF)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV AL,07; AL<- 7 (начальное число = 7)
102 MOV DI,0120; DI<- 120 (стартовый адрес = 120)
105 MOV CX,003F; CX<- 3F (число шагов цикла= 3F)
; цикл по перебору ячеек диапазона:
108 MOV [DI],AL; [DI]<- AL (размещение в очередной ячейке памяти очередного числа)
10A ADD AL,04; AL<- AL+4 (наращивание числа: +4)
10C ADD DI,0001; DI<- DI+1 (наращивание адреса: +1)
10F LOOP 108; CX<- CX-1 После чего, если CX<>0, следует переход по адресу 108
111 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
100: AL= 7
102: DI= 120
105: CX= 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
108: [120]= 7
10A: AL= 7+4= B
10C: DI= 120+1= 121
10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: [123]= B
10A: AL= B+4= F
10C: DI= 121+1= 122
10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: [126]= F
10A: AL= F+4= 13
10C: DI= 122+1= 123
10F: CX= 1-1= 0 (CX= 0, цикл завершен)
111: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
[120]= 7 [123]= B [126]= F
| Типовой пример №3.
Поиск и замена образца в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Просмотреть ячейки 120..16F и заменить символ "9" символом "5".
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений до начала цикла
(стартового адреса= 120,
ASCII-кода символа "5"= 35,
ASCII-кода символа "9"= 39,
числа шагов цикла= 50).
Примечание. Расчет значения счетчика цикла:
CX= (16F-120)+ 1 = 4F+1= 50
2. Организация цикла: [DI]<->AH
(последовательная проверка ячеек с целью поиска в них числа 39,
заполнение очередной ячейки кодом 35, если найден символ "9",
наращивание содержимого регистра DI)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV DI,0120; DI<- 120
103 MOV AL,35; AL<- 35
105 MOV AH,39; AH<- 39
107 MOV CX,0050; CX<- 50
; цикл по перебору ячеек диапазона:
10A CMP [DI],AH;[DI]<->AH
10C JNZ 0110; переход, если "Not Zero" (не равное 0 значение)
10E MOV [DI],AL; [DI]<- AL (AL= 35)
110 INC DI; DI<- DI+1
111 LOOP 010A; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
113 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 120-122 разместим строку "193"
100: DI = 120
103: AL = 35
105: AH = 39
107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
10A: [120]= 31<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 120+1= 121
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А)
10A: [121]= 39<->39 Равно, т.е. имеет место "Zero"
10C: переход на адрес 110 не следует, т.к. имеет место "Zero"
10E: [121]= 35
110: DI= 121+1= 122
111: CX= 2-1= 1 (CX=1> 0, поэтому следует переход на адрес 10А)
10A: [122]= 33<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 122+1= 123
111: CX= 1-1= 0 (CX=0, цикл завершен)
113: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейках 120-122 находятся символы "153"
| Типовой пример №4.
Подсчёт количества образцов в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Подсчитать количество символов «9» в диапазоне ячеек 120..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений до начала цикла
(стартового адреса= 120,
ASCII-кода символа "5"= 35,
счётчика образцов= 0,
числа шагов цикла= 50).
Примечание. Расчет значения счетчика цикла:
CX= (16F-120)+ 1 = 4F+1= 50
2. Организация цикла: [DI]<->AH
(последовательная проверка ячеек с целью поиска в них числа 39,
наращивание значения счётчика образцов, если найден символ "9",
наращивание содержимого регистра DI)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV DI,0120; DI<- 120
103 MOV AL,0; AL<- 0
105 MOV AH,39; AH<- 39
107 MOV CX,0050; CX<- 50
; цикл по перебору ячеек диапазона:
10A CMP [DI],AH;[DI]<->AH
10C JNZ 0110; переход, если "Not Zero" (не равное 0 значение)
10E INC AL; AL<- AL+1
110 INC DI; DI<- DI+1
111 LOOP 010A; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
113 MOV [170],AL; сохранение найденного количества образцов
116 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 120-122 разместим строку "193"
100: DI = 120
103: AL = 0
105: AH = 39
107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
10A: [120]= 31<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 120+1= 121
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А)
10A: [121]= 39<->39 Равно, т.е. имеет место "Zero"
10C: переход на адрес 110 не следует, т.к. имеет место "Zero"
10E: AL= 0+1= 1 (один образец найден)
110: DI= 121+1= 122
111: CX= 2-1= 1 (CX=1> 0, поэтому следует переход на адрес 10А)
10A: [122]= 33<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 122+1= 123
111: CX= 1-1= 0 (CX=0, цикл завершен)
113: [170]= 1 (сохранение количества найденных образцов)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено число 1
| Типовой пример №5.
Суммирование содержимого ячеек заданного диапазона:
УСЛОВИЕ ЗАДАНИЯ:
Просуммировать содержимое ячеек 140..157. Результат сохранить в ячейках, начиная с ячейки 170
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 18,
начального значения суммы= 0).
2. Организация цикла: (ADD AL,[BP])и(ADC AH,00)
(последовательное добавление содержимого ячеек 140..157 к накапливаемой сумме)
3. Сохранение найденной суммы (в ячейках памяти 0170 и 0171: [170]=AL [171]=AH).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV AX,0000; в регистре AX накапливаться сумма, поэтому AX = 0
103 MOV BP,0140; в регистр BP заносится стартовый адрес ячеек диапазона
106 MOV CX,0018; в регистр CX заносится количество ячеек диапазона
; цикл по перебору ячеек диапазона:
109 ADD AL,[BP]; добавление к содержимому AL содержимого ячейки [BP]
10C ADC AH,00; добавление 1, если регистр AL оказался переполненным
10F INC BP; наращивание значения указателя адресов BP
110 LOOP 109; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
112 MOV [170],AX; сохранение в ячейках 170 и 171 найденной суммы
115 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим числа 7A, D9, E6.
100: AX = 0
103: BP = 140
106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
109: AL= AL+[140]= 0+7A= 7A (кроме того, Carry Flag CF= 0)
10C: AH= AH+0+CF= 0+0+0= 0
10F: BP= 140+1= 141
110: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109)
109: AL= AL+[141]= 7A+D9= 53 (кроме того, Carry Flag CF= 1)
10C: AH= AH+0+CF= 0+0+1= 1
10F: BP= 141+1= 142
110: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109)
109: AL= AL+[142]= 53+E6= 39 (кроме того, Carry Flag CF= 1)
10C: AH= AH+0+CF= 1+0+1= 2
10F: BP= 142+1= 143
110: CX= 1-1= 0 (CX=0, цикл завершён)
112: [170]= AL= 39 [171]= AH= 2 (найденная сумма= 239)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено число 39, в ячейку 171 число 2.
| Типовой пример №6.
Поиск минимального значения в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Определить минимальное число диапазона 140..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 30,
начального значения минимума= FF).
2. Организация цикла: (CMP DL,[BP+00]) (последовательное сопоставление
содержимого ячеек 140..16F с текущим минимумом)
3. Сохранение найденного минимума (в ячейке памяти 0170: [170]=DL).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV BP,0140; загрузка в регистр BP начального адреса
103 MOV CX,0030; в регистр CX заносится количество ячеек диапазона
106 MOV DL,FF; в регистр DL заносится FF (начальное значение min)
; цикл по нахождению минимального значения:
108 CMP DL,[BP]; текущий min DL сравнивается с содержимым очередной яч-ки
10B JBE 0110; если текущий min DL ≤ [BP]имеет место переход на 110
10D MOV DL,[BP]; обновление текущего min DL (знач-е [BP] оказалось меньше)
110 INC BP; наращивание адреса текущей ячейки памяти
111 LOOP 0108; цикл по перебору ячеек памяти
113 MOV [170],DL; сохранение в ячейке 170 найденного минимума
117 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим строку "391"
100: BP = 140
103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
106: DL = FF (начальное значение min)
108: DL<->[BP] FF<->[140]=33 Результат сравнения > (больше)
10B: переход на адрес 110 не следует, т.к. имеет место > (больше)
10D: DL= [140]= 33 обновление текущего min DL
110: DI= 140+1= 141
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[141]=39 Результат сравнения < (меньше)
10B: переход на адрес 110, т.к. условие переходы выполнено
110: DI= 141+1= 142
111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[142]=31 Результат сравнения > (больше)
10B: переход на адрес 110 не следует, т.к. имеет место > (больше)
10D: DL= [142]= 31 обновление текущего min DL
110: DI= 142+1= 143
111: CX= 1-1= 0 (CX=0, цикл завершён)
113: [170]= DL= 31 (сохранение найденного min)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено значение минимума 31
| Типовой пример №7.
Поиск максимального значения в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Определить максимальное число диапазона 140..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 30,
начального значения максимума= 0).
2. Организация цикла: (CMP DL,[BP+00]) (последовательное сопоставление
содержимого ячеек 140..16F с текущим максимумом)
3. Сохранение найденного максимума (в ячейке памяти 0170: [170]=DL).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV BP,0140; загрузка в регистр BP начального адреса
103 MOV CX,0030; в регистр CX заносится количество ячеек диапазона
106 MOV DL,0; в регистр DL заносится 0 (начальное значение max)
; цикл по нахождению максимального значения:
108 CMP DL,[BP]; текущий max DL сравнивается с содержимым очередной яч-ки
10B JAE 0110; если текущий max DL ≥ [BP]имеет место переход на 110
10D MOV DL,[BP]; обновление текущего max DL (знач-е [BP] оказалось больше)
110 INC BP; наращивание адреса текущей ячейки памяти
111 LOOP 0108; цикл по перебору ячеек памяти
113 MOV [170],DL; сохранение в ячейке 170 найденного максимума
117 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим строку "319"
100: BP = 140
103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
106: DL = 0 (начальное значение max)
108: DL<->[BP] 0<->[140]=33 Результат сравнения < (меньше)
10B: переход на адрес 110 не следует, т.к. имеет место < (меньше)
10D: DL= [140]= 33 обновление текущего max DL
110: DI= 140+1= 141
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[141]=31 Результат сравнения > (больше)
10B: переход на адрес 110, т.к. условие переходы выполнено
110: DI= 141+1= 142
111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[142]=39 Результат сравнения < (меньше)
10B: переход на адрес 110 не следует, т.к. имеет место < (меньше)
10D: DL= [142]= 39 обновление текущего max DL
110: DI= 142+1= 143
111: CX= 1-1= 0 (CX=0, цикл завершён)
113: [170]= DL= 39 (сохранение найденного max)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено значение минимума 39
| Задания к лабораторной работе:
Выполнить следующие задания:
- Изучить содержание лабораторной работы (в часы самоподготовки).
- Повторить выполнение разобранных в работе программ (в часы самоподготовки).
- Выполнить проверку решения типового задания "Подсчитать количество символов "7" в диапазоне ячеек 140..17E. Результат сохранить в ячейке 134". Проверку выполнить для первых 3-х ячеек диапазона ([140]= 34;[141]= 37;[142]= 36).
- В диапазоне ячеек памяти 140-173 заменить все заглавные буквы "В", встречающиеся в этом диапазоне на строчные "в", а в диапазоне 174-183 определить максимальное значение, сохранив результат в ячейке 184.
- Выполнить проверку решения типового задания "Просуммировать содержимое ячеек 143..157. Результат сохранить в ячейках, начиная с ячейки 140". Проверку выполнить для первых 4-х ячеек диапазона ([143]= AD;[144]= BC;[145]= FE;[146]= ED).
- Скопировать содержимое ячеек диапазона 130-149 в диапазон, начинающийся адресом 150, а в диапазоне 16А-180 определить минимальное значение, сохранив результат в ячейке 181
- Выполнить проверку решения типового задания "Определить минимальное число диапазона 141..16F. Результат сохранить в ячейке 140". Проверку выполнить для первых 3-х ячеек диапазона ([141]= 34;[142]= 37;[143]= 32).
- Занести в ячейки диапазона 140-149 числа 2, 6, A, …, а в диапазоне 15А-177 определить количество символов "6", сохранив результат в ячейке 181.
| РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА:
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с.
2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с.
3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с.
4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998.
6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672
7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000.
8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400
9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с.
10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с.
11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с.
12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C.
13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с.
14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.
|
Лабораторная работа № 4
Тема: «Функции ввода и вывода строк прерывания INT 21h».
Краткая аннотация: данная работа посвящена знакомству с функциями ввода/вывода строк, что предполагает, в частности:
- знакомство с 9-ой и 10-ой функциями прерывания INT 21h;
- знакомство с форматом выводимой на экран строки;
- знакомство со структурой буфера вводимой с клавиатуры строки;
- знакомство с приёмами обработки введённой с клавиатуры строки.
Студент должен освоить приёмы использования функций ввода/вывода строк.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей.
ЦЕЛЬ: Знакомство с функциями ввода/вывода строк и приёмами использования возможностей этих функций.
Вывод строк.
Краткое описание функции вывода строк прерывания INT 21h:
Вывод строки на экран монитора осуществляется с помощью 9-ой функции прерывания 21h операционной системы MS DOS.
В регистре DX задаётся адрес выводимой строки. Ограничителем символов выводимой строки является знак $ (ASCII-код знака $ равен 24h).
В регистре AH задаётся номер функции прерывания 21h: 9-ая функция.
| Программная реализация вывода строки в отладчике DEBUG:
Программа, реализующая вывод строки, имеет вид:
Вводим строку, начиная с адреса 140:
Введённая строка располагается в памяти следующим образом:
Запускаем программу, обеспечивающую вывод строки @ABCDEFG на экран.
|
Ввод строк.
Краткое описание функции ввода строки с клавиатуры (прерывание INT 21h):
Ввод строки с клавиатуры осуществляется с помощью 10-ой (Ah) функции прерывания 21h операционной системы MS DOS.
В регистре DX задаётся адрес буфера вводимой строки. Ограничитель количества вводимых с клавиатуры символов строки вносится в первую ячейку буфера.
Количество вводимых с клавиатуры символов на 1 меньше значения ограничителя.
В регистре AH задаётся номер функции прерывания 21h: 10-ая (Ah) функция.
| Программная реализация ввода строки в отладчике DEBUG:
Программа, реализующая ввод строки, имеет вид:
Вводим значение ограничителя на количество вводимых с клавиатуры символов строки в ячейку памяти с адресом 150:
Введённое значение (4 символа) располагается в памяти следующим образом:
Запускаем программу, введя в ходе её работы значение ABC с клавиатуры:
По завершении работы программы просматриваем содержимое ячеек оперативной памяти:
|
Ввод и вывод строк.
Задача. Запросить имя. Ввести это имя. Вывести именное приветствие.
Программа, представляющая собою решение задачи, имеет вид:
-u 100 135
0CE7:0100 BA 40 01 MOV DX,0140 0CE7:0103 B4 09 MOV AH,09 0CE7:0105 CD 21 INT 21 OCE7:0107 BA 60 01 MOV DX,0160 0CE7:010A B4 0A MOV AH,0A 0CE7:010C CD 21 INT 21 0CE7:010E BA 5C 01 MOV DX,015C 0CE7:0111 B4 09 MOV AH,09 0CE7:0113 CD 21 INT 21 0CE7:0115 BD 40 01 MOV BP,0140 0CE7:0118 8A 4E 21 MOV CL,[BP+21] 0CE7:011B B5 00 MOV CH,00 0CE7:011D 8A 66 22 MOV AH,[BP+22] 0CE7:0120 88 66 47 MOV [BP+47],AH 0CE7:0123 45 INC BP 0CE7:0124 E2 F7 LOOP 01ID 0CE7:0126 B8 21 24 MOV AX,2421 0CE7:0129 89 46 47 MOV [BP+47],AX 0CE7:012C B4 09 MOV AH,09 0CE7:012E BA 80 01 MOV DX.0180 0CE7:0131 CD 21 INT 21
0CE7:0133 CD 20 INT 20
Состояние ячеек оперативной памяти перед запуском программы на исполнение:
-d 140 I5O
0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What's your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00? $..........$. 0CE7:0160 1D 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0180 48 65 6C 6C 6F 2C 20 00-00 00 00 00 00 00 00 00 Hello,.........
Результат запуска программы на исполнение:
-G=100
What's your name? Without Hello, Without! Программа завершилась нормально
Состояние ячеек оперативной памяти по завершении работы программы:
0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What's your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00? $..........$. 0CE7:0160 1D 07 57 69 74 68 6F 75-74 0D 00 00 00 00 00 00..Without....... 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0180 48 65 6C 6C 6F 2C 20 57-69 74 68 6F 75 74 21 24 Hello, Without!$
Комментарии:
100..135 – код; 140..153 – текст запроса; 15C..15E – ASCII-коды перевода строки; 160 – буфер ввода (1C(h) – максимальное число вводимых символов) 170 – начало текста именного приветствия, завершающегося восклицательным знаком
| Задания к лабораторной работе:
Выполнить следующие задания:
- Изучить содержание лабораторной работы (в часы самоподготовки).
- Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
- Законспектировать примеры применения команд (в часы самоподготовки).
- Составить следующие программы:
- ввести строку символов и вывести на экран первые 5 символов введённой строки; - ввести строку символов и вывести на экран последние 5 символов введённой строки; - ввести строку символов и вывести на экран все символы строки, кроме 3-х первых символов и 3-х последних.
|
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА:
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с.
2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с.
3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с.
4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998.
6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672
7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000.
8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400
9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с.
10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с.
11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с.
12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C.
13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с.
14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.
|
Лабораторная работа N 1.
Лабораторная работа N 2.
Прерывание 21h. Вывод информации на экран монитора (2 часа)
Основное задание: написать и отладить программу для вывода на экран
заданной строки с использованием функции 9 прерывания 21h.
Варианты дополнительных заданий:
1. Вывести отдельные символы строки.
|