Системное программное обеспечение. Особенности программирования 32-разрядных процессоров. Рощин А.В. - 21 стр.

UptoLike

Составители: 

21
87 ; Загрузка в CS селектор сегмента кода, а в IP смещения следующей
88 ; команды (при этом и очищается очередь команд)
89 db 0eah ; Код команды far jmp
90 dw offset continue ; Смещение
91 dw 16 ; Селектор сегмента команд
92 continue:
93 ;Инициализация селектора сегмента данных
94 mov ax,8 ; Селектор сегмента данных
95 mov ds,ax
96 ;Инициализация селектора сегмента стека
97 mov ax,24 ; Селектор сегмента стека
98 mov ss,ax
99 ;Инициализация селектора ES и вывод символов на экран
100 mov ax,32 ; Селектор сегмента видеобуфера
101 mov es,ax
102 mov ebx,800 ; Начальное смещение на экране
103;Вывод сообщения на экран
104 lea esi,mes1
105 mov ah,attr
106 screen:
107 mov al,[esi]
108 or al,al
109 jz scend ; Выход, если нуль (терминатор сообщения)
110 mov es:[bx],ax ; Вывод символа в видеобуфер
111 add ebx,2 ; Следующий адрес на экране
112 inc esi ; Следующий символ
113 jmp screen ; Цикл
114 scend: ; Конец вывода сообщения
115 ;Подготовка перехода в реальный режим
116 ;*****************************************************
117 ;Формирование и загрузка дескрипторов для реального режима
118 mov gdt_data.lim,0ffffh ; Запись значения
119 mov gdt_code.lim,0ffffh ; границы в 4 ис-
120 mov gdt_stack.lim,0ffffh ; пользуемых нами
121 mov gdt_screen.lim,0ffffh ; дескриптора
122 ; Для перенесения этих значений в теневые регистры необходимо
123 ; записать в сегментные регистры соответствующие селекторы
124 mov ax,8 ; Загрузка теневого регистра
125 mov ds,ax ; сегмента данных
126 mov ax,24 ; Загрузка теневого регистра
127 mov ss,ax ; сегмента стека
128 mov ax,32 ; Загрузка теневого регистра
129 mov es,ax ; дополнительного сегмента
130 ;Сегментный регистр CS программно недоступен, поэтому его
131 ; загрузку опять выполняем косвенно с помощью искусственно
132 ; сформированной команды дальнего перехода
133 db 0eah ; Код команды дальнего перехода
134 dw offset go ; Смещение
135 dw 16 ; Селектор сегмента кода
136 ;Переключение режима процессора
137 go: mov eax,cr0 ; Чтение cr0
87 ; Загрузка в CS селектор сегмента кода, а в IP смещения следующей
88 ; команды (при этом и очищается очередь команд)
89      db 0eah               ; Код команды far jmp
90      dw offset continue ; Смещение
91      dw 16                 ; Селектор сегмента команд
92 continue:
93 ;Инициализация селектора сегмента данных
94      mov ax,8        ; Селектор сегмента данных
95      mov ds,ax
96 ;Инициализация селектора сегмента стека
97      mov ax,24       ; Селектор сегмента стека
98      mov ss,ax
99 ;Инициализация селектора ES и вывод символов на экран
100     mov ax,32       ; Селектор сегмента видеобуфера
101     mov es,ax
102     mov ebx,800     ; Начальное смещение на экране
103;Вывод сообщения на экран
104     lea esi,mes1
105     mov ah,attr
106 screen:
107      mov al,[esi]
108     or al,al
109     jz scend ; Выход, если нуль (терминатор сообщения)
110     mov es:[bx],ax ; Вывод символа в видеобуфер
111     add ebx,2       ; Следующий адрес на экране
112     inc esi         ; Следующий символ
113     jmp screen      ; Цикл
114 scend:                          ; Конец вывода сообщения
115 ;Подготовка перехода в реальный режим
116 ;*****************************************************
117 ;Формирование и загрузка дескрипторов для реального режима
118     mov gdt_data.lim,0ffffh ; Запись значения
119     mov gdt_code.lim,0ffffh ; границы в 4 ис-
120     mov gdt_stack.lim,0ffffh ; пользуемых нами
121     mov gdt_screen.lim,0ffffh ; дескриптора
122 ; Для перенесения этих значений в теневые регистры необходимо
123 ; записать в сегментные регистры соответствующие селекторы
124     mov ax,8 ; Загрузка теневого регистра
125     mov ds,ax ; сегмента данных
126     mov ax,24 ; Загрузка теневого регистра
127     mov ss,ax ; сегмента стека
128     mov ax,32 ; Загрузка теневого регистра
129     mov es,ax ; дополнительного сегмента
130 ;Сегментный регистр CS программно недоступен, поэтому его
131 ; загрузку опять выполняем косвенно с помощью искусственно
132 ; сформированной команды дальнего перехода
133     db 0eah       ; Код команды дальнего перехода
134     dw offset go ; Смещение
135     dw 16         ; Селектор сегмента кода
136 ;Переключение режима процессора
137 go: mov eax,cr0           ; Чтение cr0


                                      21