DEBUG – запустить стандартный отдачик MS DOS — Windows XP.
Debug.exe — программа-отладчик, разработанная для операционной системы MS DOS и используемая для отладки исполняемых файлов. Под более поздние версии операционных систем (Windows NT и старше) работает через эмулятор MS-DOS и имеет ограниченные возможности. До Windows XP включительно, отладчик debug.exe являлся стандартным компонентом системы.
Формат командной строки:
DEBUG [[диск:][путь]имя_файла [параметры_программы]]
Параметры командной строки:
[диск:][путь]имя_файла — путь и имя отлаживаемой программы.
параметры_программы — параметры командной строки для отлаживаемой программы.
debug /? — отобразить краткую справку по использованию.
debug C:\windows\system32\edit.com C:\boot.ini — запустить отладку текстового редактора edit.com , передав ему в качестве параметра командной строки путь и имя редактируемого файла.
debug — при запуске без параметров, отладчик переходит в интерактивный режим, ожидая ввода команд. Подсказку по используемым командам можно получить, введя знак вопроса — ? :
Краткая подсказка по использованию отладчика Debug:
assemble | A [адрес] |
compare | C диапазон адрес |
dump | D [диапазон] |
enter | E адрес [список] |
fill | F диапазон список |
go | G [=адрес] [адреса] |
hex | H значение1 значение2 |
input | I порт |
load | L [адрес] [диск] [превый_сектор] [число] |
move | M диапазон адрес |
name | N [путь] [список_аргументов] |
output | O порт байт |
proceed | P [=адрес] [число] |
quit | Q |
register | R [регистр] |
search | S диапазон список |
trace | T [=адрес] [значение] |
unassemble | U [диапазон] |
write | W [адрес] [диск] [первый_сектор] [число] |
выделение памяти EMS | XA [#число_страниц] |
освобождение памяти EMS | XD [дескриптор] |
сопоставление страниц EMS | XM [Lстраница] [Pстраница] [дескриптор] |
вывод состояния памяти EMS | XS |
При небольших размерах исполняемого файла, отладчик обладал очень неплохими возможностями, позволяя не только выполнять отладку программ, но и просматривать содержимое памяти, в том числе BIOS материнской платы и плат расширения, выполнять операции ввода-вывода с доступом к регистрам устройств ( в среде MS DOS ), и например, позволял легко сохранить в файл и дизасемблировать главную загрузочную запись MBR.
Для выхода из отладчика используется клавиша q .
Программа Debug
Как уже говорилось (см. ВВЕДЕНИЕ), программа Debug входит в состав Windows. Запустить программу Debug можно из командной строки или непосредственно из папки, в которой она находится. Чтобы запустить программу из командной строки, выберите команду из меню ПУСК – ВЫПОЛНИТЬ или нажмите комбинацию клавиш WIN + R (если вы не знаете, что такое комбинация клавиш, см. книгу Компьютер для чайников). В открывшемся окне (рис. 1.5) напечатайте слово debug и нажмите клавишу ENTER или щёлкните кнопку ОК.
После этого откроется окно с пустым экраном и чёрточкой в левом верхнем углу, которая приглашает вас ввести какую-либо команду. Например, чтобы выйти из программы Debug, напечатайте букву q и нажмите ENTER.
Написать программу, используя Debug, можно не единственным способом, но мы пока рассмотрим тот, который больше похож на написание программы для Emu8086.
Чтобы написать уже известную нам программу, используя Debug, сделаем следующее (подразумевается, что Debug вы уже запустили, и увидели черный экран с маленькой мигающей черточкой в левом верхнем углу).
Введем букву «а» (напоминаю в последний раз — все команды вводятся на английском языке) и нажмем ENTER.
Затем введем программу, нажимая ENTER в конце каждой строки: Результат будет примерно таким, как показано на рис. 1.6.
ПРИМЕЧАНИЕ 1
Обратите внимание, что все числовые значения пишутся без буковки h в конце. Это потому, что Debug работает только с шестнадцатеричными числами, и ему не надо объяснять, в какой системе исчисления вводятся данные.
ПРИМЕЧАНИЕ 2
После ввода команды -а, появляются символы: 0B72: 0100. В вашем случае первые четыре символа могут быть другими, но нас они пока не интересуют. А как вы думаете, что означает число 0100? Помните директиву ORG 100h (см. раздел Emu8086)? Вот-вот – это адрес, с которого начинается выполнение программы. То есть в память с этим адресом заносится первая команда программы (для файлов СОМ). Каждая команда занимает 2 байта, поэтому следующий адрес будет 0102 и т.д.
Сами команды мы уже знаем (см. раздел Emu8086), поэтому описывать их здесь не будем.
Программа написана – нужно проверить ее работу. Нажмём ENTER ещё раз, чтобы на экране появилась чёрточка, которая говорит о том, что можно вводить команду для Debug. Затем введем команду g (от английского «GO») и нажмем клавишу ENTER. На экране увидим следующее: Здесь A – та самая буква, которая выводится на экран в результате работы программы. Затем идёт сообщение о нормальном завершении программы (оно может отличаться в зависимости от версии Debug).
А теперь, если интересно, можно проверить программу в пошаговом режиме, то есть понаблюдать, как выполняются команды одна за другой. Для этого придется по новой набрать текст программы (не забудьте сначала ввести команду а), затем:
Введем команду t и нажмем клавишу ENTER. Увидим нечто вроде этого: Это есть ни что иное, как состояние регистров процессора после выполнения первой строки программы. Как вы можете видеть, в регистр АН записалось число 02. В нижней строке находится адрес команды и сама команда, которая будет выполняться следующей.
Снова введем команду t и нажмем клавишу ENTER. Увидим следующее: Команда MOV DL, 41, как ей и полагается, записала в регистр DL число 41.
Снова введем команду t и нажмем клавишу ENTER. Увидим следующее: Команды CMP AH,4B нет в нашей программе. Наша программа завершила свою работу. Мы можем долго еще вводить команду t – нам будут выдаваться состояния регистров. Почему это происходит, нам пока не интересно. Лучше введем команду g и нажмем клавишу ENTER, таким образом окончательно выполним нашу программу, и увидим то, что мы уже видели.
Программа написана и проверена. Но как сделать ее самостоятельной, то есть как создать файл СОМ? Ведь то, что мы сделали, работает только с помощью Debug. Чтобы создать исполняемый файл, нужно ответить на несколько вопросов:
- Какого размера будет наш файл? Выполнение программы начинается с адреса 0100h, а последняя строка в программе содержит адрес 0108h. Это значит, что размер файла будет 8 байт (108h – 100h = 8).
- Как мы назовем наш файл? А хоть как. Однако, рекомендуется давать файлам английские имена, в которых содержится не более 8 символов (DOSу так приятнее работать). Назовем, например, debug_1.com
А теперь выполним следующие действия:
- Снова напишем нашу программу (тренируйтесь, тренируйтесь. ).
- Запишем в регистр СХ размер файла. Для этого введем команду r cx и нажмем ENTER. Затем введем размер файла (8 байт) и нажмем ENTER.
- Введем команду n, затем один пробел и имя файла. Нажмем ENTER.
- И, наконец, введем команду w и нажмем ENTER.
В результате всех этих действий на экране появится следующая информация (см. также рис. 1.7): Если вы работаете в режиме эмуляции DOS из под WINDOWS, то файл debug_1.com сохранится на рабочий стол, либо в папку текущего пользователя. Это зависит от версии и/или настроек WINDOWS. Теперь его можно запустить как обычную программу. Если в указанных папках вы не нашли этот файл, то найдите его через поиск файлов. Ну а если вы не знаете, как это сделать, см. книгу Компьютер для чайников.
Чувствую, что мы уже устали. Выход из Debug осуществляется командой q.
Набравшись сил и терпения, изучим еще одну опцию Debug – дизассемблер. С его помощью можно дизассемблировать какой-нибудь СОМ-файл (то есть выполнить действие, обратное ассемблированию – преобразовать исполняемый файл в исходный код на языке ассемблера). Допустим, у вас есть программка, написанная не вами – ее исходный код вы не знаете, а посмотреть очень хочется. Для этого и существует дизассемблер.
Итак, программа Debug у нас закрыта. Набираем в командной строке: (где debug_1.com – это имя файла, который мы хотим дизассемблировать) и нажимаем ENTER.
ПРИМЕЧАНИЕ
Если программа не запустилась, значит нужно указать полный путь к ней, например Если же программа запустилась, но выдала ошибку (например: Ошибка 1282 или «Файл не найден»), то нужно указать полный путь к файлу, например: Если и это не помогло, то, возможно, вы всё-таки где-то допустили ошибку в пути или путь не соответствует требованиям DOS. В таком случае лучше поместить программу в корень диска С, откуда она гарантированно загрузится по пути «C:\debug_1.com».
Если Debug запустилась без сообщений об ошибках, то вводим команду u и нажимаем ENTER. Вот что мы увидим (примерно, см. также рис 1.8): Посмотрите на первые четыре строки. Узнаете? Это наша программа. Остальные строки нас не интересуют (это инструкции, оставшиеся от программ или данных, отработавших до запуска Debug). Ну а если мы рассматриваем незнакомый файл, как узнать, где кончается программа и начинается «мусор»? Ориентировочно это можно сделать по размеру файла (для очень маленьких программ). Размер можно посмотреть в свойствах файла. Только следует учитывать, что в свойствах файла размер дан в десятичной форме, а Debug нам выдает шестнадцатеричные адреса. Поэтому придется перевести десятичное число в шестнадцатеричное.
Есть еще вариант (который тоже не всегда приемлем) – найти в полученном списке строку, содержащую команду выхода из программы (INT 20).
Если программа большая, то список ее команд не поместится на экран. Тогда снова вводим команду u и нажимаем ENTER. И так до конца программы.
Возможно, вы не увидите на экране свою программу. Это может быть либо из-за того, что программа почему-то не загрузилась, либо по причине несоответствия адресов. Будьте внимательны: обращайте внимание на адреса памяти, которые указаны в левой колонке. Наша программа начинается с адреса 0100. Если адрес другой, то это, соответственно, не наша программа.
Использование стандартного отладчика 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 L C |
D (Display/Dump) | Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. | D [ [L ]] D [начальный_адрес конечный_адрес] |
E (Enter) | Ввод в память данные или инструкции машинного кода; по умолчанию используется DS. | E [ [ ]] |
F (Fill) | Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон. | F L ‘ ‘ F ‘ ‘ |
G (Go) | Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес. | G [= ] [ . ] |
H (Hexadecimal) | Вычисление суммы и разности двух шестнадцатеричных величин. | H |
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:
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 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 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] 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 AH 10C JNZ 0110 ; переход, если «Not Zero» (не равное 0 значение) 10E MOV [DI],AL ; [DI] 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 AH 10C JNZ 0110 ; переход, если «Not Zero» (не равное 0 значение) 10E INC AL ; AL 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 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 Результат сравнения 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.
Поиск максимального значения в заданном диапазоне: