Выбор режимов адресации, посредством которых будет осуществлен доступ к данным, размещенным в оперативной памяти

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

Режимом адресации называют процедуру нахождения операнда для выполняемой команды. Если команда использует два операнда, то для каждого из них должен быть задан способ адресации, причем режимы адресации первого и второго операнда могут как совпадать, так и различаться. Операнды команды могут находиться в разных местах: непосредственно в составе кода команды, в каком-либо регистре, в ячейке памяти(описание регистров процессора находится в приложении Б).

При реализации задачи буду использовать 3 режима адресации:

— Регистровая адресация

— Прямая адресация

— Индексная адресация

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

Примеры использования регистровой адресации операндов:

dec di; увеличивает содержимое регистра di на 1

mov bx,di; содержимое di засылаем в bx

Прямая адресация (абсолютная) используется в тех случаях, когда явно известен адрес операнда. Адресуется память непосредственным указанием смещения. Адрес ячейки памяти (слова или байта) указывается в команде, обычно в символической форме. По умолчанию считается, что все операнды находятся в сегменте данных, поэтому при вычислении адреса используется текущее содержимое регистра DS. Сегмент можно переопределить. Фактически, прямая адресация — это непосредственное указание смещения d16.

Примеры использования прямой абсолютной адресации:

mov g,si ;запись содержимого регистра si в шестнадцати битную переменную с именем g, расположенную в сегменте данных

mov si,d ; значение шестнадцати битной переменной d заносится в регистр si

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

Примеры использования индексной адресации:

mov al,str[si] ; в регистр al заносится 8-битный элемент из массива str по индексу si

mov mas[si],dl ; в элемент массива mas по индексу si заносится содержимое регистра dl

2.4 Разработка блок-схемы программы

Блок-схема алгоритма решения задачи находится в приложении А.

В ней отображены следующие этапы решения задачи:

  • В массив записывается количество пробелов между слов.
  • Перестановка символов в обратном порядке и перестановка слов в обратном порядке.
  • Вывод получившейся строки на экран.

Реализация

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

3.1 Описание этапов создания программы

Программист использует текстовый редактор (text editor) для написания исходного файла в кодировке ASCII.

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

Объектный файл является основным результатом работы транслятора и представляет собой текст программы, преобразованный в машинные коды. Объектный файл может включать вызовы подпрограмм из внешних библиотек загрузочных модулей. Хотя в этом файле уже присутствуют коды команд, он не может быть выполнен. Для того чтобы получить выполнимую программу объектный файл необходимо скомпоновать.

Компоновка объектного файла выполняется с помощью программы компоновщика (редактора связей) (или загрузчик -linker). Эта программа получила такое название потому, что ее основное назначение – подсоединение к файлу с основной программой файлов с подпрограммами из библиотек и настройка связей между ними. Однако, компоновать необходимо даже простейшие программы, не содержащие подпрограмм, т.к. компоновщик также создает специальный заголовок в начале программы и изменяет формат объектного файла, преобразуя его в выполнимый файл с расширением EXE. Такой файл может быть загружен в ОП и выполнен. Файл с программой компоновщика обычно именуется LINK.EXE.

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

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

(текстовыйредактор)

Рисунок 2 — Цикл трансляции, загрузки и выполнения

Ассемблер дополнительно создает файл листинга, в который копирует исходную программу (в удобном для печати виде), с номерами строк и соответствующими машинными кодами. Загрузчик создает дополнительный файл перекрестных ссылок (map file), в котором находится информация о сегменте кода программы, сегментах данных и стека.

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

Приведем список всех имен файлов, которые создаются при трансляции и компоновке программы.

Таблица1 — Файлы, создаваемые ассемблером и загрузчиком.

Имя файла Описание Этап создания
polusumm.asm Исходнаяпрограмма Редактирование
polusumm.obj Объектныймодуль Трансляция
polusumm.lst Листинг Трансляция
polusumm.exe Выполняемаяпрограмма Загрузка
polusumm.map Файлперекрестных ссылок Загрузка

Файл листинга отображает всю информацию программе, показывая смещение каждой команды, машинные коды, сгенерированные ассемблером, и исходный код программы.

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

