Настройка Wi-Fi

Справка по команде debug и ее параметрам. Описание команд отладчика debug

Справка по команде debug и ее параметрам. Описание команд отладчика debug

Использование стандартного отладчика 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 в сегменте, адрес начала которого - 40h ).

Разобравшись с правилами, давайте перейдем к изучению команд 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 [<начальный_адрес> ] 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 :

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-х диапазонов .

Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.

Типовые примеры ассемблерных программ.

В данной лабораторной работе собраны 7 простейших типовых программ-примеров:

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

К разряду простейших эти примеры отнесены по простой причине: ни в одном из них не требуется выводить символы на экран.
Во всех случаях действия осуществляются с числами, располагающимися в ячейках оперативной памяти.
Во всех случаях просмотр результатов предполагает использование отладчика DEBUG.
Все рассматриваемые программы-примеры собраны в рабочей папке, где хранятся файлы описания данной лабораторной работы.
Для загрузки этих файлов следует вспомнить раздел 1-ой лабораторной работы, в котором речь идёт о работе с файлами.

Команды, используемые в типовых примерах.

Типовой пример №1.

Копирование ячеек заданного диапазона:

УСЛОВИЕ ЗАДАНИЯ: Скопировать содержимое ячеек диапазона 130..13F в диапазон, начинающийся с адреса 150. (все данные в 16-ой системе) ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса диапазона-источника= 130, стартового адреса диапазона-приёмника= 150, числа шагов цикла= 10). (все данные в 16-ой системе) Примечание . Расчет значения счетчика цикла: CX= (13F - 130) + 1 = F + 1 = 10 (расчёты в 16-ой системе) 2. Организация цикла: AL <- <- 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, ; AL <- (копирование в регистр AL содержимого очередной ячейки диапазона) 10B MOV ,AL ; <- 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 находятся следующие числа: = 10 = 11 = 12 100: SI = 130 103: DI = 150 106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 109: AL = = 10 10B: = AL= 10 (содержимое 1-ой ячейки скопировано) 10D: SI= 130+1= 131 10E: DI= 150+1= 151 10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109) 109: AL= = 11 10B: = AL = 11 (содержимое 2-ой ячейки скопировано) 10D: SI= 131+1= 132 10E: DI= 151+1= 152 10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109) 109: AL= = 12 10B: = AL = 12 (содержимое 3-ей ячейки скопировано) 10D: SI= 132+1= 133 10E: DI= 152+1= 153 10F: CX= 1-1= 0 (CX= 0, поэтому цикл заканчивается) 111: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : = 10 = 11 = 12

Типовой пример №2.

Заполнение ячеек заданного диапазона указанным рядом чисел:

УСЛОВИЕ ЗАДАНИЯ: Ввести в ячейки с адреса 120 числа 7,B,...,FF (все данные в 16-ой системе) ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (начального числа= 7, стартового адреса= 120, числа шагов цикла= 3F). Примечание . Расчет значения счетчика цикла: CX= (FF-7):4 + 1 = F8:4+1= 3E+1= 3F 2. Организация цикла: <- 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 ,AL ; <- 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: = 7 10A: AL= 7+4= B 10C: DI= 120+1= 121 10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108) 108: = B 10A: AL= B+4= F 10C: DI= 121+1= 122 10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: = F 10A: AL= F+4= 13 10C: DI= 122+1= 123 10F: CX= 1-1= 0 (CX= 0, цикл завершен) 111: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : = 7 = B = F

Типовой пример №3.

Поиск и замена образца в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Просмотреть ячейки 120..16F и заменить символ "9" символом "5". ПЛАН РЕШЕНИЯ : 1. Задание начальных значений до начала цикла (стартового адреса= 120, ASCII-кода символа "5"= 35, ASCII-кода символа "9"= 39, числа шагов цикла= 50). Примечание <->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 ,AH ;<->AH 10C JNZ 0110 ; переход, если "Not Zero" (не равное 0 значение) 10E MOV ,AL ; <- 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: = 31<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 120+1= 121 111: CX= 3-1= 2 (CX=2><->39 Равно, т.е. имеет место "Zero" 10C: переход на адрес 110 не следует, т.к. имеет место "Zero" 10E: = 35 110: DI= 121+1= 122 111: CX= 2-1= 1 (CX=1> <->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. Организация цикла: <->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 ,AH ;<->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 ,AL; сохранение найденного количества образцов 116 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 120-122 разместим строку "193" 100: DI = 120 103: AL = 0 105: AH = 39 107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 10A: = 31<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 120+1= 121 111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А) 10A: = 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: = 33<->39 Не равно, т.е. имеет место "Not Zero" 10C: переход на адрес 110, т.к. имеет место "Not Zero" 110: DI= 122+1= 123 111: CX= 1-1= 0 (CX=0, цикл завершен) 113: = 1 (сохранение количества найденных образцов) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено число 1

Типовой пример №5.

Суммирование содержимого ячеек заданного диапазона:

УСЛОВИЕ ЗАДАНИЯ: Просуммировать содержимое ячеек 140..157. Результат сохранить в ячейках, начиная с ячейки 170 ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 18, начального значения суммы= 0). 2. Организация цикла: (ADD AL,)и(ADC AH,00) (последовательное добавление содержимого ячеек 140..157 к накапливаемой сумме) 3. Сохранение найденной суммы (в ячейках памяти 0170 и 0171: =AL =AH). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV AX,0000 ; в регистре AX накапливаться сумма, поэтому AX = 0 103 MOV BP,0140 ; в регистр BP заносится стартовый адрес ячеек диапазона 106 MOV CX,0018 ; в регистр CX заносится количество ячеек диапазона; цикл по перебору ячеек диапазона: 109 ADD AL, ; добавление к содержимому AL содержимого ячейки 10C ADC AH,00 ; добавление 1, если регистр AL оказался переполненным 10F INC BP ; наращивание значения указателя адресов BP 110 LOOP 109 ; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А 112 MOV ,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+= 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+= 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+= 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: = AL= 39 = AH= 2 (найденная сумма= 239) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено число 39, в ячейку 171 число 2.

