Краткая характеристика программы MONITOR Лабораторная работа №1 Тема: Изучение инструкций программы MONITOR Краткая характеристика программы MONITOR MONITOR - это учебно-отладочная программа, позволяющая выполнять побайтную обработку файлов и памяти микропроцессорной системы, организованной на микропроцессоре i80x86, работающего в реальном режиме. MONITOR также обеспечивает возможность выполнения отлаживаемых программ в пошаговом и непрерывном режимах. При этом программа выполняется только под «наблюдением» монитора. Для пользования инструкциями монитора необходимо иметь представление об архитектуре микропроцессора и микропроцессорной системы и особенностях составления программ на ассемблере i80x86. Функции монитора позволяют: - производить загрузку программ из файла в память и из памяти в файл; - выводить на экран содержимое участков памяти в шестнадцатеричном формате и в формате кода ASCII; - изменять содержимое участка памяти; - преобразовывать машинные коды, находящиеся в памяти машины, в команды ассемблера и выводить их на экран. - редактировать программы, находящиеся в памяти, на ассемблере; - отображать и изменять содержимое регистров микропроцессора; - производить покомандное выполнение программы с выводом содержимого регистров на экран; - выполнять программу в непрерывном режиме (прогон) до указанного места или в полном объеме. Синтаксис команд монитора заключается в следующем. Все команды монитора начинаются с буквы — все равно, заглавной или строчной. Большая часть команд требует введения дополнительных параметров. Если два подряд расположенных параметра являются числами, то они разделяются пробелом или запятой. В противном случае параметры можно не отделять один от другого. Все числа должны вводиться в шестнадцатеричной форме. Чтобы проиллюстрировать сказанное, рассмотрим две функционально эквивалентные команды (прочитать 48 ячеек памяти в текущем сегменте, начиная с адреса 100H): D 100 L 30 означает то же самое, что и d100l30 Примечание – Здесь и далее машинописным шрифтом: 0,1,2,А,а,D,d...- обозначается отображение на экране дисплея вводимая и выводимая информация при диалоге с монитором. Необходимо помнить, что любая инструкция может вводиться только по приглашению монитора, которым является изображение в начале строки: «‑» (дефис). В таблице 1 приведены имена клавиш клавиатуры микропроцессорной системы (учебно-отладочного стенда) и соответствующие им действия монитора. Таблица 1 – Инструкции монитора ─────┬─────────────────────────────────┬──────────────────────── Сим-│ КРАТКОЕ ОПИСАНИЕ ИНСТРУКЦИИ │ ФОРМАТ КОМАНДЫ вол │ │ ─────┼─────────────────────────────────┼───────────────────────── A * Перевод:ассемблер — машинный код│ A с указанного адреса │ A(start) D * Выводит на экран содержимое │ D — участка памяти размером 128 байт│ D(start) — с указанием начала и конца │ D(start) (end) — с указанием начала и числа байт │ D(start)L(leng) E * Вводит в ОЗУ с указанного адреса│ E(start) (list) список чисел и символов. │ — выводит на экран байт памяти,ко-│ Е(start) торый тут же можно исправить. │ (вызов следующего —пробел). │ G * Cтарт программы в режиме прогона│ G — с заданного адреса │ G=(start) — до заданного адреса │ G(breakpoint) — с заданного до заданного │ G=(start) (breakpoint) I * Вводит из заданного порта байт и│ I[port] выводит его на экран. │ L * Производит загрузку файла в ОЗУ │ L — начиная с указанного адреса │ L(start) N * Идентифицирует файл (как в DOSe)│ N[filename] O * Пересылает байт в указанный порт│ O[port] [byte] P * Выполняет одну команду программы│ P (INT n выполняется как команда) │ Q * Осуществляет выход из монитора. │ Q R * Выводит на экран регистры. │ R — выводит на экран содержимое од- │ R(register name) ного регистра, которое тут же │ можно изменить. │ — выводит на экран содержимое │ RF флагов, состояния которых тут │ же можно изменить (через «,»).│ T * Выполняет одну команду программы│ T — указанное число команд │ T(number) — указанное число с заданного адр.│ T=(start) (number) U * Перевод: машинный код- ассемблер│ U — перевод фрагмента: начало-конец │ U=(start) (end) — то же: начало —число байт │ U(start)L(leng) W * Запись дампа памяти в файл(диск)│ W — то же, но с указанного адреса │ W(start) (в обоих вариантах число байт │ W(drive)(sector)(number) нужно указать в регистрах BX,CX │ W(start)(drv)(sec.)(num.) ───────────────────────────────────────┴────────────────────────── ПРИМЕЧАНИЕ: Параметры в квадратных скобках являются обязательными. Программа МОНИТОР ориентирована на работу с командным форма- том файла (с расширением .COM), поэтому регистр-счетчик адреса IP в момент запуска принимает значение 100h. Сегментные регистры устанавливает сам МОНИТОР, исходя из первой свободной зоны ОЗУ. 1.2 Запуск монитора Чтобы стартовать монитор, необходимо запустить программу monitor.com. Символом «‑» (дефис) монитор сообщает о своей готовности. Выход из монитора Чтобы выйти из монитора и передать управление MS-DOS, на его стандартный запрос «-» вводится команда q: -q 1.4 Чтение содержимого участка памяти Команда DUMP (d или D) служит для отображения на экране содержимого участка памяти. Полученный кусочек памяти — дамп, представляет собой последовательность значений байтов в шестнадцатеричном пpедставлении, а также в коде ASCII. Введем «d» и рассмотрим результат инструкции чтения памяти: -d 958:100 00 41 00 61 00 00 00 00— 00 00 00 00 00 00 00 00 .А.a............ 958:110 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:120 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:130 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:140 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:150 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:160 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:170 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ – Рисунок 1 Примечание - Из-за того, что длинный адрес байта не помещается в строку, в примерах он иногда будет изображаться без ведущих нулей. На самом деле под адрес сегмента и короткий адрес байта отводится по 4 позиции. Например, вместо 958:100 в действительности на экpан вы- водится : 0958:0100. Первое число в верхнем левом углу экрана (0958:0100) — это начальный адрес дампа. Адрес читается следующим образом: «сегмент номер 0958h, адрес байта внутри сегмента 0100h». При введении тех же команд на вашей машине на экране может появиться другое значение сегмента. Первые два нуля, следующие за адресом, означают, что значение байта с адресом 0958:0100 равно 00h. Следующee число «41» в той же строке означает, что значение байта с адресом, на единицу больше предыдущего (0958:0101), равно 41h. Из рисунка 1 видно, что общее число байтов в строке равно 16. Последующие 7 строк (каждой строке предшествует адрес первого в строке байта) — это оставшаяся часть дампа. Можно подсчитать, что полученный дамп отображает содержимое 128 последовательно расположенных байтов. Начальный адрес дампа — 0958:0100, конечный — 0958:017F. Разделители в середине строки — это ориентировочные точки (естественно, что их в памяти нет). Восемь байтов из 16-и находятся по одну сторону от разделителя, восемь — по другую. В конце каждой строки находится по 16 знакомест. Это пространство, отведенное для представления данных в коде ASCII (приложение А). Значения, не имеющие символьного пpедставления в коде ASCII, обозначаются десятичной точкой. Введем команду DUMP еще раз: -d 958:180 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:190 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1A0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1B0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1C0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1D0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1E0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:1F0 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ – Рисунок 2 Обратите внимание на адресную часть! Этот дамп начался с того места, где закончился предыдущий. Если и далее вводить команду «d», не указывая параметров, MONITOR будет последовательно выводить по 128 байтов памяти. В командной стpоке можно указать начальный адрес дампа. Выведем, к примеру, 128 байтов памяти, начиная с адреса 0000h, находящегося в сегменте 0958h: -d 0958:0000 958:000 CD 20 00 20 00 9A EE FE— 1D F0 34 02 68 06 62 20 M . ..n .p4.h.b 958:010 68 06 E2 04 9C 05 9C 05— 01 01 00 02 FF FF FF FF h.b............. 958:020 FF FF FF FF FF FF FF FF— FF FF FF FF 65 06 BC 2A ............e.<* 958:030 68 06 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 h............... 958:040 00 00 00 00 00 00 00 00— 00 00 00 00 00 00 00 00 ................ 958:050 CD 21 CB 00 00 00 00 00— 00 00 00 00 20 20 20 00 M!K......... . 958:060 20 20 20 20 20 20 20 20— 20 20 20 00 00 00 00 00 ..... 958:070 20 20 20 20 20 20 20 20— 00 00 00 00 00 00 00 00 ........ - Рисунок 3 Числа, имеющие символьное пpедставление в коде ASCII, расположены в интервале значений от 00h до 7Fh. MONITOR вычитает 80h из любого значения, превышающего 7Hh. Полученная разность выводится на экран в коде ASCII. CDh минус 80h равно 4Dh. В коде ASCII значение 4Dh соответствует букве «M». Поэтому в правой части экрана первым символом является «M». Нужный дамп (например, с 958:8 по 958:F) можно выбрать следующим образом, указав начало дампа и число L байт: -d 958:8 L8 958:0000 1D F0 34 02 68 06 62 20 .p4.h.b. - То же самое, но немножко по-другому: -d 958:8 f 958:0000 1D F0 34 02 68 06 62 20 .p4.h.b. - Этот дамп начинается с адреса 0958:0008 и заканчивается aдресом 0958:000F. Начальный и конечный адреса вводятся в командной стpоке DUMP. Отметим, что начальный адрес представлен длинным ад- ресом байта (0958:0008), а конечный — коротким (000F). Если адрес сегмента находится в одном из сегментных регистров, то вместо адреса в командной строке можно указать имя этого сегментного регистра. Пусть в регистре DS находится число 0958. Введем команду: -d DS:8 L 8 958:0000 1D F0 34 02 68 06 62 20 .p4.h.b. - Внимание! В случае короткой адресации (без указания сегмента) monitor берет адрес сегмента из регистра DS: -d 8 F 958:0000 1D F0 34 02 68 06 62 20 .p4.h.b. - 1.5 Запись данных в память Ввод данных осуществляется с помощью команды ENTER (e или E). Эта команда позволяет побайтно коppектиpовать содержимое памяти. Команда состоит из буквы e (или E) и адреса первого байта коppектиpуемого блока. Если указан короткий адрес, то адрес сегмента выбирается в регистре DS. Вводимые данные также включаются в командную строку. Они представляют собой последовательность чисел в шестнадцатеричном пpедставлении и символьных переменных, разделенных пробелом или запятой. Символьные переменные заключаются в апострофы. Впоследствии шестнадцатеричные значения апострофов вместе с переменной вводятся в память машины. Проиллюстрируем работу ENTER на следующем примере: -e 0958:0000 20 2A 44 41 54 41 20 'IS' 20 48 45 52 45 2A 20 Команда вводит 16 значений. Данные последовательно заполняют память (побайтно), начиная с адреса 0958:0000. Четырнадцать байтов занимают числа в шестнадцатеричном формате, два байта отводятся под символьные переменные I и S . Чтобы просмотреть введенные данные, можно воспользоваться командой DUMP. Выведем 16 (10h) байтов: -d 0958:0000 L10 958:0 20 2A 44 41 54 41 20 49— 20 48 45 52 45 2A 20 *DATA IS HERE* - Команда ENTER может использоваться для отображения и, в случае необходимости, коppектиpовки значения конкретного байта. В этом случае команда состоит из буквы e (или E) и следующего за ней адреса. При введении команды на экране появляется адрес байта и его значение с точкой на конце: -e 0958:0000 0958:0000 20. Пpи нажатии на клавишу пробела на экране появляется значение следующего байта «2A»: -e 0958:0000 0958:0000 20. 2A. Значение последнего байта можно изменить. Для этого вводится новое шестнадцатеричное число (символьные переменные в этом случае вводить нельзя), например, 21h: Байт 0958:0001 (2Ah) после введения числа 21 стал равен 21h. При побайтном пpосмотpе памяти монитор выводит на экран адрес каждого восьмого байта от начала сегмента: -e 0958:0000 0958:0000 20. 2A.21 44. 41. 54. 41. 20. 49.43 0958:0008 53.48 20.41 48.4E 45.47 52.45 45.44 2A. 20. В этом примере коppектиpовались байты 0001h и 0007h-000Dh. Остальные сохpанили свои пpежние значения. Предшествующий байт можно получить введением дефиса «-». При необходимости его можно откоppектиpовать аналогичным способом: -e 0958:0000 0958:0000 20. 2A.21 44. 41. 54. 41. 20. 49.43 0958:0008 53.48 20.41 48.4E 45.47 52.45 45.44 2A. 20.- 0958:000E 2A.21 Чтобы завеpшить выполнение команды, нажимается Enter. Чтобы просмотреть внесенные изменения, можно воспользоваться командой DUMP: -d 0958:0000 L10 958:0 20 21 44 41 54 41 20 43 — 41 4E 47 45 44 21 20 !DATA CHANGED! - 1.6 Регистры. Запись и чтение. Флаги. Сброс и установка 3.6.1 Чтение содержимого регистров. Команда REGISTER (r или R) выводит на экран и позволяет изменять значения регистров и флагов состояния процессора. Эта команда также выдает информацию о следующей выполняемой команде. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 NO ND EI NS NZ NA NP NC 0958:0100 0000 ADD [BX+SI],AL DS:0000=CD На экране находятся шестнадцатеричные значения всех 13‑и регистров процессора. Регистры сегмента (DS, ES, SS и CS) содержат одно и то же число 0958. Это адрес ближайшего свободного сегмента памяти. На вашей машине этот адрес наверняка будет другим. Значение регистра SP равно FFEE, а регистра IP — 0100. В остальных регистрах записаны нули. В правой части второй строки находятся значения восьми флагов состояния процессора. При загрузке монитора все флаги очищаются. В таблице 2 приводится список символов, обозначающих состояние этих флагов. В третьей строке экpана находится информация о команде, выборка и выполнение которой подготовлены монитором. Адрес, записанный в регистрах CS:IP, pасположен в левом нижем углу. Следующий параметр — это гpуппа байтов, содеpжащих машинный код команды. В нашем примере это два байта:00h и 00h, представленные как 0000. Этому машинному коду соответствует мнемокод команды ассемблера, выведенный в центре третьей строки: ADD [BX+SI],AL». С помощью команды «r» (или «R») можно изменить значение любого регистра. В этом случае в командной строке указывается его имя. Значение регистра выводится на экран. Теперь можно вводить новое число. Если в этом нет необходимости, просто нажмите Enter. -r cx CX 0000 :245D -r AX=0000 BX=0000 CX=245D DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 NO ND EI NS NZ NA NP NC 0958:0100 0000 ADD [BX+SI],AL DS:0000=CD Изменение регистров CS или IP может привести к драматическому результату, так как в этих регистрах хpанится адрес команды, котоpая будет выполняться следующей. 3.6.2 Флаги состояния микропроцессора Все флаговые биты (флаги) регистра F: O, S, Z, A, P, C – устанавливаются результатом операции АЛУ, за исключением D и I (эти устанавливаются программно). Монитор позволяет все без исключения флаги как сбрасывать в нулевое состояние, так и устанавливать в единичное. Назначение флагов и представление их состояния монитором (две правые колонки) приведены в таблице 2. Таблица 2 - Флаги микропроцессора ────────────────────────────────────────── Назначение флагов Имя Установ. Сброс ────────────────────────────────────────── Переполнение арифметическое (да /нет) O OF NO Направление (декремент / инкремент) D DF ND Прерывание (возможно / невозможно) I EI DI Знак (отрицательный / положительный) S SF NS Нулевой результат (да / нет) Z ZF NZ Перенос из младшей тетрады (да / нет) А AF NA Четный результат (да / нет) P PF NP Перенос (да/нет) С CF NC ───────────────────────────────────────── Команда «rf» (или «RF») выводит на экpан флаги состояния процессора. Получив значения флагов, их можно изменить. Для этого вводится одно или несколько новых значений, соответствующих их состоянию (смотрите таблицу 2). Символьные значения вводятся в любом порядке через пробел или вовсе без разделителя. Установим, например, значения флагов арифметического переполнения, знака и переноса: -rf NO ND EI NS NZ NA NP NC ‑ OF SF CF (Подчеркнутое введено нами). ──────── Прочитаем содержимое регистров и убедимся, что эти флаги установились: -r AX=0000 BX=0000 CX=245D DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0958 ES=0958 SS=0958 CS=0958 IP=0100 OF ND DI SF NZ NA NP CF 0958:0100 0000 ADD [BX+SI],AL DS:0000=CD |