3.2 Характеристика полученной таблицы символов

При создании загрузочного модуля формируется таблица со всеми данными, которые используются в программе (рисунок 3).

Рисунок 3 – Таблица символов

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

3.3 Характеристика полученного файла листинга

При реализации задачи получается файл листинга (Приложение Д).

Рисунок 3 – Фрагмент файла листинга

На фрагменте файла листинга (рис. 3) видны следующие столбцы:

1.Номера строк

2.Смещение

3.Машинные коды команд (данных)

4.Мнемоническое представление

3.4 Характеристика полученного загрузочного модуля

При реализации поставленной задачи мы получили загрузочный модуль Zadacha.exe размером равным 1116 байт. Этот файл может быть непосредственно загружен в ОП и выполнен.

3.5 Анализ команд программы

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

Примеры команд, которые применялись при реализации поставленной нам задачи:

1.mov dx,di

Команда MOV замещает операнд-приемник операндом-источником. При этом исходное значение операнда-приемника теряется. Операнд-источник не изменяется. В зависимости от описания операндов, пересылается слово или байт. Команда не воздействует на флаги процессора. В нашем случае значение регистра DX пересылается в регистр DI.

Машинный код команды: 1000 1011 1101 0111

16-ричный код команды: 8BD716

Приемник – регистровая адресация. Источник – регистровая адресация.

Выполним действие:

0000 0000 0000 0000

0000 0000 0000 0010

0000 0000 0000 0010

Рисунок 4 – Выполнение команды mov dx,di

2.cmp di,len

Команда сравнения двух чисел.

Машинный код команды: 1000 0011 1111 1111 0001 0101

16-ричный код команды: 83FF1516

Приемник – регистровая адресация. Источник – прямая абсолютная адресация.

Выполним действие:

_0000 0000 0000 0010

0000 0000 0001 0101

1111 1111 1110 1100

Установим флаги:

CF=1; ZF=0; SF=1; OF=0; PF=1; AF=1

Ответ: FFED16

Рисунок 5 – Выполнение команды cmp di,len

3.jge c4

Короткий переход, если больше или равно.

Машинный код команды: 0111 1101 0000 0010

16-ричный код команды: 7D0216

Рисунок 6 – Выполнение команды cmp di,len

4.inc cx

Увеличивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от ADD приемник,1 состоит в том, что флаг CF не затрагивается. Остальные арифметические флаги (OF, SF, ZF, AF, PF) устанавливаются в соответствии с результатом сложения.

Машинный код команды: 0100 0001

16-ричный код команды: 4116

Регистровый режим адресации.

Выполним действие:

+0000 0000 0000 1101

0000 0000 0000 0001

0000 0000 0000 1110

Установим флаги:

CF=?; ZF=0; SF=0; OF=0; PF=1; AF=0; IF=1; DF=0

Ответ: 0E16

Рисунок 7 – Выполнение команды inc cx

5.xor di,di

Команда выполняет операцию логического исключающего ИЛИ над соответствующими парами битов операндов приемник и источник. Флаги: CF=0, OF=0, PF, AF не определен, ZF, SF.

Машинный код команды: 0011 0011 1111 1111

16-ричный код команды: 33FF16

Регистровый режим адресации.

Выполним действие:

0000 0000 0001 1011

0000 0000 0001 1011

0000 0000 0000 0000

Установим флаги:

CF=0; ZF=1; SF=0; OF=0; PF=1; AF=?

Ответ: 0016

Рисунок 8 – Выполнение команды xor di,di

3.6 Анализ изменения состояния регистра IP при выполнении команд JMP, Jcc, LOOPx

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

cmp cx,0

jz l_str_pust

Режим адресации: прямой относительный режим адресации

Код команды: 7468h; IP1=000D IP2=000F

Короткий переход, если нуль (ZF=1). Если условие истинно переход по адресу IP+Rel8. В данном случае при истинности условия состояние регистра IP будет иметь следующий вид IP=IP+68h.

cmp di,len

jge c4

Режим адресации: прямой относительный режим адресации

Код команды: 7D02h; IP1=002A IP2=002C