Типовой пример №6.

Поиск минимального значения в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Определить минимальное число диапазона 140..16F. Результат сохранить в ячейке 170. ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 30, начального значения минимума= FF). 2. Организация цикла: (CMP DL,) (последовательное сопоставление содержимого ячеек 140..16F с текущим минимумом) 3. Сохранение найденного минимума (в ячейке памяти 0170: =DL). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV BP,0140 ; загрузка в регистр BP начального адреса 103 MOV CX,0030 ; в регистр CX заносится количество ячеек диапазона 106 MOV DL,FF ; в регистр DL заносится FF (начальное значение min) ; цикл по нахождению минимального значения: 108 CMP DL, ; текущий min DL сравнивается с содержимым очередной яч-ки 10B JBE 0110 ; если текущий min DL ≤ имеет место переход на 110 10D MOV DL, ; обновление текущего min DL (знач-е оказалось меньше) 110 INC BP ; наращивание адреса текущей ячейки памяти 111 LOOP 0108 ; цикл по перебору ячеек памяти 113 MOV ,DL ; сохранение в ячейке 170 найденного минимума 117 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 140-142 разместим строку "391" 100: BP = 140 103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 106: DL = FF (начальное значение min) 108: DL<-> FF<->=33 Результат сравнения > (больше) 10B: переход на адрес 110 не следует, т.к. имеет место > (больше) 10D: DL= = 33 обновление текущего min DL 110: DI= 140+1= 141 111: CX= 3-1= 2 (CX=2><-> 33<->=39 Результат сравнения < (меньше) 10B: переход на адрес 110, т.к. условие переходы выполнено 110: DI= 141+1= 142 111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=31 Результат сравнения > (больше) 10B: переход на адрес 110 не следует, т.к. имеет место > (больше) 10D: DL= = 31 обновление текущего min DL 110: DI= 142+1= 143 111: CX= 1-1= 0 (CX=0, цикл завершён) 113: = DL= 31 (сохранение найденного min) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено значение минимума 31

Типовой пример №7.

Поиск максимального значения в заданном диапазоне:

УСЛОВИЕ ЗАДАНИЯ: Определить максимальное число диапазона 140..16F. Результат сохранить в ячейке 170. ПЛАН РЕШЕНИЯ : 1. Задание начальных значений (стартового адреса= 140, числа шагов цикла= 30, начального значения максимума= 0). 2. Организация цикла: (CMP DL,) (последовательное сопоставление содержимого ячеек 140..16F с текущим максимумом) 3. Сохранение найденного максимума (в ячейке памяти 0170: =DL). 4. Завершение работы программы (INT 20) КОД ПРОГРАММЫ : 100 MOV BP,0140 ; загрузка в регистр BP начального адреса 103 MOV CX,0030 ; в регистр CX заносится количество ячеек диапазона 106 MOV DL,0 ; в регистр DL заносится 0 (начальное значение max) ; цикл по нахождению максимального значения: 108 CMP DL, ; текущий max DL сравнивается с содержимым очередной яч-ки 10B JAE 0110 ; если текущий max DL ≥ имеет место переход на 110 10D MOV DL, ; обновление текущего max DL (знач-е оказалось больше) 110 INC BP ; наращивание адреса текущей ячейки памяти 111 LOOP 0108 ; цикл по перебору ячеек памяти 113 MOV ,DL ; сохранение в ячейке 170 найденного максимума 117 INT 20 ; завершение работы ПРОВЕРКА РЕШЕНИЯ : Для проверки решения уменьшим значение счетчика цикла СХ до 3. В ячейках 140-142 разместим строку "319" 100: BP = 140 103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона) 106: DL = 0 (начальное значение max) 108: DL<-> 0<->=33 Результат сравнения < (меньше) 10B: переход на адрес 110 не следует, т.к. имеет место < (меньше) 10D: DL= = 33 обновление текущего max DL 110: DI= 140+1= 141 111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=31 Результат сравнения > (больше) 10B: переход на адрес 110, т.к. условие переходы выполнено 110: DI= 141+1= 142 111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108) 108: DL<-> 33<->=39 Результат сравнения < (меньше) 10B: переход на адрес 110 не следует, т.к. имеет место < (меньше) 10D: DL= = 39 обновление текущего max DL 110: DI= 142+1= 143 111: CX= 1-1= 0 (CX=0, цикл завершён) 113: = DL= 39 (сохранение найденного max) 116: INT 20 - завершение работы. РЕЗУЛЬТАТ РЕШЕНИЯ : В ячейку 170 занесено значение минимума 39

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

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

Программная реализация вывода строки в отладчике DEBUG:

Ввод строк.

Краткое описание функции ввода строки с клавиатуры (прерывание INT 21h):

Программная реализация ввода строки в отладчике DEBUG:

Ввод и вывод строк.

Задача . Запросить имя. Ввести это имя. Вывести именное приветствие.

Программа, представляющая собою решение задачи, имеет вид: -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, 0CE7:011B B5 00 MOV CH,00 0CE7:011D 8A 66 22 MOV AH, 0CE7:0120 88 66 47 MOV ,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 ,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!$

