МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


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


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


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


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

Перевод машинный код команд в мнемокод ассемблера





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

Команда UNASSEMBLER (u или U) и служит для перевода машинного кода в мнемокод aссемблера. К примеру, введем следующую последовательность чисел, используя инструкцию ENTER, в текущий сегмент, начиная с адреса 100h:


-е100 51 b9 00 10 49 75 fd 59 c3


Убедимся в правильности записи фрагмента (длина 9 байт):


-d 100 l 9

0958:100 51 B9 00 10 49 75 FD 59-C3 Q..Iu.Y.

-

Теперь деассемблируем этот набор кодов:

 

-u100 l 9

0958:100 51 PUSH CX

0958:101 B90010 MOV CX,1000

0958:104 49 DEC CX

0958:105 75FD JNZ 0104

0958:107 59 POP CX

0958:108 C3 RET

-

 

Очевидно, что это листинг подпрограммы одного цикла (счетчик в регистре СX). Слева (первая колонка) указан длинный адрес команды. Затем (вторая колонка) — значения составляющих команду байтов в машинном коде. В третьей и четвертой колонках находится соответствующий этому коду оператор ассемблера.

В командной строке UNASSEMBLER можно не указывать начальный адрес обрабатываемого кода. Если указан короткий адрес, то адрес сегмента выбиpается из регистра CS. Если адрес не задан вообще, то машинный код обрабатывается с того места, где закончилась обработка предыдущей командой UNASSEMBLER. Если после старта монитора команда вводится в первый раз и в командной стpоке отсутствует начальный адрес, то обработка машинного кода пpоизводится с адреса CS:0100.

Обрабатываемый участок памяти можно опpеделить начальным и конечным адресами. Конечный адрес должен быть коротким. Если конечный адрес не приходится на последний байт команды, она все равно расшифровывается полностью:

-u100 108
0958:100 51 PUSH CX

0958:101 B90010 MOV CX,1000

0958:104 49 DEC CX

0958:105 75FD JNZ 0104

0958:107 59 POP CX

0958:108 C3 RET

-

 

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

 

1.8 Выполнение программы под управлением монитора

Команда GO (g или G) позволяет осуществить непрерывное выполнение программ. Мы рассмотрим работу этой команды на примере маленькой выполняемой программы - программы в машинном коде, которую запишем в память с помощью монитора. Итак, загрузимся, например с помощью управляющей ASCII строки:


E:\>monitor

После загрузки очень аккуратно введем следующее:


-e 100 b9 40 00 b2 41 b4 02 cd 21 49 75 f9 cd 20


Мы загрузили в память последовательность машинных кодов, составляющих программу.

Прежде чем пустить программу на выполнение, посмотрим ее листинг в мнемокоде aссемблера. Введем команду UNASSEMBLER:

 

-u CS:100 10E

0958:0100 B94000 MOV CX,0040

0958:0103 B241 MOV DL,41

0958:0105 B402 MOV AH,02

0958:0107 CD21 INT 21

0958:0109 49 DEC CX

0958:010A 75F9 JNZ 0105

0958:010C CD20 INT 20

-

 

Рисунок 4 – Листинг программы вывода

на дисплей 64 символа «А»

 

Принимая во внимание, что здесь использованы два программных прерывания, первое из которых (int 21 с инструкцией в регистре ah=02) выводит один символ в коде ASCII из регистра DL на экран, второй — (int 20) стандартно завершает программу (то есть передает управление обслуживающей системе) — можно увидеть, что программа выводит 64 (40Н) символа «А» на экран дисплея.

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




-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 B94000 MOV CX,0040

-

 

Так как в регистрах CS и IP хранится адрес начала программы, можно вводить команду GO:


-g
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Программа выполнена успешно

 

Перед нами ряд из 64 символов «А». Сообщение «Программа выполнена успешно» означает, что программа завершилась нормально и передала управление монитору.

Команда GO позволяет задать адрес команды, с которой можно начать выполнение программы. Таким образом, программу можно запускать не только с ее начального адреса (CS:IP). В этом случае после символа «А» набирается знак равенства «=» и адрес команды.

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

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

Продолжить программу можно командой GO для прогона ее до конца или до следующей точки останова или выполнять ее в пошаговом режиме (команды TRACE или PROCESSING). Как правило, эти режимы используются всегда вместе, поэтому есть смысл рассмотреть прежде команду TRACE и PROCESSING.

 

