Dw offset continue ; Смещение

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: