- •140010, Г. Люберцы, Московской обл., Октябрьский пр-т, 403.
- •Глава 1. Архитектура реального режима
- •1.1. Память и процессор
- •Глава 1
- •Глава 1
- •1.2. Распределение адресного пространства
- •Глава 1
- •1.3. Регистры процессора
- •Глава 1
- •Глава 1
- •9 7H Шестнадцатернчное обозначение числа
- •Глава 1
- •1.4. Сегментная структура программ
- •Глава 1
- •Глава 1
- •Глава 1
- •1.5. Стек
- •Глава 1
- •1.6. Система прерываний
- •Глава 1
- •Глава I
- •1.7. Система ввода-вывода
- •Глава I
- •Глава 1
- •Глава 2. Основы программирования
- •2.1. Подготовка и отладка программы
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.2. Представление данных
- •Глава 2
- •Глава 2
- •2.3. Описание данных
- •Глава 2
- •Глава 2
- •2.4. Структуры и записи
- •Глава 2
- •Глава 2
- •2.5. Способы адресации
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 2
- •2.7. Вызовы подпрограмм
- •Глава 2
- •2.8. Макросредства ассемблера
- •Глава 2
- •Глава 2
- •Глава 2
- •Глава 3. Команды и алгоритмы
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •Глава 3
- •3.2. Циклы и условные переходы
- •Глава 3
- •Глава 3
- •3.3. Обработка строк
- •Глава 3
- •3.4. Использование подпрограмм
- •Глава 3
- •Глава 3
- •3.5. Двоично-десятичные числа
- •Глава 3
- •Глава 3
- •3.6. Программирование аппаратных средств
- •Глава 3
- •37Ah Порт управлсш!я
- •Глава 3
- •Глава 3
- •Глава 4. Расширенные возможности
- •4.1. Архитектурные особенности
- •Глава 4
- •4.2. Дополнительные режимы адресации
- •Глава 4
- •4.3. Использование средств 32-разрядных процессоров в программировании
- •Глава 4
- •Глава 4
- •Глава 4
- •4.4. Основы защищенного режима
- •Глава 4
- •Глава 4
- •Глава 4
- •Глава 4
- •Idiv Деление целых чисел со знаком
- •Imul Умножение целых чисел со знаком
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •Into Прерывание по переполнению
- •Iret Возврат из прерывания
- •1 Lods Загрузка операнда из строки : lodsb Загрузка байта из строки lodsw Загрузка слова из строки
- •Операнд
- •Xadd память, регистр
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Содержание
Глава 3
ного интерфейса должен обязательно сопровождаться чтением из его порта данных, так как интерфейс может принять очередной байт данных только после чтения предыдущего и освобождения своего регистра данных.
;Пример 3-12, Программирование мыши в режиме прерываний .586 ;Будут команды новых процессоров
code segment use!6 ;16-разрядное приложение ?
assume CS:code,DS:code ;Данные в сегменте команд
main proc -g
push CS ;Настроим DS i4:
pop DS ;на сегмент команд ::
;Сохраним обработчик прерываний последовательного порта ^
mov AX,350Ch ;Функция 35h, вектор OCh - u
int 21h :,; mov word ptr old_Oc,BX ;Сохраним смещение
mov word ptr old_Oc+2,ES ;Сохраним сегмент w ;Установим наш обработчик прерываний последовательного порта!
mov AX,250Ch ;Функция 25h, вектор OCh /t-
mov DX,ofiset new_0c ;Адрес нашего обработчика г--.
int 21h
;Остановим программу функцией ввода с клавиатуры \ mov AH,01h int 21h восстановим исходный обработчик драйвера мыши
|
mov |
AX,250Ch |
|
Ids |
DX,old Oc |
|
int |
21h |
|
mov |
AX,4COOh |
|
int |
21h |
main |
endp |
|
new_ |
,0c |
proc |
|
pusha |
|
|
push |
DS |
|
push |
ES |
|
mov |
DX,3F8h |
|
in |
AL,DX |
|
cmp |
AL,60h |
;Сохраненный адрес •:J,
;3авершим профамму ';i
;Сохраним все регистры ;Сегментные регистры не сохраняются командой pusha ;Порт данных ; Прочитаем
;Левая клавиша — код 60h je ibtn ;Переход на отработку
cmp AL,50h ;Правая клавиша — код 50h
je rbtn ; Переход на отработку
;3авершение обработчика прерываний outret: pop ES ;Восстановим сегментные
pop DS ;регистры
imov AL,20h ;Команда EOI
out 20h,AL ' ;в контроллер прерываний
рора ; Восстановим все регистры
iret ;Выход и^ прерывания
манды и алгоритмы
157
;Если нажата левая клавиша мыши
Ibtn: mov AH,lEh ;Атрибут символов желтый по
;синему
mov SI,offset msgdn;Aflpec выводимой строки jmp commn ;Ha общую часть вывода
;Если нажата правая клавиша мыши
rbtn: mov AH,2Eh ;Атрибут символов желтый по
; зеленому mov SI,offset msgup;Mpec вьтодимой строки
;Общая часть вывода на экран диагностической строки
commn: |
mov |
mov |
ES,BX |
push |
cs |
pop |
DS |
mov |
CX,6 |
mov |
DI.2000 |
eld |
|
scr: lodsb |
|
stosw |
|
loop |
scr |
jmp |
outret |
BX,OB800h ;Настроим ES ;на видеобуфер ; Настроим DS ;на наш сегмент ;Число выводимых символов ;Смегцение на экране ;Движение вперед ;АЬ=очередной символ ;Из АХ на экран ;Цикл
;После вывода завершить ;обработку прерывания
endp dd
new__0c old Oc
О ;Ячейка для исходного
; вектора
msgdn db
msgup db
code
ends
stk
segment stack
dw 128
dup(O)
stk
ends
end main
"Правая"
Приведенный пример с точки зрения его структуры построен обычным образом. Исходное содержимое вектора ОСЬ сохраняется в ячейке old_0c и используется перед завершением программы для восстановления вектора. Для упрощения установки обработчика прерываний программа написана без сегмента данных; ее немногие данные размещены в сегменте команд. Поскольку в начале программы регистр DS настраивается на сегмент команд, адресация к данным (в основной программе) возможна через DS, Для того, чтобы можно было наблюдать обработку прерываний от мыши, основная программа после выполнения инициализирующих действий останавливается с помощью функции Olh DOS ожидания ввода символа с клавиатуры. После нажатия любой клавиши программа завершается, восстановив предварительно исходное состояние вектора последовательного порта.
158