
- •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
mov int call mov
AH,02h lAli
add_time AH,06h
;Чтение текущего времени
;Прибавим I секунду ;Установим будильник на это ; время int lAli ;Остановим программу, чтобы наблюдать прерывания
mov AH.Olh ;Функция ввода с клавиатуры
int 2Ш ;3авершим программу, прибрав за собой
;Сброс будильника
;О5:ОХ=исходный вектор ;Установим исходный вектор
;Завершим программу
mov AH,07h
int lAli
Ids DX,old_4a
mov AX,254Ah
int 21h
mov AX,4COOh
int 21h main endp
;Наш обработчик прерывания от будильника
new_4a proc
;Сохраним все регистры ;Сохраним еще и ;сегментные регистры ;Настроим DS на наш ;сегмент данных ;Прочитаем текущее время ;из часов реального времени ;Сохраним полученное ;тскущее время
pusha
push DS
push ES
mov AX,seg hour
mov DS,AX
mov AH,02h
hit lAli
push CX
push DX
;Преобразуем время из двоично-десятичных упакованных
;чисел в строку символов ASCII
mov AL,CH ;Перенесем часы в AL
call conv ;Преобразуем старшую цифру
mov hour,AH ;в ASCII и сохраним
and CH,OFh ;Вьщелим младшую цифру
add CH,'0' преобразуем в ASCII
mov hour+l.CH . ;и сохраним
mov AL,CL ;Перенесем минуты в AL
call conv ;Преобразуем старшую цифру
mov min,AH ;в ASCII и сохраним
and DL,OFh ;Выделим младшую цифру
add DL,'0' ;Преобразуем в ASCII
mov min+l,CL ;и сохраним
mov AL,DH ;Перенесем секунды в AL
call conv ;Преобразуем старшую цифру
mov sec,AH ;в ASCII и сохраним
и алгоритмы
143
and DH,OFh ;Выделим младшую цифру
add DH,"0' ;Преобразуем в ASCII :
mov sec+l,DH ;и сохраним
;Вьшедем сформированную строку на экран
mov AX,OB800h ;Настроим ES на сегмент
mov ES,AX видеопамяти
mov DI,160-16 ;Смещение к 72-му знакоместу
mov SI,offset 1юиг;О8:81->строка с временем
mov CX,8 ;Цикл по 8 символам
mov AH,14h ;Атрибут красный по синему
eld ;Движение вперед
screen: lodsb ;Очередной символ в AL
stosw ;Символ+атрибут на экран
loop screen ;Цикл
;Сбросим будильник и установим снова на время через 1с
mov AH,07h
hit lAh
; Вернем сохраненное в стеке ;текущее время ;Прибавим 1 секунду ;Установим будильник на ;время через 1 секунду восстановим сохраненные ;ранее сегментные регистры восстановим все регистры ; Выход из обработчика
pop DX
pop CX
call add_time
mov AH,06h
int 1AU
pop ES
pop DS
popa
iret
new_4a endp
;Подпрограмма прибавления 1 секунды к текущему времени. ;В большинстве случаев достаточно увеличить число секунд ;на 1, но в конце минуты надо увеличить на 1 число минут, ;а в конце часа — увеличить на 1 число часов add_time proc ;Прибавим 1 к числу секунд
mov AL,DH ^Перенесем секунды в AL
call add_unit ;Прибавим I
mov DH,AL ;Перенесем назад в DH
jnc ok ;Если CF=0, на выход
;CF=1, прибавим 1 к числу минут
mov AL,CL ;Перенесем минуты в AL
call add_umt ;Прибавим 1
mov CL.AL ;Перенесем назад в CL
jnc ok ;Если CF=0, на выход
;Перенос, прибавим 1 к числу часов
mov AL,CH ;Перенесем часы в AL
call add_imit ;Прибавим 1
mov CH.AL ;Перенесем назад в СН
144