С помощью ярлыка, помещенного на рабочий стол, щелкните его правой кнопкой мыши и выберите пункт «Свойства» в выпавшем контекстном меню. На вкладке «Ярлык» в окне, которое откроется в результате этого действия, кликните поле «Объект». Затем нажмите клавишу End, чтобы переместить курсор в самый конец строки, введите пробел и наберите нужный ключ (-debug). После этого нажмите кнопку «OK» для сохранения ярлыка с внесенными изменениями и запускайте игру обычным способом - двойным щелчком по этой иконке.

Раскройте главное меню на кнопке «Пуск» и выберите пункт «Выполнить» - таким способом вы откроете стандартное окно запуска программ. Этому действию соответствует нажатие сочетания горячих клавиш Win+R - можно использовать и его. Затем введите в открывшемся окне полный путь к исполняемому файлу программы. Набирать его вручную не обязательно, можно нажать кнопку «Обзор» и найти исполняемый файл игры на диске вашего компьютера. После этого добавьте через пробел ключ -debug и нажмите кнопку «OK». При следующем запуске с помощью этого диалога набирать повторно путь и ключ не потребуется - введенная строка сохранится в выпадающем списке, откуда ее можно будет выбрать.

Создайте текстовый файл в любой папке вашего компьютера. Можно сделать это на рабочем столе - щелкните фоновое изображение правой кнопкой мыши, во всплывшем контекстном меню раскройте раздел «Создать» и выберите пункт «Текстовый документ». Введите в первой строке документа полный путь к исполняемому файлу игры - его можно скопировать в ярлыке программы или в адресной строке Проводника. Добавьте через пробел ключ -debug и сохраните документ с расширением bat. Запускать игру надо двойным щелчком по этому файлу.

Не все старые игры и программы могут работать в новых операционных системах и с высоким разрешением экрана. В Windows можно настроить параметры совместимости, и приложение будет запущено. О том, как это сделать, читайте ниже.

Инструкция

Щелкните правой кнопкой мыши по ярлыку игры. В выпавшем меню выберите пункт «Свойства».

В открывшемся окне перейдите на вкладку «Совместимость».

Нажмите «Ок».

Видео по теме

Читерские программы придуманы для того, чтобы упростить компьютерную игру. При помощи чит-кодов вы сможете получать дополнительные бонусы и способности для своего компьютерного героя.

Вам понадобится

  • - программа "CheMax";

Инструкция

Читы для игры Казаки
В стратегии «Казаки» меню для ввода чит-кодов открывается при нажатии клавиши «Enter»
supervizor - туман сражения вкл/выкл
money – пополнения
multitvar – доступ ко всем солдатам
Gods - помощь богов
AI - возможность контролировать врагов
resources - пополнить все ресурсы
shield – супер оружие

Читы для игры Sims 3
Чтобы ввести коды в игре Sims 3, нажмите комбинацию горячих клавиш CTRL + SHIFT + С. Если не открылась, то сверните игру и проверьте, не открылась ли при нажатии этих клавиш другая программа. Закройте ее и разверните игру. Повторно нажмите клавиши.
Для пользователей операционной системы Vista: используйте клавиши Ctrl+Windows+Shift+C.
Некоторые коды для Sims 3:
Kaching - добавляет §1.000 в семейную копилку
Motherlode - добавляет §50.000 симолеонов к семейному бюджету
Familyfunds - позволяет установить бюджет .

Читы для игры Counter-Strike 1.6
Это одна из самых популярных -игр . К данной компьютерной игре хакеры придумали множество чит-программ. Скачайте BadBoy v 5.2. Это универсальный чит, включающий в себя все предыдущие его версии. Установите программу в корневую папку cstrike. Запустите игру и нажмите клавишу “Insert”. Откроется меню данной программы. Клавишами “Page Up” и “Page down” выбирайте необходимые вам настройки и играйте. Данный чит позволяет видеть сквозь стены, быстро бегать, точно стрелять. Но за эту программу на онлайн-серверах блокируют.

Читы для игры Дальнобойщики 2
Во время игры нажмите на клавиатуре клавишу «Pause/Break» и введите необходимый вам чит-код.
SLFILLUP – вы получите полный бак топлива.
SLRECOVER – в службу спасения без затраты средств.
SLREPAIR – бесплатный ремонт автомобиля.

Видео по теме

Обратите внимание

За данные чит-коды, вы можете получить бан на онлайн-серверах

Текстовые игры – один из излюбленных способов проведения досуга у молодежи, увлекающейся ролевыми играми. Ведь для того, чтобы поиграть за любимого персонажа, не нужно готовить костюм и ехать в лес. Играть в форумную игру можно дома, на работе или в перерывах между парами, в общем, когда вам удобно.

Инструкция

Итак, вы решили создать свою текстовую игру и вскоре станете администратором своего ролевого мира. Для начала вам было бы неплохо найти себе одного – двух помощников, так как работы предстоит достаточно.

Если вы хотите сделать игру по своему оригинальному миру, вы должны тщательно продумать и расписать устройство мира, его правила, культуру и ценности. Если вы делаете тестовую ролевку , или – тщательно изучите выбранную вами . Как администратор, вы должны знать все – способности персонажей, которые будут играть, используемые заклинания.

Напишите сюжет игры. К примеру, можно выбрать одну из книги, или другое яркое событие, понравившееся вам. В сюжете вы должны помимо общей информации, содержащейся в первоисточнике, указать, что в это время делают , какие цели противоборствующие стороны, что герои планируют предпринять для того, чтобы разрешить конфликт.

Сочините правила форума и шаблон анкеты. Правила различных текстовых игр весьма похожи, вы можете посмотреть их на любом игровом форуме и, взяв их за основу, написать свои. В же необходимо создать перечень вопросов, на которые должны ответить игроки, подающие заявку на роль персонажа. Обычно в анкете–заявке пишут имя, расу и возраст персонажа, описывают внешность, характер и умения. Лучше всего, если вместе с анкетой вы вывесите заполнения.

