- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Интерфейс с Си
extern caps();
main ()
{
char c;
for(c=’a’; c<=’z’; c++) caps(c);
c = caps (‘z’+1);
caps (c);
caps (‘\n’+32);
}
func segment
public caps
caps proc near
push bp
mov bp,sp
mov DL,[BP]+4 ;взять аргумент
sub DL,32 ;перевести в заглавные
push AX
mov AH,2
int 21h
pop AX
pop BP
ret 2
caps endp
func ends
end
Программы с несколькими сегментами команд.
Рассмотрим программы с расширением ЕХЕ. Любая программа, загружаемая в память, включает три компонента:
окружение ENVIRONMENT
префикс программы PSP
собственно программу, в случае ЕХЕ может состоять из нескольких сегментов.
Поскольку окружение и сама прграмма ( включая РSР) рассматриваются DOS ,как отдельные блоки памяти, и та, и другая структура предворяются блоками управления памяти. МСВ-, размером 16 байт. С помощью этих блоков DOS ведёт учёт свободной и занятой памяти.
-
DS:[2ch], ES:[2Ch]
MCB
Окружение
DS,ES
MCBCS
PSPпрограмма
CS,SS,IP и SP инициализируются заголовками из ЕХЕ-файла.
Рассмотрим … .СОМ программы. В этом случае единственный сегмент содержит все компоненты программы.
-PSP
-коды команд
-данные
-стек
В терминах языков высокого уровня это соответствует минимальной или крошечной модели памяти. Преимущество .СОМ прогр. перед ЕХЕ- компакность. Как правило резидентная программа пишется в формате .СОМ.
IP = 0100h
-
PSP
Программа с данными
SP = 0FFFEh
стек
Формат MCB блока
смещение |
длина |
Содержимое |
0 |
1 |
Тип ‘M’ (2DH) – за этим блоком есть еще блоки MCB Тип ‘Z’ (5AH) – данный блок последний |
1 |
2 |
Владелец (сегм. Адрес) |
3 |
2 |
Размер (число параграфов в памяти) |
5 |
11 |
Зарезервировано |
Если команда помещается в один сегмент команд и данные в одном сегменте данных, то такая .ЕХЕ программа принадлежит к малой модели памяти. Если требуется увеличить объём команд, то необходимо организовать несколько сегментов команд. Программа с несколькими сегментами команд и одним сегментом данных относится к средней модели памяти. В программе, содержащей несколько сегментов команд, должны быть команды либо перехода из одного сегмента в другой, либо вызов процедуры из другого сегмента. Любое обращение к другому сегменту команд носит название межсегментного или дальнего.
Рассмотрим пример программы с двумя сегментами команд. Пусть основная программа в одном сегменте, а процедура-подпрограмма в другом .
text1 segment ‘code’
assume CS:text1, DS:data
main proc
mov AX,data
mov DS,AX
.
.
call far ptr subr1
.
.
call far ptr subr2
.
.
main endp
text ends
text2 segment ‘code’
assume CS:text2, DS:data
subr1 proc far
.
.
subr1 endp
;
subr2 proc far
.
.
subr2 endp
text2 ends
;
data segment
… DB
…DW
.
.
data ends
stack segment stack ‘stack’
DW 128 dup(0)
stack ends
end main
Сегмент команд с главной процедурой получил название text1. Процедуры subr1 и subr2 объявлены с описанием far, а её вызовы в главной процедуре сопровождаются описаниями far ptr (far pointer- дальний указатель). Вызов не call, а call far ptr.
Смещение код команды адрес проц. subr1
000A 9A 0009 4451 call far ptr subr1
1 )CS=444D->в стек
2)IP=000F->в стек
код операции дальнего 3)4451-> в CS
вызова 4)0009-> в IP
ret- работает в зависимости от того, как объявлена процедура
ret-в дальней проц. снимает со стека два слова.
ret-в ближней процедуре снимает со стека одно слово.
Т.о. ближние процедуры следует вызывать только из того же сегмента командой ближнего вызова call, в то время, как процедуры, объявленные, как дальние следует вызывать только с помощью команды дальнего вызова call far ptr. Лишь в этом случае завершающие эти процедуры команды ret будут работать правильно.