- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Сегментная память
Программный код, данные и стек можно, например, распределить следующим образом:
В общем случае любой МП (в том числе и 8086) выполняет следующие шаги:
1).Выборка следующей команды по адресу и РС;
2).Загрузка в регистр команды и дешифрация с одновременным инкриментом РС для адресации следующей команды;
3).Выполнение команды, а в случае перехода загрузка в РС адреса перехода;
4). Повторение шагов 1-3.
Однако в МП 808 имеются некоторые отличия и совмещения нескольких операций.
Адрес следующей команды равен (IP)+(CS)16.
Регистр команды представлен 6-байтной очередью FIFO, которая непрерывно заполняется, когда системная шина не требуется для других операций. Такое «опережение» значительно повышает производительность МП, так как к моменту завершения текущей команды, следующая чаще всего уже находится в конвейере. В случае перехода очередь сбрасывается и не дает экономии времени, но в среднем это происходит нечасто.
Длина команды от 1 до 6 байт. Если слово находится по четному адресу, то оно считывается уеликом, если по нечетному, то за два раза.
Рассмотрим заполнение ковейера последовательно: 1-байтная команда, 2-байтная команда и 3-байтная команда. Предположим, что эта последовательность начинается по четному адресу:
-
Загрузка
3-я выборка
3-я команда
2-я выборка
2-я команда
1-я выборка
1-я команда
Очередь команд (конвейер)
Эта же последовательность, но начинается с нечетного адреса:
-
Загрузка
4-я выборка
не начинается до освобождения в очереди слова
3-я команда
3-я выборка
2-я выборка
2-я команда
1-я выборка
1-я команда
Очередь
Последний байт не передается, пока в очереди не образуется пустого слова.
1
code_seg segment
org 100h
start:
mov AH, 2h
mov DL, 2Ah
int 21h
int 20h
code_seg ends
end start
2
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’
begin:
mov AH, 9h
lea DX, mes
int 21h
int 20h
code_seg ends
end start
3
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’
begin:
mov Ah, 9h ; Функция DOS для вывода строки символов
; $ - ограничитель строки
lea DX, mes
int 21h ; print string
;
mov BL, 0Fh
mov AH, 02
mov DL, BL
add DL, 30h
cmp DL, 3Ah
jl print
add DL, 07h
print:
int 21h
int 0h
code_seg ends
end start
4
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’
begin:
mov Ah, 9h ; Функция DOS для вывода строки символов
; $ - ограничитель строки
lea DX, mes
int 21h ; print string
;
mov BL, 0AFh
mov AH, 02
mov DL, BL
call print_hex
mov DL, BL
call print_hex
int 20h
print_hex:
and DL, 0Fh
add DL, 30h
cmp DL, 3Ah
jl print
add DL, 07h
print:
int 21h
code_seg ends
end start
5
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
mes: DB 13, 10, ‘Привет, я печатаю HEX содержимое регистра BL’, 13, 10, ‘$’
begin:
mov Ah, 9h ; Функция DOS для вывода строки символов
; $ - ограничитель строки
lea DX, mes
int 21h ; print string
;
mov BL, 0Fh
mov AH, 02
mov DL, BL
add DL, 30h
cmp DL, 3Ah
jl print
add DL, 07h
print:
int 21h
int 20h
code_seg ends
end start