Когда текстовая часть готова, можно создавать , на котором и будет проходить игра. В интернете существует несколько бесплатных серверов (к примеру, борда). Если вы умеете писать сайты, вы сможете создать уникальный дизайн со своим цветовым решением, логотипом и кнопками. Если нет – не расстраивайтесь, вы сможете подобрать стандартный шаблон. В конце концов, дизайн форума – это не главное.

Разбейте форум на разделы и выложите информацию. Не скидывайте все в кучу, оставьте один раздел для игротехнической информации – сюжет, правила, список необходимых персонажей. В другом разделе пускай рассматриваются анкеты. Ваш мир разбейте на несколько локаций и создайте для каждой из них отдельную тему. Не забудьте создать тему для разговоров, чтобы игроки не болтали о жизни во время игры. На этом ваша текстовая игра готова принимать посетителей.

Видео по теме

Полный к файлу нужен, как правило, чтобы передать его в качестве параметра какой-либо программе-обработчику. Чаще всего это задача возникает при программировании каких-то процессов, но иногда бывает нужно просто сверить место размещения объекта с путем, указанном в инструкциях. Этот параметр содержит перечисление всех каталогов, начиная с корневого, которые нужно последовательно открыть, чтобы добраться до нужного файла.

Вам понадобится

  • ОС Windows.

Инструкция

Воспользуйтесь «Проводником», если надо найти полный путь к файлу в операционной системе Windows. Откройте программу с помощью «горячих клавиш» Win + E или выбором пункта «Компьютер» в главном меню, вызываемом щелчком по кнопке «Пуск». Если вам известно что-либо о месте расположения нужного объекта, переместитесь по дереву каталогов как можно ближе к нему - это сузит диапазон поиска, а значит, и время на эту процедуру.

В поле, расположенном правее адресной строки менеджера файлов, введите название файла и дождитесь, пока программа просмотрит все вложенные каталоги и найдет объекты, в именах которых есть что-либо похожее. Полный путь будет помещен в колонку «Путь к папке» таблицы с результатами поиска. Переписывать его вручную нет необходимости - кликните эту строку правой кнопкой мыши, в выпавшем контекстном меню выберите строку «Свойства» и скопируйте содержимое поля «Расположение» открывшегося окна.

Если по какой-либо причине вы вынуждены пользоваться интерфейсом командной строки, задействуйте DOS-команду where. Ей нужно задать параметр R, чтобы сделать поиск файла рекурсивным, то есть, чтобы просматривались все вложенные папки. Кроме него обязательно укажите название нужного файла, а необязательным параметром может быть известная вам часть пути к нему. Эта команда тоже осуществляет поиск, поэтому указав хотя бы часть пути, вы сократите затраченное на нее время. Например, если необходимо получить полный путь к файлу с названием RM.csv, о котором известно лишь, что он находится на диске F, команда должна быть написана так:where /R f: RM.csv

Набрав команду и ее параметры, нажмите Enter и по окончании поиска найдете полный путь в следующей строке интерфейса. К сожалению, выделить и скопировать только эту строку здесь нельзя, поэтому кликните правой кнопкой в любом месте окна, выберите в меню команду «Выделить все», а затем нажмите Enter. Таким способом вы поместите в буфер обмена все содержимое интерфейса командной строки, которое в каком-либо текстовом редакторе можно очистить от лишних строк.

Одной из важных составляющих процесса разработки программного обеспечения является отладка. В отношении прикладных программ она осуществляется средствами, работающими в пользовательском режиме и зачастую встроенными в IDE. Но для того чтобы иметь возможность отлаживать, например, драйвера, нужно запустить отладчик ядра .

Вам понадобится

  • - права администратора на целевой машине.

Инструкция

Запустите командный процессор cmd. Кликните по кнопке «Пуск» в панели задач. Кликните по пункту «Выполнить...» появившегося меню. В текстовое поле диалога «Запуск программы» введите строку cmd и нажмите кнопку OK.

Создайте резервную копию файла boot.ini. Узнайте путь инсталляции текущей копии Windows при помощи команды:echo %SystemRoot%Перейдите на тот диск, куда установлена операционная система при помощи ввода литеры устройства с последующим двоеточием. Перейдите в его корневой каталог, используя команду cd. Снимите атрибуты «системный», «только для чтения» и «скрытый» с файла boot.ini при помощи команды attrib, создайте резервную копию командой copy и снова установите атрибуты:attrib -h -s -r boot.inicopy boot.ini boot.ini.oldattrib +h +s +r boot.ini

Выведите текущий список вариантов загрузки. Используйте команду:bootcfg /queryПросмотрите элементы списка и определите тот, на основе которого будет создана новая конфигурация с возможностью отладки в режиме ядра . Запомните идентификатор загрузочной записи.

Создайте новую загрузочную запись, исполнив команду bootcfg с параметром /copy. Используйте параметр /id для указания идентификатора записи, которая будет скопирована. При помощи параметра /d задайте отображаемое имя записи. Например:bootcfg /copy /id 1 /d "Win XP (Debug)"Снова выведите список вариантов загрузки командой bootcfg с параметром /query и узнайте идентификатор добавленной записи.

Включите опции для запуска отладчик а ядра в загрузочную запись, созданную на предыдущем шаге. Если отладка будет производиться на целевой машине, просто добавьте опцию /debug. Например:bootcfg /debug on /id 2Если планируется удаленная отладка с подключением целевого компьютера к хост-машине через com-порт, дополнительно используйте опции /port /baud для указания номера порта и скорости обмена соответственно:bootcfg /debug on /port COM2 /baud 9600 /id 2Если удаленная отладка будет осуществляться с подключением через интерфейс IEEE 1394 (кабель FireWire), воспользуйтесь опцией /dbg1394 для включения соответствующего режима и опцией /ch для указания номера канала, например:bootcfg /dbg1394 on /ch 42 /id 2Просмотрите загрузочные записи командой bootcfg с параметром /query и убедитесь в том, что изменения внесены. Закройте окно командного процессора, выполнив команду exit.