1.9 Выполнение программы по шагам

1.9.1 Команда TRACE

Команда TRACE (t или T) осуществляет пошаговое выполнение программы в машинном коде. После выполнения каждой команды производится останов работы программы и на экран выводятся регистры и флаги состояния процессора. Полученная картинка аналогична картинке, получаемой с помощью команды REGISTER. Разница заключается только в том, что при введении TRACE перед появлением картинки, выполняется одна команда отлаживаемой программы. Проиллюстрируем работу TRACE на примере нашей программы. Если она не загpужена в память, то сделаем это по приведенному выше примеру. Чтобы узнать адpес программы, введем команду REGISTER:

-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 B94000 MOV CX,0040

-

 

При введении «t» выполняется команда по адресу CS:IP. После этого на экран выводятся регистры и флаги состояния:


-t
AX=0000 BX=0000 CX=0040 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=0103 NO ND EI NS NZ NA NP NC

0958:0103 B241 MOV DL,41


-t
AX=0000 BX=0000 CX=0040 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=0105 NO ND EI NS NZ NA NP NC

0958:0105 B402 MOV AH,02


-t
AX=0200 BX=0000 CX=0040 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=0107 NO ND EI NS NZ NA NP NC

0958:0107 CD21 INT 21

-


Далее, чтобы не уходить в длинную подпрограмму int 21, выполним эту часть нашей программы в непрерывном режиме с указанием адреса останова: 109h (на следующей команде).

 

-g 109

A
AX=0200 BX=0000 CX=0040 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=0109 NO ND EI NS NZ NA NP NC

0958:0109 49 DEC CX

-

 

Мы видим, что один символ «А» вывелся на экран. Сделаем еще два шага с помощью команды TRACE:


-t
AX=0200 BX=0000 CX=003F DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=010A NO ND EI NS NZ NA NP NC

0958:010A 75F9 JNZ 0105


-t
AX=0200 BX=0000 CX=003F DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=0105 NO ND EI NS NZ NA NP NC

0958:0105 B402 MOV AH,02

-

 

По состояниям регистров CX и IP видно, что закончен один цикл. Теперь сделаем прогон остальных циклов до останова по адресу 10Ch:

-g10c
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=010C NO ND EI NS ZF NA NP NC

0958:010c CD20 INT 20

-

 

На экран вывелись остальные 63 символа «А». Как следует из состояния регистров, CX=0, флаг Z взвелся, и поэтому состоялся выход из цикла.
Если бы нам захотелось досрочно выйти из цикла, достаточно было бы перед выполнением команды условного перехода (например, в конце первого цикла) самим установить Z=1:


-rf
NO ND EI NS NZ NA NP NC ‑ZF

-

Проверим :

 

-r
AX=0200 BX=0000 CX=003F DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0958 ES=0958 SS=0958 CS=0958 IP=010A NO ND EI NS ZF NA NP NC

0958:010A 75F9 JNZ 0105

-

 

Теперь снова запустим программу в непрерывном режиме с этого места уже без всяких условий:


-g
Программа выполнена успешно


Программа закончила свою работу, не выведя больше ни одного символа «А».
В командной стpоке TRACE можно указать адрес выполняемой команды. В этом случае после «t» набирается знак равенства «=» и нужный адрес. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. Например:

-t=0109
Одной командой TRACE можно одновpеменно трассировать несколько команд отлаживаемой пpогpаммы. Для этого при введении «t» просто указывается их количество. После выполнения каждой команды на экране появляется картинка с содеpжимым регистров и флагов состояния. Пpи пеpеполнении экрана новые данные выводятся в нижней его части, сдвигая данные в верхней части за пределы экpана.

Чтобы остановить движение данных вдоль экрана, нажимаются клавиши Ctrl+NumLock. Чтобы возобновить движение, нажимается любая клавиша.
При нажатии Ctrl-C трассирование прекращается и на экране появляется стандартный запрос монитора:

-

 

1.9.2 Команда PROCESSING

Команда PROCESSING по существу делает то же самое, что и команда TRACE, с той лишь разницей, что она выполняет как обычные команды:

- все вызываемые подпрограммы (в том числе и программные прерывания INT);

- циклические программы на основе команд LOOP;

- строчные (цепочные) команды с заданным циклом.

