Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ.doc
Скачиваний:
32
Добавлен:
06.11.2018
Размер:
2.94 Mб
Скачать

Контрольные вопросы

  1. Сколько существует типов сегментов?

  2. Как формируется адрес в реальном режиме?

  3. Как формируется адрес в защищенном режиме (сегментная адресация)?

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

  5. Где хранится селектор и что это такое?

  6. Для чего нужен бит пометки "страница находится в памяти"?

  7. Что представляет собой таблица векторов прерываний в реальном режиме?

  8. Что представляет собой таблица векторов прерываний в защищенном режиме? Как она называется?

  9. Для чего нужны GDT и LDT? Где хранятся указатели на их текущие значения?

  10. Для чего служит максимальный режим работы ЦП и в чем его отличие от минимального режима?

  11. Для чего используется сегментация памяти?

  12. Как изменяется адресация памяти в защищенном режиме?

  13. Для чего служат уровни привилегий и как они используются?

  14. Опишите формат селектора.

  15. Какие типы доступа к сегментам Вы знаете?

  16. Опишите формат дескриптора в виде структуры, используемой в программах.

  17. Что такое дескриптор вектора прерываний и для чего он нужен?

  18. Каким образом и для чего используются шлюзы?

  19. Какие типы дескрипторов шлюзов Вы знаете?

  20. В чем заключается отличие шлюза задачи от шлюза прерывания?

  21. Для чего и как используются ловушки?

  22. Опишите форматы шлюзов.

  23. Какие типы исключений вы знаете?

  24. Поясните структуру таблицы IDT.

  25. В каких случаях ЦП будет генерировать исключение неприсутствующего сегмента?

Раздел 6. Язык ассемблера

6.1. Программирование на языке ассемблера

Язык ассемблера изоморфен машинному языку, т. е. каждому оператору языка ассемблера соответствует, как правило, одна команда процессора. Это позволяет воспользоваться всеми возможностями системы команд ЦП и АП. Практика показала, что язык ассемблера является основным языком программирования контроллеров. Для систем, построенных на основе центрального процессора ЦП и АП, используется язык ассемблера АSМ-86. Программирование ПВВ Intel 8089 осуществляется на языке ассемблера АSМ-89. Рассмотрим основные особенности этих языков.

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

Рассмотрим пример простой программы, блок-схема которой приведена на рис. 6.1. Эта программа суммирует числа, поступающие из порта ввода-вывода port1, в ячейке sum до тех пор, пока накопленное значение sum<100, после чего выводит накопленное значение в port1. Ниже представлен полный текст программы на языке ASM-86 (нумерация строк введена исключительно для дальнейшего пояснения программы):

1 data SEGMENT ; начало сегмента данных

2 sum DB ? ; резервирование байта

3 data ENDS ; конец сегмента данных

4 code SEGMENT ; начало программного сегмента

5 ASSUME cs: code, ; code – имя программного сегмента

ds: data ; data – имя сегмента данных

6 port1 EQU 110h ; port1 – константа 110h

7 Go: mov ax,data

8 mov ds,ax

9 mov sum,0

10 Comp: cmp sum,100

11 jl Next

12 mov al,sum

13 out port1,al

14 hlt

15 Next: in al,port1

16 add sum,al

17 jmp Comp

18 code ENDS ; конец программного сегмента

19 END Go ; конец ассемблирования

Программа состоит из двух сегментов: сегмента данных (строки 1-3) и программного сегмента (строки 4-18). Для определения начала каждого из этих сегментов служит директива SEGMENT, перед которой указано имя сегмента. В строке 1 определяется начало сегмента данных с именем data, а в строке 4 - начало программного сегмента с именем code. Конец каждого сегмента указывается с помощью директивы ENDS (строки 3 и 18), перед которой записывается имя соответствующего сегмента. Сегмент данных состоит из одной строки (строка 2), содержащей директиву DB - определение байта памяти. По этой директиве программа ассемблера резервирует под переменную с именем sum - 1 байт памяти. Директива ASSUME (строка 5) определяет соответствие сегментов и их имен. В строке 6 записана директива EDU, которая порту ввода-вывода port1 ставит в соответствие его номер. В дальнейшем, когда в тексте программы встретится имя port1, программа-ассемблер заменит его на номер 110h.

Рис. 6.1. Блок-схема программы

Строка 7 - это первая строка программы, которая содержит мнемокод команды, т. е. первая команда результирующей программы будет получена при ассемблировании данной строки. Одно из требований к программам, написанным на языке АSМ-86, состоит в том, что первая строка программы, содержащая мнемокод команды, должна иметь метку. В данной программе имя метки Gо. Строки 7 и 8 служат для занесения начального адреса сегмента данных в регистр сегмента данных DS. Поскольку система команд ЦП не содержит команды загрузки константы в сегментный регистр, для этой цели используются две команды. В строке 9 переменной sum присваивается нулевое начальное значение и далее, в строке 10 производится сравнение значения sum со значением 100. В зависимости от результатов сравнения в строке 11 осуществляется переход по условию «меньше» на метку Next. В строках 12 - 14 полученное значение sum выводится в порт ввода-вывода, а в строках 15 - 17 осуществляется суммирование очередного введенного числа и переход на метку Comp в соответствии со схемой программы (рис. 6.1). Строка 18 завершает программный сегмент, а строка 19 содержит директиву END, которая указывает программе-ассемблеру на окончание ассемблирования и снабжается меткой, соответствующей началу программы.

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

имя1 SEGMENT

оператор

оператор

. . .

имя1 ENDS

имя2 SEGMENT

оператор

оператор

. . .

имя2 ENDS

. . .

имя3 SEGMENT

оператор

оператор

. . .

имя3 ENDS

END метка начала

Вторая особенность состоит в том, что два типа операторов (директивы и мнемокоды команд) имеют идентичные форматы (рис. 6.2). Оператор, написанный на языке ассемблера, может быть разделен на четыре поля.

Рис. 6.2. Поля операторов языка ASM-86: а - директив; б - мнемокодов команд

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