Лабораторная работа

"Изучение команд отладчика DEBUG"

Отладчик DEBUG предназначен для решения широкого круга задач. К ним относятся, например следующие задачи:

Изучение текущего содержимого оперативной памяти;

Редактирование отдельных секторов на флоппи-дисках и на винчестере;

Дизассемблирование.COM -файлов;

Разработка и отладка собственных программ на языке ассемблера;

Изучение работы программ и их модификация;

Тестирование периферийного оборудования для работы с портами ввода /вывода напрямую (в диалоговом режиме);

Изучение системы команд процессора, прерываний BIOS и MS-DOS.

При изучении схемотехники PC/AT необходим инструмент, позволяющий напрямую работать с периферийными портами и оперативной памятью, а также создавать короткие тестовые программы для генерации нужных сигналов на системной плате периферийных адаптерах. Отладчик наилучшим образом подходит для этих целей.

В версии MS-DOS 6.22 размер отладчика составляет 15718 байт. Существует два способа запуска отладчика: debug ENTER и debug filename ENTER. После запуска отладчика загружается в оперативную память, а содержимое сегментных регистров CS, DS, ES, SS на первый свободный параграф сразу после самого отладчика. Регистр IP устанавливается равным 100.

Отладчик DEBAG имеет специальный указатель адреса данных, который использует по умолчанию во многих командах отладчика.

После запуска отладчика слева на экране появляется черта (-) ,которая указывает на то, что отладчик ждёт команду. Все числа интерпретируются отладчиком в шестнадцатиричной системе исчисления.

Для исполнения любой команды надо нажать клавишу "Enter".

Рассмотрим непосредственно команды отладчика DEBUG .

А-команда ассемблирования(ASSEMBLE).

Эта команда позволяет вводить программы с использованием мнемкода команд процессора в оперативную память. Ввод команды отладчика

А < число >

заставляет его перейти в режим приема команд с клавиатуры и последовательного размещения их, начиная с адреса,равному указанному в команде. При вводе можно использовать две популярные инструкции ассемблера DB и DW . Например,

DB 1 , 2 ,3 ,"example"

DW 1000,2000,"FFFF"

Отладчик поддерживает мнемоники всех команд процессора 80286. .При ассемблировании команд JMP CALL по умолчанию, если это возможно, используется SHORT-вариант этих команд, но можно указывать перед адресом переход NEAR и FAR, что приведет к генерации соответствующих команд.

Сначала наберите A 100 ,затем введите программу

Выход из режима ввода программы осуществляется нажатием клавиши ENTER после перехода к пустой строке вслед за последней командой программы.

В данном примере показан метод организации задержки путем "прокрутки" двух циклов. Запустить эту программу можно, набрав команду

Здесь приведена программа забивки экрана символом "!"

Затем надо ввести программу

В конце программы в этих примерах стоит команда INT 20, обеспечивающая возврат управления обратно на монитор команд отладчика. Запуск этой программы осуществляется по команде G =100

MOV AX,21 ;Запись значения 21H в регистр AX

MOV AX, ;запись в АХ содержимого ячейки памяти с адресом 21H

С-сравнение(COMPARE).

Эта команда сравнивает побайтно две области памяти и печатает все различия между ними в форме

<адрес> <содержимое> <содержимое> <адрес>

В данной записи слева приведена информация о первой области памяти, а справа - о второй.

Сравнить два блока длиной 256 байт.Первый начинается с адреса 100, а второй - с 300.Для этого надо набрать

Другой вариант той же команды

Сравнить первые 100 -16 байт оперативной памяти с последними

C 0:0L100 F000:FF00

Эта команда может быть полезна, например, при проверке на идентичность двух дискетт. Для этого в соседние области памяти погружаются интересующие нас соответствующие блоки этих дискетт,которые затем анализируются командой С.

D-вывод на экран содержимого памяти (DUMP).

Эта команда даёт на дисплее коды из указанной области оперативной памяти, представляемых в шестнадцатиричной системе исчисления, а справа их представление в ASCII-символах. Кодовые комбинации, не имеющие символьного представления в стандарте ASCII, отображаются точками.

В строке умещается 16 байт, при этом справа указывается полный адрес самого левого байта. Таким образом, в одной строке приводится шестнадцатиричный дамп, а также ASCII-дамп шестнадцати байт оперативной памяти.

Если команда D дана без параметров, то всего на экране отображается 128 байт (80H) в восьми строках. В каждой строке имеется знак "-", разделяющий 16 байт пополам - между 8-ым и 9-ым байтами.

Для того, чтобы просмотреть указатели-вектора первых тридцати двух прерываний (20Н),надо ввести команду

Другой вариант без указания диапазона

Первые четыре байта дают вектор прерывания INT0 ,следующие четыре

Просмотр последних шестнадцати байт из ПЗУ:

Просмотр области оперативной памяти, используемой BIOS:

Если периодически несколько раз повторять эту команду, то при сравнении исходной и последующих распечаток имеются изменения в некоторых местах, в частности, происходит увеличение содержимого четверки байт начинающихся с адреса 40:006C. Дело в том,что именно по этому адресу хранится четырехбайтных счетчик системных часов.

Е- команда изменения содержимое памяти (ENTER) .

Ввод команды:

E <адрес>

Вызывает переход отладчика в режим редактирования отдельных байт. При этом печатается содержимое байта в шестнадцатиричной форме, за которым следует точка. После этого можно набрать величину нового содержимого байта, но можно и оставить содержимое байта прежним, не набирая ничего.