Короткий переход, если больше или равно (SF=OF). Если условие истинно переходим по адресу IP+Rel8. В данном случае при истинности условия состояние регистра IP будет иметь следующий вид IP=IP+02h.

cmp di,len

je exit

Режим адресации: прямой относительный режим адресации

Код команды: 742Bh; IP1=0058 IP2=005A

Короткий переход, если равно (ZF=1). Если условие истинно переходим по адресу IP+Rel8. В данном случае при истинности условия состояние регистра IP будет иметь следующий вид IP=IP+26h.

loop b1

Режим адресации: прямой относительный режим адресации

Код команды: E2F9h; IP1=0073 IP2=006E

Основная команда цикла. Выполняет декремент содержимого регистра СХ, анализируя его: если СХ=0, то передает управление следующей команде, иначе передает управление команде, метка которой указана в качестве операнда.

Состояние регистра IP будет иметь следующий вид: IP=IP+F9h.

3.7 Анализ дампа памяти

Дамп сегмента данных:

По адресу 0710:0000 и по 0710:001D находится исходная строка. Далее следуют необходимые для работы программы переменные.

Рисунок 9 – Дамп сегмента данных

Дамп сегмента стека:

Стек в программе используется во время прерываний.

Рисунок 10 – Дамп сегмента стека

Дамп сегмента кодов находится в приложении В.

4 Тестирование

Цель тестирования: проверка работоспособности программы на различных наборах входных переменных.

Разработаю пять тестовых примеров для тестирования реализованной задачи задачи:

Тест 1

Исходная строка: ‘evedfgdsfag 53809 jfdSDmk 43 ‘

Ожидаемый результат: ’34 kmDSdfj 90835 gafsdgfdeve ‘

Результат выполнения программы: ’34 kmDSdfj 90835 gafsdgfdeve ‘

Рисунок 11 – Тест №1

На данном наборе входных значений программа выполняется корректно.

Тест 2

Исходная строка: ‘ fijoei8 1122 90 qwxm cc’

Ожидаемый результат: ‘ cc mxwq 09 2211 8ieojif’

Результат выполнения программы: ‘ cc mxwq 09 2211 8ieojif’

Рисунок 12 – Тест №2

На данном наборе входных значений программа выполняется корректно.

Тест 3

Исходная строка: ‘ 1234 56 88211 99 ‘

Ожидаемый результат: ‘ 99 11288 65 4321 ‘

Результат выполнения программы: ‘ 99 11288 65 4321 ‘

Рисунок 13 – Тест №3

На данном наборе входных значений программа выполняется корректно.

Тест 4

Исходная строка: »

Ожидаемый результат: программа должна вывести сообщение ‘otsutstvuyt simvoli’

Результат выполнения программы: ‘otsutstvuyt simvoli’

Рисунок 14 – Тест №4

В том случае если входная строка будет пуста, программа будет выводить сообщение ‘otsutstvuyt simvoli’.

Тест 5

Исходная строка: ‘1 23’

Ожидаемый результат: ’32 1′

Результат выполнения программы: ’32 1′

Рисунок 15 – Тест №5

На данном наборе входных значений программа выполняется корректно.

Заключение

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

Самостоятельно научился высчитывать предполагаемый размер программы, читать дампы памяти, анализировать состояние регистра флагов.

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

Список использованной литературы

1.А.Н Степанов «Архитектура вычислительных систем и компьютерных сетей», Питер 2007г.

2.А.А. Ровдо «Микропроцессоры от Intel 8086 до Pentium3 и Xeon AMD-K6-3», Москва ДМК 2000г.

3.Б.Я. Цикер, С.А. Орлов «Организация ЭВМ и систем», Питер 2004г.

4.А.Н. Морозевич «Микро ЭВМ, микропроцессоры и основы программирования», Минск Вышэйшая школа 1990г.

5.В.Ф. Шалыгин «Программирование МПС», Москва Высшая школа 1990г.

6.Ю.В. Новиков, П.К. Скоробогатая «Основы МПТ», Москва интернет институт информационных технологий 2003 г.

7.В.И. Бойко и др. «Микропроцессоры и микроконтроллеры», БХВ Петербург 2004г.

Статьи к прочтению:

Вебинар:\


Похожие статьи: