Использование стандартного отладчика debug.exe 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование стандартного отладчика 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 простейших типовых программ-примеров:

  1. Копирование ячеек указанного диапазона.
  2. Занесение в ячейки указанного диапазона заданного ряда чисел.
  3. Поиск и замена образцов указанного диапазона.
  4. Подсчёт количества образцов указанного диапазона.
  5. Суммирование содержимого ячеек заданного диапазона.
  6. Нахождение минимального значения в заданном диапазоне.
  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

Задания к лабораторной работе:

Выполнить следующие задания:
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе программ (в часы самоподготовки).
  3. Выполнить проверку решения типового задания "Подсчитать количество символов "7" в диапазоне ячеек 140..17E. Результат сохранить в ячейке 134". Проверку выполнить для первых 3-х ячеек диапазона ([140]= 34;[141]= 37;[142]= 36).
  4. В диапазоне ячеек памяти 140-173 заменить все заглавные буквы "В", встречающиеся в этом диапазоне на строчные "в", а в диапазоне 174-183 определить максимальное значение, сохранив результат в ячейке 184.
  5. Выполнить проверку решения типового задания "Просуммировать содержимое ячеек 143..157. Результат сохранить в ячейках, начиная с ячейки 140". Проверку выполнить для первых 4-х ячеек диапазона ([143]= AD;[144]= BC;[145]= FE;[146]= ED).
  6. Скопировать содержимое ячеек диапазона 130-149 в диапазон, начинающийся адресом 150, а в диапазоне 16А-180 определить минимальное значение, сохранив результат в ячейке 181
  7. Выполнить проверку решения типового задания "Определить минимальное число диапазона 141..16F. Результат сохранить в ячейке 140". Проверку выполнить для первых 3-х ячеек диапазона ([141]= 34;[142]= 37;[143]= 32).
  8. Занести в ячейки диапазона 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 – начало текста именного приветствия, завершающегося восклицательным знаком

Задания к лабораторной работе:

Выполнить следующие задания:
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
  3. Законспектировать примеры применения команд (в часы самоподготовки).
  4. Составить следующие программы:
- ввести строку символов и вывести на экран первые 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. Вывести отдельные символы строки.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 2565; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.113.188 (0.066 с.)