Затем необходимо набрать один из трех управляющих символов:

1)"пробел" - означает переход к редактированию следующего байта,

2)"ENTER". Это приведет к выходу из режима побайтного редактированию на командный уровень отладчика,

3)"-" . Нажатие этого знака приведет к переходу на редактирования предыдущего байта.

Изменим значение счетчика системных часов. Введем команду

И наберем четыре числа 70 70 70 70 , разделенных пробелами, затем символ возврата каретки. Далее необходимо выйти из отладчика и выполнить команду time операционной системы DOS.

F-команда заполнения (FILL).

Эта команда позволяет заполнить содержимое указанного диапазона оперативной памяти повторяющейся цепочкой байтов заданными значениями. В частности, когда цепочка состоит из одного байта, эта команда позволяет обнулить нужную область памяти, когда байт равен 0, а также занести во все биты единицу, заполняя байтом равным FF.

Команда имеет следующий синтаксис -

F<диапазон_памяти> <цепочка_байтов >

F 5000L1000 00FF

Заполнит отрезок памяти длиной 4096 байт (1000Н) повторяющейся парой байтов 00 FF , начиная с адреса

G- команда запуска программы (GO).

Эта команда предназначена для запуска программы на исполнение. При этом, если той области памяти, где хранятся данные, передается управление как программе, компьютер требует его повторный запуск. В случае, когда в программе имеются серьезные ошибки, попытка исполнить ее с помощью оператора G также приводит к зависанию компьютера.

Этот оператор используется в одной из следующих четырех форм:

Исполнение этого оператора сводится к передаче управления адресу CS:IP.

б)G= < адрес >

При этом производится запуск программы с указанного адреса.

Например, оператор

Приводит к запуску процедуры POST (программа самодиагностики ЭВМ

в) G < адрес >

В этом случае программа запускается с адреса CS:IP и при достижении команды с указанным адресом осуществляется останов (BREAK) исполнения программы. Распространенной ошибкой является пропуск знака равенства (=) при использовании команды G. В этом случае указанный адрес воспринимается как адрес останова, и если CS:IP указывает, например, на область данных, то компьютер "зависнет".

г) G=<адрес > <другой _адрес>

В этом случае производится запуск программы с указанного после знака = адреса в случае достижения программой команды с величиной адреса, указанного вторым (др. адрес), происходит останов.

Такой способ останова программы называется введением контрольной точки останова. При указании контрольной точки останова соответствующий байт команды по этому адресу заменяется командой INT3, имеет размер 1 байт. При достижении контрольной точки исходное значение байта восстанавливается.

Н- команда шестнадцатиричной арифметики (HEXARITHMETIC).

Эта команда позволяет получить сумму и разность указанных в команде шестнадцатиричных чисел.

Получаем 02A9 (сумма) и 0095 (разность).

I- команда ввода из порта (INPUT). Эта команда позволяет прочесть содержимое порта ввода с указанным адресом и вывести его на экран в шестнадцатиричном виде.

Синтаксис команды:

I<адрес порта>

Эта команда даст состояние младшего байта счетчика системных часов. Исполнение команды I42 , с её повторением даст нам младший и старший байты счетчика, связанного с динамиком.

N-команда указания имени (NAME).

В этой команде задаётся имя файла, который далее будет считываться с диска командой L, либо записываться на диск командой W.

Синтаксис этой команды следующий:

N <имя_файла >

Прочтем с диска в оперативную память файл TEST.COM. Для этого выполним

В регистровую пару BX:CX, будет занесена длина загруженного файла в байтах.

L-команда загрузки с диска (LOAD).

Эта команда позволяет загружать как логические сектора с флоппи-дисков и винчестеров, так и отдельные файлы

L<адрес> <номер_диска> <начальный_сектор> <число_секторов >

Здесь "адрес" означает начальный адрес в оперативной памяти, начиная с которого будет последовательно размещаться содержимое блоков-секторов. Переменная "номер диска" указывает с какого диска будет производится загрузка. Число 0 означает диск А, число 1-диск В, число 2- диск С и т.д. Следующие две переменные указывают с какого сектора начинается чтение и общее число прочитанных секторов.

Загрузить ВООТ-блок с флоппи-диска А, в оперативную память, начиная с с адреса DS:1000, для чего необходимо выполнить команду

Затем содержимое ВООТ-блока можно просмотреть на экране командой

А также дизассемблировать.

М-команда копирования содержимого части оперативной памяти (MOVE).

Синтаксис команды следующий

М<диапазон > <начальный_адрес>

Здесь "диапазон" указывает на копируемую область памяти, а "начальный адрес " - на адрес первого байта, начиная с которого размещаются скопированные данные. Эту команду можно использовать для временного хранения содержимого оперативной памяти с ее последующим восстановлением.

В начале рассмотрим содержимое памяти:

Затем сохраним часть памяти

Обнулим исходное содержимое

Проверим обнуление

И наконец восстановим исходное содержимое

Эту команду можно также использовать для редактирования программ, отлаживаемых или разрабатываемых в среде отладчика. Особенно она полезна при вставке новых операторов в тело программы.

Р-высокоуровневая трассировка (PROCEED).

Эта команда также, как команда Т, предназначена для трассировки программ.

Однако, в отличие от Т трассировки, эта трассировка менее детальна. Она отслеживает досконально подпрограммы и программные прерывания, а также циклы LOOP и строковые инструкции с повторением, но как и в случае Т-трассировки после каждой инструкции печатается содержимое всех регистров и следующей исполняемой инструкции.

Синтаксис команды

Р =<адрес> <число инструкций>

