Файл: Системное программирование.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.02.2025

Просмотров: 9042

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Системное программирование

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

2. Программная модель микропроцессора 8086

2.1. Представление информации

2.2. Регистры микропроцессора

2.3. Формат машинной команды

2.4. Способы задания операндов команды

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

3. Основные понятия языка ассемблера

3.1. Предложения

3.2. Директивы определения данных

3.3. Выражения

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

4. Сегментированная модель памяти

4.1. Сегментирование адресов

4.2. Директивы сегментации

4.3. Общая структура программы

4.4. Модели памяти

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

5. Основные группы команд

5.1. Соглашению по описанию команд

5.2. Команды пересылки данных

5.3. Арифметические команды

5.4. Логические команды

5.5. Команды переходов

5.6. Команды организации циклов

5.7. Команды обработки строк

5.8. Стековые команды

5.9. Команды ввода-вывода

5.10. Команды прерываний

5.11. Команды управления микропроцессором

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

6. Подпрограммы

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

7. Разработка одномодульной программы

7.1. Трансляция и компоновка программы

7.2. Отладка программы

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

8. Разработка многомодульных программ

8.1. Принципы разработки модулей

8.2. Расширенное применение директивы сегментации

9. Упражнения

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

Программирование микропроцессорных устройств

10. Программирование системного таймера

10.1. Описание таймера-счетчика 8254

10.2. Режимы работы таймера

10.3. Структура регистров таймера

10.4. Упражнения

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

11. Программирование контроллера прерываний

11.1. Механизм обработки прерываний

11.2. Типы прерываний

11.3. Приоритеты прерываний

11.4. Контроллер прерываний 8259

11.5. Идентификация прерываний

11.6. Прерывания bios и ms-dos

11.7. Упражнения

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

12. Программирование параллельного порта

12.1. Интерфейс Centronics

12.2. Работа с параллельным портом на низком уровне

12.3. Стандартные средства работы с параллельным портом

12.4. Упражнения

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

13. Программирование последовательного порта

13.1. Основы последовательной передачи данных

13.2. Последовательный интерфейс rs-232c

13.3. Универсальный асинхронный приемо-передатчик 8250

13.4. Порты асинхронного адаптера

13.5. Стандартные средства программирования последовательного порта

13.6. Упражнения

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

Литература

141 Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета

12.3. Стандартные средства работы с параллельным портом

Для работы с устройством по параллельному интерфейсу в BIOS предусмотрено прерывание INT 17h, которое предоставляет возможность инициализировать ПУ, передавать данные побайтно и получать информацию о его состоянии. Определить адрес порта LPT4 BIOS не может. Параметры для вызова функций 17h приведены в табл. 101.

Слово состояния содержит биты 1..7 регистра состояния указанного порта, а бит 0 является флагом тайм-аута. Если он установлен, то ПУ не снимет сигнал BUSY в течение времени, заданного в соответствующей переменной BIOS.

Табл. 101. Функции INT 17h.

Функция

Регистры при вызове

Регистры при возврате

Вывод байта данных.

AH = 00h

AL = выводимый символ

DX = номер принтера [0,1,2]

AH – слово состояния

Инициализация ПУ.

AH = 01h

DX = номер принтера [0,1,2]

AH – слово состояния

Получить состояние ПУ.

AH = 02h

DX = номер принтера [0,1,2]

AH – слово состояния

Функция 01h выполняет аппаратный сброс принтера. Обычно принтер приходиться сбрасывать перед настройкой на заданный режим работы (например, при загрузке шрифта). Функцию 02h используют перед началом печати для определения готовности принтера к работе и после вывода байта данных для проверки. После ее выполнения регистр AH будет содержать слово состояния (табл. 102).

Табл. 102. Слово состояния.

Бит

Назначение

7

1 – принтер готов;

0 – принтер занят.

6

Подтверждение.

5

Конец бумаги.

4

1 – принтер выбран для работы

0 – принтер в состоянии OFFLINE.

3

Ошибка ввода-вывода.

2

1

0

«Тайм-аут», слишком большая

задержка при выполнении операции.


Операционная система MS-DOS предоставляет в распоряжение функцию 05h прерывания INT 21h для печати символа на стандартном печатающем устройстве LPT1 (PRN). В регистр AH заносится значение 05h, в регистр DL – ASCII-код символа для печати, на выходе регистр AH будет содержать слово состояния принтера.

12.4. Упражнения

Пример 1. Определить базовый адрес порта LPT1.

Решение. Для получения базового адреса порта LPT1 необходимо прочитать содержимое ячейки памяти BIOS, расположенной по адресу 0040:0008h. Полученное значение сохраним в переменной LPT1, определенной в сегменте данных, и имеющей размер слова.

PUSHDX; сохранить в стеке содержимое регистра DXMOVAX, 40h ; поместить в AX адрес начала сегмента 0040hMOVES,AX; передать содержимое AX в сегментный регистрESMOVDX,ES:[08] ; прочитать по адресу 0040:0008h базовый адрес порта LPT1MOVLPT1,DX; сохранить адрес порта в переменнойLPT1POPDX; восстановить прежнее содержимое регистра DX из стека

Пример 2. Используя ассемблер TASM, разработать программу передачи символьной строки в параллельный порт на низком уровне.

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

