2. Система адресации памяти
Как уже было показано в первом вопросе, для совместимости микропроцессоров К580 и К1810 все регистры последнего 16-разрядные. Однако для расширения объема памяти адресная шина имеет 20 разрядов (для сравнения у 8-разрядного МП ША только 16-рназрядная). Для формирования 20-разрядных адресов применяется специальная схема и более сложная система адресации, к рассмотрению которой мы переходим.
Для того чтобы легче было понять систему адресации, применяемую в МП К1810, будем считать, что любая ячейка памяти имеет два типа адресов: физический и логический.
Физический адрес представляется 20-разрядным двоичным числом и однозначно определяет любую из 1Мбайт ячеек памяти. С использованием шестнадцатиричной системы счисления адреса всех ячеек лежат в диапазоне от 00000 до FFFFF. Весь обмен информацией между МП и памятью осуществляется с использованием физических адресов.
В программах чаще используют логические адреса, которые позволяют обращаться к командам без знаний места, где эта команда будет размещена в памяти. Логический адрес состоит из двух составных частей: значения адреса сегмента и значения смещения в сегменте. Адрес сегмента и смещения выражаются 16-разрядными числами.
Как только устройство шинного интерфейса обращается к памяти, формируется физический адрес из логического по следующему правилу: значение адреса сегмента смещается на четыре разряда влево (слева приписывается четыре нуля), и полученное 20-разрядное число (с четырьмя нулями в младших четырех разрядах) складывается со значением смещения (рис.2)
Т
аким
образом,
адрес сегмента (с четырьмя нулями,
добавленными в качестве младших разрядов)
задает в памяти сегменты емкостью 64
Кбайт, а значение смещения в сегменте
- расстояние от начала сегмента до
искомого адреса памяти. Максимально
возможное смещение в сегменте равно
также 64 Кбайт.
В любой момент времени программа может осуществить доступ к одному из сегментных регистров: регистру сегментов программы (кодов) - CS, регистру сегмента данных - DS, регистру сегмента значения стека - SS. Содержание каждого из сегментных регистров может быть изменено за счет записи в них 16-разрядных значений чисел. Деление всего адресного пространства (памяти) на сегменты может производиться произвольно по усмотрению программиста, так что сегменты могут пересекаться в адресном пространстве.
В зависимости от команд устройство шинного интерфейса получает информацию о логическом адресе памяти из различных регистров МП. Коды команд всегда извлекаются из памяти по адресу, определяемому содержанием регистра CS и содержимым программного счетчика, где указывается смещение относительно начала текущего кодового сегмента.
3. Программирование микропроцессора
Для выполнения
набора определенных операций в память
МП з
Таблица 1
Смещение |
К
Таблица 2 |
Коды |
0100 |
00111110 |
3Е |
0101 |
00000001 |
01 |
0102 |
11000110 |
С6 |
0103 |
00000010 |
02 |
0104 |
00110010 |
32 |
0105 |
00000111 |
07 |
0106 |
00000001 |
01 |
Для понимания смысла команды кодовые комбинации заменяются набором букв - мнемоникой. Мнемоника оказывается гораздо проще для запоминания, чем машинные коды. Используя мнемоническое обозначение каждой команды, можно написать программу, которая легко преобразуется в машинные коды с помощью специальной программы - транслятора. Программы, написанные с использованием мнемонических обозначений, называются программами на языке ассемблера.
Та же программа, записанная на языке ассемблера с комментариями, может быть представлена в виде табл. 2
Смещение |
М
Таблица 2 |
Коментарий |
0100 |
МОV AX,01 |
Загрузить в аккумулятор число 1 |
0102 |
ADD AX,02 |
Сложить число 2 с содержимым аккумулятора |
0104 |
MOV 0107,AX |
Переслать содержимое аккумулятора в ячейку 0107 |
Таблица 2
В таблице выделено три поля: смещение команды в рабочем сегменте, мнемоника и комментарии. Поле мнемоники содержит буквенное сочетание, которое указывает операцию для выполнения, а также содержит информацию о регистрах, данных и адресах, используемых в операциях. Поле комментариев позволяет понять последовательность действий в программе.
МП 8086 имеет достаточно развитую систему команд. Однако для построения простейшей программы модели цифрового автомата с жесткой логикой, которая будет исследоваться в ходе лабораторной работы, можно ограничиться использованием только трех типов команд: пересылки, арифметического сложения и передачи управления.
Команды пересылки имеют мнемонику MOV. После кода команды необходимо указать, куда осуществляется пересылка и откуда. Пусть необходимо содержимое регистра ВХ переслать в регистр АХ. Тогда следует указать:
MOV AX, BX.
С помощью данной команды можно осуществить загрузку любого регистра общего назначения (в указанный регистр переслать заданное число). Если, например, необходимо записать в регистр ВХ число 20, то следует указать:
MOV ВХ, 20.
Данная команда позволяет записать число в память или считать его из памяти, если смещение ячейки в сегменте, к которой осуществляется обращение, размещено в регистре ВХ.
MOV AX, [BX] – переслать содержимое ячейки памяти, смещение которой задано в регистре ВХ, в аккумулятор.
Команды арифметического сложения имеют мнемонику ADD. После кода команды необходимо задать адреса операндов. В простейшем случае операнды могут находиться в РОН, причем первое число – в аккумуляторе АХ. Если второе число находится в регистре DX, то тогда команда на сложение этих чисел будет:
ADD AX, DX.
Данная команда позволяет увеличить содержимое одного из РОН на некоторое число, которое непосредственно указывается в команде. Пусть необходимо содержимое регистра ВХ увеличить на 2. Тогда команда запишется в виде:
ADD BX, 2.
Команды передачи управления используются для организации циклов в программе. Наиболее простой и чаще встречаемой является команда безусловного перехода JMP. По этой команде в указатель команд (программный счетчик) заносится число, следующее за кодом команды. Если при выполнении программы встречается команда
JMP 0100,
то содержимое очереди команд обнуляется и следующей будет выполняться команда, записанная по адресу 0100 и далее по порядку.
Для организации циклов используется команда LOOP с указанием адреса. Если записано:
LOOP 0105,
то после декодирования в программный счетчик загружается число 0105 и начинается выполнение команд, расположенных между адресами 0105 и кодом LOOP, причем число повторений цикла определяется содержимым регистра СХ. С каждым повторением цикла содержимое СХ уменьшается на 1. При СХ=0 цикл заканчивается и выполняется команда, следующая за LOOP.
С использованием рассмотренных выше команд разработана программа, моделирующая работу цифрового автомата с жесткой логикой, исследуемого в ходе лабораторной работы. Программа обеспечивает смену кодовых комбинаций в регистре АХ, причем сами комбинации и порядок их
Адрес |
Мнемоника |
Комментарии |
0100 0103 0106 0109
010b 010e
0110 |
MOV AX, 0 MOV BX, 0120 MOV CX, A MOV AX, [BX]
ADD BX, 2 LOOP 0109
JMP 0103 |
Обнулить содержимое регистра АХ. Загрузить в регистр ВХ адрес первого числа. Загрузить в регистр СХ количество чисел 10 (А). Переслать в регистр АХ содержимое ячейки памяти, адрес которой записан в регистре ВХ (первое число). Увеличить содержимое регистра ВХ на 2. Уменьшить содержимое регистра СХ на 1 и если СХ не равно 0, то перейти к выполнению команды по адресу 0109, если СХ=0, выполнить следующую команду. Перейти к выполнению команды по адресу 0103. |
с
Таблица 3
Несмотря на то, что язык ассемблера значительно удобнее, чем машинный, на нем все же трудно писать сложные программы. Для упрощения программирования разработаны языки высокого уровня (Бейсик, Паскаль и др.). Они разработаны на английском языке и не зависят от конструкции и типа микропроцессора. Одна команда на языке высокого уровня соответствует 20 - 30 машинным командам. Для перевода языков высокого уровня в машинный используются достаточно сложные трансляторы.