Можно опустить любой из двух параметров командной строки: "адрес" и/или "число инструкций". Параметр "адрес" задает начальный адрес, начиная с которого будет производиться трассировка, а параметр "число инструкций" будет указывать общее число инструкций. Обязателен ввод символа =при указании адреса для того, чтобы не спутать адрес с числом исполняемых инструкций.

Этот тип Р-трассировки крайне полезен при изучении общей логики выполнения программы, избавляя от утомительного отслеживания деталей. При начальном изучении программы необходимо начинать именно с Р- трассировки.

Q- команда выхода из отладчика (QUIT).

Команда Q приводит к выходу из отладчика на следующий верхний уровень. При этом рабочие файлы автоматически не сохраняются.

R-команда изменения содержимого регистров (RTGISTER), просмотр значений отдельных регистров и регистра флагов с возможностью их изменения.

Дает распечатку содержимого всех регистров, а также команды, на которую указывает CS: IP

R-<имя_регистра>

Дает распечатку содержимого указанного регистра, и потом печатает двоеточие на следующей строке. Перечислим возможные имена регистров

AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, F(регистр флагов)

При исполнении команды R F надо учитывать, что кодирование значений флагов производится весьма специфическим образом. Ниже приводится таблица кодировки, где символьная пара слева соответствует значению 1 флага (флаг установлен), а справа - значению 0:

Флаг переполнения OV NV

Флаг направления DN UP

Флаг маск. прерывания EI DI

Флаг знака NG PL

Флаг нуля ZR NZ

Флаг доп. Переноса AC NA

Флаг чётности PE PO

Флаг переноса CY NC

Значение флагов печатаются в строку. Сразу же за этим в строке печатается знак черты "-" , отладчик переходит в состояние ожидания ввода с клавиатуры. Нижеприведенная команда изменяет 1,3,5 и 7-й флаги:

OV DN EI NG ZR AC PE CY - PO NZ DI NV

Порядок следования обозначений флагов и пробелы при этом не имеют значения.

S- команда поиска упорядоченного набора байтов (SEARCH).

Эта команда позволяет провести поиск указанной цепочки байт в заданном диапазоне оперативной памяти имеет синтаксис.

S <диапазон_памяти> <цепочка_байтов>

Ответ выдается в виде списка адресов, начиная с которых располагается указанная цепочка байтов.

Предположим, что мы хотим определить встречается цепочка "DOS"(коды 44 4F 53) в первых 32К оперативной памяти. Для этого необходимо ввести команду

S 0:0L8000 44 4F 53

T- команда трассировки (TRACE).

Эта команда позволяет исполнить одну или несколько инструкций в режиме трассировки c печатью содержимого всех регистров и мнемоники следующей декодированной исполняет инструкции. После трассировки текущей инструкции указатель IP сдвигается так, что он указывает на следующую инструкцию.

Команда Т

Производит трассировку одной текущей инструкции, которую указывает CS:IP с соответствующим изменением IP.

Т <число>

Производит последовательную трассировку нескольких инструкций, общее число которых задается командой.

Т=<адрес>

Трассирует одну инструкцию по указанному адресу

Общий вид команды Т следующий:

Т=<адрес><число_инструкций>

Производит трассировку первой исполняемой инструкции при начальном запуске компьютера.

U- команда дизассемблирования (UNASSEMBLE).

Эта команда позволяет дизассемблировать программы, загруженные в рабочую область отладчика

Общий синтаксис:

U<начальный_адрес > <длина>

U<начальный_адрес> <конечный_адрес>

Вызывает дизассемблирование 32 байт, начиная с байта, на который указывает CS:IP с выводом результирующего на дисплей.

Если при запуске отладчика переадресовать вывод в файл, то можно получить листинг дизассемблированной программы. При этом команду U и Q (выход из отладчика) придется набирать "вслепую" без эхо-печати на дисплее.

W-команда записи на диск (WRITE).

Эта команда позволяет записывать на диск (флоппи-диск или винчестер) в последовательные блоки указанный диапазон оперативной памяти, а также записывать в файлы.

Запись в секторы на диск производится командой

W <адрес> <номер_диска> <начальный_сектор><число_секторов>

Эта команда записывает на диск не более 80Н секторов, число секторов не более 80.

Параметр "адрес команды" означает адрес оперативной памяти, начиная с которого содержимое памяти копируется на диск.

Параметр "номер диска" указывает драйв, на который производится запись (0-диск А:, 1-диск В:)

Параметр "начальный сектор" указывает номер логического сектора, начиная с которого будет производиться загрузка образа оперативной памяти.

Параметр "число секторов" указывает общее количество записываемых на диске секторов

Запись в файл на диске производится командой W без аргументов. Однако, предварительно необходимо командой N указать имя файла, куда будет производиться запись, а также в пару регистров BX:CX занести длину записываемого файла. Начало области памяти, откуда будет производиться запись, всегда по умолчанию является байтом с адресом CS:100.

Пример записи файла на диск:

BX 0000 - это старое значение содержимого регистра

: 0 - новое значение

: А - размер файла для записи 10 байт (0АH)

W - запись файла на диск, с которого загружен Debug.exe

1. Изучить команды программы DEBUG по описанию лаб. работы.

2. Загрузить с дискеты операционную систему MS DOS 6.22 , запустить программу debug.exe и проверить действие команд с примерами, отличающимися от приведенных в описании, записать эти примеры в отчёт по лаб. работе. При проверке работы программ на ассемблере рекомендуется использовать команды T и R.

3. Загрузить два массива памяти объёмом 10 байт с адреса 100Н и 200Н одинаковыми кодами 55Н (команды F и M), изменить содержимое одной ячейки памяти и с помощью команды C определить адрес этой ячейки памяти. Все действия отразить в отчёте.