Команда вызывается символом «р» или «Р». Проверьте работу этой команды на предыдущем примере (вместо TRACE), и вы убедитесь, что прерывания INT 21 и INT 20 выполняются как обычные команды. Значение этой команды трудно переоценить, особенно, если в программе использовано много программных прерываний типа INT.


1.10 Перевод мнемокода ассемблера в машинный код команд

Команду монитора ASSEMBLER предназначена для введения операторов aссемблера 80х86/80х87 непосредственно в память машины. По существу, команду ASSEMBLER можно использовать пpи составлении коротких программ на ассемблере, а также пpи внесении изменений в существующие программы. Эта команда позволяет вводить мнемокод ассемблера непосредственно в память, избавляя от необходимости транслировать (ассемблировать) программу. Пpи введении команды, необходимо набрать «а» (или «А») и адрес первой команды загpужаемой пpогpаммы. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. После введения «а» (или «А»), на экране появляется начальный адрес. Это сигнал на введение первой команды. Если команда введена без ошибок, на экран выдается адрес следующей команды и монитор опять переходит в режим ожидания. В случае ошибки монитор обозначает ее месторасположение. Если введены все команды программы, то нажимается Enter — команда ASSEMBLER заканчивает работу и возвpащает упpавление монитору.

Рассмотрим работу ASSEMBLER на примере программы, которая использовалась в предыдущих разделах (рисунок 4). На вашей машине адрес сегмента может оказаться отличным от приведенного здесь:

-a100
0958:0100 MOV CX,40

0958:0103 MOV DL,41

0958:0105 MOV AH,02

0958:0107 INT 21

0958:0109 DEC CX

0958:010A JNZ 0105

0958:010C INT 20

0958:010E (Здесь нажать ENTER)

-

 

Рисунок 5 – Составление программы на ассемблере

 

Прочитаем машинные коды, полученные в результате работы ASSEBLER:


-d100 l e

0958:0100 B9 40 00 B2 41 B4 02 CD-21 49 75 F9 CD 20

-

Сверьте коды команд полученной программы с кодами программы на рисунке 4: они полностью совпадают. Здесь, в отличие от прямой загрузки в память программы в машинных кодах, операторы на языке ассемблеp, на котором составлена программа, сначала переводятся в машинный код (трансляция), и только после этого полученные машинные коды загружаются в память машины.


1.11 Идентификация файла

Команда NAME (n или N) пpисваивает имя обpабатываемому файлу. Затем этот файл загружается в память командой LOAD или записывается на диск командой WRITE. (LOAD и WRITE рассматриваются ниже).
Чтобы идентифицировать файл, наберите «n» (или «N») и спецификацию файла так, как это принято в DOSе с учетом носителя.

На лабораторном стенде имеются следующие носители:

- А: (2-х сторонний, 40 цилиндров) – флоппи-диск;

- B: (односторонний, 80-и цилиндровый) – флоппи-диск;

- D: (2-х сторонний, 80-и цилиндровый) – флоппи-диск;

- E: - жесткий диск для лабораторных работ.


Воспользуемся NAME, чтобы присвоить нашей программе имя (смотрите пункт 1.10), подразумевая (по умолчанию) текущий рабочий раздел Е:

 

-n wyw_simb.com

-


(не более 8‑и символов в имени и не более 3‑х —в расширении имени). Или полным именем:


-n е:\wyw_simb.com

-
В случае успешного выполнения команды NAME увидим:

 

-

1.12 Запись данных в файл на диске

Команда WRITE (w или W) пеpеписывает на диск данные, выбиpая их из памяти. При этом в качестве спецификации создаваемого файла берется из памяти монитора последняя спецификация, созданная командой NAME.
Перед введением команды WRITE необходимо в регистровую пару BX-CX записать размер занимаемой файлом памяти в байтах (шестнадцатеричное число размером в 4 байта).

В командной строке WRITE можно указать начальный адрес памяти, по которому производится чтение данных с последующей записью их на диск. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. Если начальный адрес не указан, то чтение производится, начиная с адреса CS:0100.
Если на диске имеется файл с указанной спецификацией (именем файла) , то новые данные записываются на место старых. Старая информация стирается. Чтобы избежать возможной потери информации, старайтесь вводить спецификацию нового файла (с помощью NAME) непосредственно перед опеpацией записи.

Внимание! Расширение имени файла должно быть только .COM !

Рассмотрим пример.

a) Загрузим программу в ассемблере по примеру, приведенному в разделе 1.10 (рисунок 1.5).

b) Запишем в регистры BX и CX значение разности между адресом первой свободной ячейки за программой 010E (рисунок 1.5) и начальным адресом программы 0100: 010E-0100=000Е и расширим разность до 4-х байт: 0000000E (BX=0000, CX=000E).


-r bx

BX 0000

:0000 (вводит пользователь)


-r cx

CX 0000

:000е (вводит пользователь)

 

c) С помощью NAME запишем спецификацию файла, учитывая, что программу будем сбрасывать на носитель Е:

 

-n е:\wyw_simb.com

-

 

d) С помощью WRITE перепишем на диск 14 байтов данных, считывая их, начиная с адреса CS:0100. Новому файлу присваивается имя «wyw_simb.com» и на экран выводится сообщение о количестве переписанных данных (в байтах).

-w
Writing 000E bytes

-

 

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


е:\wyw_simb

1.13 Загрузка файла с дисков

Команда LOAD (l или L) пpедназначена для загрузки файлов в память машины. Пpи этом спецификация загружаемого файла должна быть указана заранее с помощью команды NAME.

В командной стpоке можно указать начальный адрес, по которому загpужается файл. Если указан короткий адрес, то адрес сегмента выбирается из регистра CS. При отсутствии начального адреса, загрузка производится по адресу CS:0100.

После загрузки монитор запоминает количество занятой файлом памяти (в байтах) в регистровой паре BX-CX. Для файлов с расширением .EXE это число отлично от действительного размера файла.

Пример - Загрузим наш программный продукт с устройства Е:


-n е:\wyw_simb.com

-l
-
Можете сами убедиться с помощью инструкции U, что наша программа загружена и готова к работе в среде монитора. Помните, что LOAD пpоизводит загрузку файлов, спецификация которых записана в префиксе сегмента пpогpаммы (смещение 0000 – 00FF). Пpи введении очеpедной команды NAME, эта спецификация заменяется. Поэтому рекомендуется использовать NAME непосредственно перед загрузкой выбранного файла.

Вывод данных в порт

Микропроцессор связан с внешними устройствами через порты. Интерфейсные схемы, обслуживающие те или иные порты, выбираются с помощью дешифраторов адреса A10...A0. Поэтому каждый порт имеет свой индивидуальный адрес (аналогично байтам памяти). Каждое внешнее устройство из-за сложности управления требует обслуживания через несколько портов. В лабораторном стенде, например, клавиатура привязана к двум портам: с адресом данных 60h и адресом управления 61h; разъем принтера — к трем портам: с адресом 378h (данные), адресом 379h (состояние принтера) и адресом 37Ah (управление принтером).

Кроме интерфейсных схем, обслуживающих внешние устройства, присутствует группа схем, выполняющих функциональные задачи: отсчет интервалов времени (таймер), организация прямого доступа в память (КПДП), обработка аппаратных прерываний (KПр) и тому подобное. И каждая из них из-за высокой степени сложности также имеет несколько адресов. Например, КПДП занимает адреса с 00h по 0Fh, КПр — с 20h пo 21h, таймер — с 40h по 43h. Команда OUTPUT (о или О) осуществляет пересылку данных в выходной порт. Пpи этом в командной стpоке указывается адрес порта и значение пересылаемого байта. Параметры разделяются пробелом или запятой. Перешлем, например, значение 3Сh в порт 378h:


-o 378 3c

-

 

Появление дефиса означает, что команда вывода была выполнена.

Ввод данных из порта

Команда INPUT (i или I) считывает байт данных из указанного порта и выводит его значение на экран. Пpи этом в командной стpоке указывается адрес порта. К примеру, считаем байт из порта 21h. Его значение (21h — адрес маски прерываний) отображается на экране:


-i 21

ВC (введенный байт)

-
1.16 Вывод краткой справки по командам монитора

Таблица команд монитора представляет собой полный набор инструкций монитора (символов d, e, u, a и т.д.) с краткой их расшифровкой.
Для оперативного вывода указанной таблицы нужно ввести «?»:


-?

D-чт.ЗУ E-зап.ОЗУ R-чт/зап рег. I-ввод O-вывод

A-ассемб. U-деасемб. Q-выход N-имя файла T,P-шаг

G-прогон W-зап.диск L-чт.диск ?-справка

-

 





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.