Для вывода одного символа в порт необходимо вначале получить состояние статусного регистра SR и проверить самый старший бит (BUSY). Если он равен 0 (принтер занят), следует организовать цикл опроса регистра SR до достижения готовности принтера. При готовности принтера код выводимого символа передается в регистр данных DR. Затем необходимо последовательность стробирующих импульсов передать в самый младший разряд (STROBE) регистра управления CR.


Рис. 47. Алгоритм вывода строки в параллельный порт.

Пример программы вывода строки в параллельный порт приведен ниже.

DATASEGMENT; выводимаяASCII-строка strDB'Тест принтера', 0Dh, 0Ah, 0

; переменная для хранения базового адреса LPT1

LPT1 DW 0

DATA ENDS

STACK SEGMENT STACK

DB 128 DUP(?)

STACK ENDS

CODE SEGMENT ASSUME CS: CODE, DS: DATA, SS: STACK, ES: DATA

MOV AX, DATA MOV DS, AX ; устанавливаем регистр DS на сегмент данных PUSH DX ; сохранение в стеке содержимого регистра DX MOV AX, 40h MOV ES, AX ; регистр ES указывает на область данных BIOS MOV DX, ES:[08] ; помещаем в регистр DX базовый адрес порта LPT1 MOV LPT1, DX

MOVBX,OFFSETstr ; помещаем в регистрBXсмещение выводимой строкиPOPDX; восстановление в стеке содержимого регистра DX loop1: ; цикл печати строкиMOVAH,DS:[BX] ; получаем очередной символ строкиCMPAH, 0h ; проверка конца строкиJEexit ; да, выходимCALLOUTBYTE; нет, печатаем очередной символINCBX; переходим на следующий символJMPloop1 ; повторяем, пока не будет достигнут конец строки exit:MOVAX, 4c00h ; завершить программу с кодом возврата 0INT21h ; выполнение прерывания 21h

OUTBYTEPROC; процедура вывода символа изALна принтер

PUSHDXloop2: ; цикл ожидания готовности принтераMOVDX,LPT1INCDX; адрес регистра состоянияLPT1+1INAL,DX; чтение регистра состоянияTESTAL, 80h ; проверка сигналаBUSY(«1» - принтер готов)JZloop2 ; если нет, то повтор опросаDECDX; адрес регистра данныхMOVAL,AHOUTDX,AL; запись байта в регистр данныхINCDXINCDX; адрес регистра управленияLPT1+2INAL,DX; чтение регистра управления и формирование стробаANDAL, 11111110b ; бит 0 (STROBE):=0OUTDX,AL; запись в регистр управленияORAL, 00000001b ; бит 0 (STROBE):=1OUTDX,AL; запись в регистр управленияANDAL, 11111110b ; бит 0 (STROBE):=0OUTDX,AL; запись в регистр управленияPOPDXRET

ENDP

CODEENDS

END

В начале программы описан сегмент данных, содержащий выводимую ASCIIZ-строку и переменную LPT1 размером слово для хранения базового адреса порта LPT1. В сегменте кода вначале определяется базовый адрес порта LPT1, а затем выполняется цикл LOOP1 побайтного вывода строки, условие завершения для которого – текущий символ равен 0.

Вывод символа производится процедурой OUTBYTE. На момент вызова процедуры код выводимого символа должен находиться в регистре AL. В самой процедуре считывается регистр SR и проверяется его разряд BUSY. Если принтер занят, организуется цикл LOOP2, в котором повторяется опрос регистра SR до достижения готовности принтера. Затем в регистр DR записывается код символа, а последовательность стробирующих импульсов – в разряд STROBE регистра CR.


Пример 3. В решении задачи 2 цикл ожидания готовности принтера может продолжаться бесконечно долго, если по какой-либо причине он держит на линии сигнал BUSY. Для устранения «зависания» в цикле LOOP2 выполните привязку к таймеру для проверки времени ожидания и, в случае ожидания более чем на 15÷20 сек, выведите сообщение о неготовности принтера к работе. Кроме того, после определения базового адреса выполните проверку, не равен ли он 0 (признак отсутствия LPT порта).


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

  1. Какие существуют разновидности интерфейса Centronics?

  2. Опишите передачу данных по интерфейсу Centronicsс помощью временной диаграммы.

  3. Опишите работу с параллельным портом на низком уровне.

  4. Какие средства работы с параллельным портом предоставляет BIOSиMS-DOS?

13. Программирование последовательного порта

13.1. Основы последовательной передачи данных

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

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

Первичная скорость изменения электрических характеристик сигнала в канале связи выражается в бодах (по фамилии французского изобретателя телеграфного аппарата Emile Baudot – Э.Бодо). Скорость передачи в бодах есть число потенциально реализуемых переходов между различными состояниями каналами за единицу времени независимо от числа состояний и их интерпретации.

Каждое возможное изменение состояния канала называется элементарным сигналом, а быстродействие канала выражается числом таких сигналов: 1 бод = 1 сигнал в секунду. В то же время, скорость передачи битов есть число информационных двоичных разрядов, передаваемых по каналу за единицу времени. Скорость передачи выражается в битах в секунду (бит/с.). По этой причине, при представлении элементарного сигнала двумя или более двоичными разрядами эти две скорости принципиально различны.

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

Сигнал на линии может быть высокого или низкого уровня, что соответствует логическим нулю и единице, и говорят, что линия отмечена (MARK), когда уровень высокий, и пустая (SPACE), когда уро­вень низкий. В отсутствии передачи данных линия поддерживается в состоянии MARK.