4. Составить простую программу на ассемблере с выводом кодов на дисплей (см. пример 2 в разделе команды А), записать эту программу на дискету в виде файла iit.com, (использовать команду W без параметров) выйти из программы debug в DOS и запустить её, набрав в командной строке iit.com. Проверить правильность её работы. Войти в программу debug и загрузить в неё файл iit.com и проверить правильность загрузки командой U.

DEBUG . EXE – специальная системная программа для ввода и пошагового выполнения программ, написанных на машинном языке или с помощью команд ассемблера.

Для запуска этой программы нажмите кнопку Пуск , затем Выполнить , введите Debug и нажмите ввод , в результате программа должна загрузиться с диска в память.

После окончания загрузки на экране появится приглашение в виде дефиса, что свидетельствует о готовности программы Debug для приема команд.

Наиболее часто используемые инструкции Debug :

1. Q – выход из программы.

2. ? – получение справки.

3. H (Hexarithmetic) – шестнадцатеричная арифметика. Если после символа Н набрать 2 числа (размером не более 4 цифр каждое) через пробел, то получим сумму и разность набранных чисел:

4. R [<имя регистра>] – работа с регистрами (от слова Register). Инструкция «R» без параметра позволяет просмотреть содержимое всех регистров, а также значение флагов и команду, расположенную по смещению 0100 в сегменте кода. Обычно по смещению 0100 находится первая команда программы.

С помощью этой инструкции можно ввести новое значение в один регистр. Для этого после команды нужно ввести название регистра:

Как видим, при первом просмотре регистров командой r, в регистре АХ был 0, затем содержимое регистра было изменено.

5. U [<сегментный регистр>:]<начальный адрес>, <конечный адрес> – просмотр ячеек оперативной памяти, начиная с указанного смещения в сегменте, заданном сегментным регистром. Команда U (Unassemble) дизассемблирует команды, находящиеся в памяти по заданному адресу.

Например, в следующем примере мы просматриваем команды, находящиеся в регистре CS, начиная с адреса 100, по адрес 102.

6. Е [<сегментный регистр>:]<смещение> – запись информации в ячейки оперативной памяти.

Как было сказано, с помощью Debug можно вводить команды как на машинном языке, так и на языке ассемблера. Инструкция Debug E (Enter) служит для ввода команд на машинном языке . Здесь Debug используется как интерпретатор, чтобы работать непосредственно с микропроцессором. Можно задавать машинные команды, записывать их в определенное место оперативной памяти, обычно, начиная с 0100 смещения относительно начала сегмента кода. Затем выполнять пошагово (по одной команде) либо сразу всю программу.

Так как микропроцессор понимает только двоичные числа (сокращенно их можно записать шестнадцатеричными), то и коды машинных команд записываются в виде шестнадцатеричных чисел, причем команды бывают одно-, двух- трехбайтовые и т.д.

Например, команда для сложения значений из регистров АХ и ВХ двухбайтовая и имеет машинный код 01D8.

Инструкция “E <смещение>” при работе распечатывает в следующей после ее ввода строке адрес, состоящий из двух чисел, и старое значение байта по этому адресу: <содержимое CS>:<смещение><значение байта>, далее компьютер ожидает ввода нового значения байта.

Для ввода, например, двухбайтовой машинной команды 01D8 нужно записать 01 в сегмент кода по смещению 100, и D8 – по смещению 101:

7. Т (от Tracing)– запуск программы, находящейся в оперативной памяти по адресу 0100, в пошаговом режиме. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.

8. А <смещение> – ввод команд в ассемблерном виде (от Assemble). Первую команду программы следует начинать вводить со смещения 0100. Далее система ждет поочередного ввода команд ассемблера. Для окончания ввода нужно нажать Enter после пустой строки.

Пример . Введем в оперативную память программу на ассемблере, выполняющую сложение двух чисел. Установим начальный адрес следующим образом: A 0100 .

Отладчик выдаст значение адреса сегмента кодов и смещения в виде хххх:0100. Теперь можно вводить каждую команду, завершая клавишей Ввод.

Прежде чем выполнить программу, проверим сгенерированные машинные коды при помощи команды U. Необходимо сообщить отладчику адреса первой и последней команд, которые необходимо просмотреть, в данном случае 0100 и 0106. Введите: U 100, 106

Как видим, машинные коды сгенерированы верно.

С помощью команды R выведем содержимое регистров и первую команду нашей программы:

С помощью команд Т выполним последовательно все команды программы:

Так вводятся и трассируются программы на языке ассемблера.

Изучим остальные команды Debug, после чего вернемся к примеру.

9. G (от Go) – запуск программы, находящейся в оперативной памяти по адресу 0100. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.

10. N <имя.com-файла> – задает имя программы (Name) для последующей записи ее на диск либо считывания с диска. Перед записью предварительно нужно записать 0 в регистр ВХ, а размер программы (в байтах) – в регистр СХ.

11. W (от Write) – запись программы на диск. После выполнения инструкции “W” на диске в текущей директории появится файл с расширением.COM – точная копия веденной программы.

программы с диска в оперативную память. Предварительно имя программы задается с помощью команды N.

Вернемся к примеру со сложением двух чисел. Чтобы записать эту программу на диск, следует выполнить три действия:

1. присвоить программе имя;

2. указать длину программы;

3. выполнить запись.

1. Присвоим будущему файлу имя с помощью команды N.

2. Программа состоит из четырех двухбайтных инструкций, занимает адреса со смещениями с 0100 по 0106, значит ее длина – 8 байт. Размер программы Debug хранит в регистровой паре . В нашем случае значение длины умещается в одном регистре, поэтому старший регистр пары мы просто обнулим: BX=0, CX=8.

3. Для записи программы на диск используем программу W.