Dw 16; Селектор сегмента команд
92 continue:
Инициализация селектора сегмента данных
Mov ax,8; Селектор сегмента данных
Mov ds,ax
Инициализация селектора сегмента стека
Mov ax,24; Селектор сегмента стека
Mov ss,ax
Инициализация селектора ES и вывод символов на экран
Mov ax,32; Селектор сегмента видеобуфера
Mov es,ax
Mov ebx,800; Начальное смещение на экране
Вывод сообщения на экран
Lea esi,mes1
Mov ah,attr
106 screen:
107 mov al,[esi]
Or al,al
Jz scend; Выход, если нуль (терминатор сообщения)
110 mov es:[bx],ax; Вывод символа в видеобуфер
Add ebx,2; Следующий адрес на экране
Inc esi; Следующий символ
Jmp screen; Цикл
Scend:; Конец вывода сообщения
Подготовка перехода в реальный режим
116;*****************************************************
Формирование и загрузка дескрипторов для реального режима
Mov gdt_data.lim,0ffffh; Запись значения
Mov gdt_code.lim,0ffffh; границы в 4 ис-
Mov gdt_stack.lim,0ffffh; пользуемых нами
Mov gdt_screen.lim,0ffffh; дескриптора
Для перенесения этих значений в теневые регистры необходимо
|
|
Записать в сегментные регистры соответствующие селекторы
Mov ax,8; Загрузка теневого регистра
Mov ds,ax; сегмента данных
Mov ax,24; Загрузка теневого регистра
Mov ss,ax; сегмента стека
Mov ax,32; Загрузка теневого регистра
Mov es,ax; дополнительного сегмента
Сегментный регистр CS программно недоступен, поэтому его
Загрузку опять выполняем косвенно с помощью искусственно
Сформированной команды дальнего перехода
Db 0eah; Код команды дальнего перехода
Dw offset go; Смещение
Dw 16; Селектор сегмента кода
Переключение режима процессора
Go: mov eax,cr0; Чтение cr0
And eax,0fffffffeh; Сброс бита 0
Mov cr0,eax; Запись cr0
Db 0eah; Код команды дальнего перехода
Dw return; Смещение
Dw text; Сегмент кода
143;*****************************************************
144;* Теперь процессор опять работает в реальном режиме *
145;*****************************************************
Восстановление операционной среды реального режима
147 return:
Mov ax,data; Инициализация сегментных регистров
Mov ds,ax; данных и
Mov ax,stk; стека
Mov ss,ax; в реальном режиме
Мы не восстанавливает содержимое SP, так как при таком мягком (без
Сброса) переходе в реальный режим SP не разрушается
Разрешение всех прерываний
Sti; Разрешение маск. прерываний
Mov al,0; Сброс бита 7 порта 70 КМОП -
Out 70h,al; разрешение NMI
Вывод сообщения в реальном режиме
Mov ah,9; Вывод сообщения
Mov dx,offset mes; функцией DOS
Int 21h
Ожидание нажатия клавиши
Xor ah,ah
|
|
Int 16h
Завершение программы
Mov ax,4c00h
Int 21h
Main endp
169 code_size=$-main
Text ends
171 stk segment stack 'stack'
Db 256 dup(0)
Stk ends