Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 10

Поместить таблицу прерываний IDT в расширенную память

17.01.2016, 12:43. Показов 2775. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поместить таблицу прерываний IDT в расширенную память, для чего в регистр IDTR загрузить адрес области, где будет помещена таблица, в GDT создать дескриптор, описывающий этот сегмент и после перехода в защищенный режим перенести IDT из основной в расширенную память. Для проверки вызвать прерывание, выводящее строку на экран.

Есть пример другой программы, но как менять не знаю.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
.386p                               ; Разрешение трансляции
                                      ; всех инструкций 80386
Gdt_Descriptor  STRUC                ; Шаблон дескриптора GDT
 Seg_Limit       dw   0               ; Длина сегмента
 Base_Lo_Word    dw   0              ; Младшие 16 бит базового  адреса
 Base_Hi_Byte    db   0               ; Биты 16..23 базового адр.
 Acces_Rights    db   0               ; Байт прав доступа
 Base_Top_Byte   dw   0               ; Биты 24..31 базового адр.
Gdt_Descriptor  ENDS
Idt_Descriptor  STRUC                 ; Шаблон дескриптора IDT
 Int_Offset            dw   0         ; Точка входа в процедуру обработки прерывания
 Int_Selector          dw   0         ; Селектор сегмента в GDT
                       db   0              
 Access                db   0         ; Права доступа
                       dw   0              
Idt_Descriptor  ENDS
Code_Seg_Access  Equ  10011011b       ; Байт прав  доступа дескриптора сегмента кода
Data_Seg_Access   Equ  10010011b      ; Байт прав  доступа дескриптора сегмента данных
Disable_Bit20            Equ  11011101b      ; Код команды 8042 для закрывания линии A20
Enable_Bit20         Equ  11011111b      ; Код команды 8042 для открывания линии A20
Port_A                   Equ  060h               ; Порт A 8042
Status_port              Equ  064h               ; Порт состояния 8042
Cmos_Port                Equ  070h                ; Адрес порта CMOS-памяти
; Макро для записи базового адреса сегмента в дескриптор
FILLDESCR MACRO   Seg_Addr,Offset_Addr,Descr
           xor     edx,edx                 ; EDX := 0
           xor     ecx,ecx                 ; ECX := 0
           mov     dx,Seg_Addr             ; Сегментная часть
           mov     cx,offset Offset_Addr   ; Смещение
           call    Form_32Bit_Address      ; CX:DX := линейный
                                           ; адрес
           mov     &Descr.Base_Lo_Word,dx  ; Занесение базового
           mov     &Descr.Base_Hi_Byte,cl  ; адреса в дескрип-
           mov     &Descr.Base_Top_Byte,cx ; тор
          ENDM
CSEG       SEGMENT  Para USE16 public 'code'
           ASSUME  cs:Cseg,ds:Cseg
           ORG     100h
Start:     jmp     Main
; Глобальная дескрипторная таблица GDT
 EVEN
 Gdt    label   word
 Gdt_nil        EQU $-gdt
 Gdt0           Gdt_Descriptor < >
;******Дескриптор, описывающий таблицу Gdt как сегмент данных *
 Gdt_Desc       EQU $-gdt            ; Селектор дескриптора
 Gdt1           Gdt_Descriptor <gdt_leng,,,data_seg_access,>
;****** Дескриптор, описывающий сегмент Cseg как кодовый ******
 Cs_Code        EQU $-gdt            ; Селектор дескриптора
 Gdt2           Gdt_Descriptor<cseg_leng,,,code_seg_access,>
;** Дескриптор, описывающий Cseg как сегмент данных с пределом*
;** 0FFFEh. Он будет использоваться также в роли стекового. ***
 Cs_Data        EQU $-gdt            ; Селектор дескриптора
 Gdt3           Gdt_Descriptor<cseg_leng,,,data_seg_access,>
;************* Дескриптор, описывающий таблицу IDT *************
 Idt_Pointer    Gdt_Descriptor<idt_leng-1,,,data_seg_access>
;** Дескриптор, описывающий таблицу IDT реального режима *******
 Idt_Real       Gdt_Descriptor<3FFh,,,data_seg_access>
;********* Дескриптор, описывающий сегмент видеопамяти *********
 Video_Desc     EQU $-gdt            ; Селектор дескриптора
 GdtB800        Gdt_Descriptor<1000h,8000h,0bh,data_seg_access>
 ;Video_Desc                        ; Селектор дескриптора
 ;GdtB800        Gdt_Descriptor<1000h,8000h,0bh,data_seg_access>
Gdt_Leng        EQU $-gdt            ; Длина таблицы GDT
;Таблица дескрипторов прерываний IDT.
 EVEN
 Idt   label   word
 ex0     Idt_Descriptor<offset ex0_proc,cs_code,0,10000111b,0>
 ex1     Idt_Descriptor<offset ex1_proc,cs_code,0,10000111b,0>
 ex2     Idt_Descriptor<offset ex2_proc,cs_code,0,10000110b,0>
 ex3     Idt_Descriptor<offset ex3_proc,cs_code,0,10000111b,0>
 ex4     Idt_Descriptor<offset ex4_proc,cs_code,0,10000111b,0>
 ex5     Idt_Descriptor<offset ex5_proc,cs_code,0,10000111b,0>
 ex6     Idt_Descriptor<offset ex6_proc,cs_code,0,10000111b,0>
 ex7     Idt_Descriptor<offset ex7_proc,cs_code,0,10000111b,0>
 ex8     Idt_Descriptor<offset ex8_proc,cs_code,0,10000111b,0>
 ex9     Idt_Descriptor<offset ex9_proc,cs_code,0,10000111b,0>
 ex10    Idt_Descriptor<offset ex10_proc,cs_code,0,10000111b,0>
 ex11    Idt_Descriptor<offset ex11_proc,cs_code,0,10000110b,0>
 ex12    Idt_Descriptor<offset ex12_proc,cs_code,0,10000111b,0>
 ex13    Idt_Descriptor<offset ex13_proc,cs_code,0,10000111b,0>
 ex14    Idt_Descriptor<offset ex14_proc,cs_code,0,10000111b,0>
 ex15    Idt_Descriptor<offset ex15_proc,cs_code,0,10000111b,0>
 ex16    Idt_Descriptor<offset ex16_proc,cs_code,0,10000111b,0>
         Idt_Descriptor 22 dup(<>)
 Int39   Idt_Descriptor<offset int10_proc,cs_code,0,10000110b,0>
 Idt_Leng       EQU $-Idt            ; Длина таблицы IDT
Real_Jump          dd  ?           ; Адрес межсегментного перехода в реальном режиме
Protect_Jump       dd  ?           ; Адрес межсегментного перехода в защищенном режиме
Mess               db  'Protected Mode$'
Mess1              db 'An exception occurred$'
Mess2             db 'Program is completed$'
sLen               dw  14d
Gate_Failure       db "Error open A20$"
Main:      FillDescr  cs,Gdt,Gdt1    ; Формирование 32-разряд-
                                     ; ного адреса из CS:GDT и
                                     ; запись его в дескриптор
                                     ; с номером Gdt_Desc.
           FillDescr  cs,0,gdt2      ; Дескриптор Cs_Code ука-
                                     ; зывает на CSEG как на
                                     ; кодовый сегмент.
           FillDescr  cs,0,gdt3      ; Дескриптор Cs_Data ука-
                                     ; зывает на CSEG как на
                                     ; сегмент данных.
       FillDescr  cs,Idt,Idt_Pointer ; Дескриптор Idt_Pointer
                                     ; указывает на IDT.
           cli                       ; Запрет прерываний
           mov     al,8fh            ; Запрет немаскируемых
           out     cmos_port,al      ; прерываний
           jmp     short $+2
           mov     al,5
           out cmos_port+1,al
           mov     ah,Enable_Bit20        ; Открываем адрес-
           call    Gate_A20               ; ную линию A20
           or      al,al                  ; Если произошла
           jz      A20_Opened             ; ошибка, то
           mov     dx,offset Gate_Failure ; выдать сообщение
           mov     ah,9                   ; на экран, разре-
           int     21h                    ; шить прерывания и
           sti                            ; вернуться в DOS
           int     20h
A20_Opened:
         ;  lea     di,Real_Jump           ; Формирование адреса
         ;  mov     word ptr [di],offset Real ; для перехода
         ;  mov     word ptr [di+2],cs        ; в реальный режим
         ;  lea     di,Protect_Jump        ; Формирование адреса
         ;  mov     word ptr [di], offset Protect ; для перехода
         ;  mov     word ptr [di+2],Cs_Code       ; в защищенный режим
           lea    di,Real_CS
           mov    word ptr cs:[di],cs
           lgdt    Gdt1              ; Загрузка GDTR
           lidt    Idt_Pointer       ; Загрузка IDTR
           mov     eax,cr0           ; Переходим в защищенный
           or      eax,1             ; режим, устанавливая
           mov     cr0,eax           ; бит 0 в регистре CR0
      ;    jmp     dword ptr Protect_Jump ; Переход на метку Protect
           db 0EAh
           dw offset Protect
           dw CS_Code
; Работа в защищенном режиме.
Protect:   mov     ax,Cs_Data
           mov     ss,ax             ; Регистры DS, ES и SS
           mov     ds,ax             ; содержат  селектор
           mov     es,ax             ; сегмента Cs_Data
           call    My_Proc           ; Вызов рабочей процедуры
           cli
m1:
           mov     eax,cr0           ; Переходим в реальный
           and     eax,0FFFFFFFEh    ; режим, сбрасывая бит 0
           mov     cr0,eax           ; регистра CR0
;          jmp     dword ptr Real_Jump ; Косвенный межсегментный переход на метку Real
           db 0EAh
           dw offset Real
Real_CS    dw 0
; Работа в реальном режиме.
Real:      lidt    Idt_Real          ; Загружаем регистр IDTR для работы в реальном режиме
           mov     dx,cs             ; Восстанавливаем
           mov     ds,dx             ; сегментные
           mov     ss,dx             ; регистры
           mov     ah,Disable_Bit20  ; Закрытие адресной
           call    Gate_A20          ; линии A20
           sti                       ; Разрешение прерываний
           int     20h               ; Выход в DOS
ex0_proc:  
    lea     bx,Mess1           ; Адрес сообщения
        mov     dx,200Ch          ; Координаты вывода
        int     39d               ; Вывод строки на экран
    jmp m1
    iret                      ; Обработчики особых
ex1_proc:  iret                      ; ситуаций
ex2_proc:  iret                      ; Здесь установлены
ex3_proc:  iret                      ; заглушки вместо
ex4_proc:  iret                      ; обработчиков
ex5_proc: iret
ex6_proc:  iret
ex7_proc:  iret
ex8_proc:  iret
ex9_proc:  iret
ex10_proc: iret
ex11_proc: iret
ex12_proc: iret
ex13_proc: iret
ex14_proc: iret
ex15_proc: iret
ex16_proc: iret
;**************************************************************
;Управление прохождением сигнала A20
;ВХОД: (AH)=0DDH   установить A20 всегда равным нулю
;      (AH)=0DFh   открыть адресный разряд A20
;ВЫХОД: (AL)=0     8042 принял команду
;       (AH)=2     сбой
;**************************************************************
Gate_A20 PROC
           cli                       ; Запрет прерываний
           call    Empty_8042
           jnz     Gate_1
           mov     al,0d1h           ; Выдаем команду  8042 для
           out     Status_Port,al    ; записи в выходной порт
           call    Empty_8042
           jnz     Gate_1
           mov     al,ah             ; Записываем в порт A 8042
           out     Port_A,al         ; код команды
           call    Empty_8042
Gate_1:    ret
Gate_A20 ENDP
;**************************************************************
;Ждать пока буфер 8042 не опустеет
;Вход: нет
;Выход:(AL)=0   буфер пуст
;      (AL)=2   не пуст
;**************************************************************
Empty_8042  PROC
           push    cx
           xor     cx,cx             ; CX = 0 (256 повторений)
Empty_1:   in      al,Status_Port    ; Порт 8042
           and     al,00000010b      ; Бит 2 очищен ?
           loopnz  Empty_1
           pop     cx
           ret
Empty_8042  ENDP
;**************************************************************
; Формирование 32-разрядного адреса
; Вход : CX:DX - адрес в формате <сегмент:смещение>
; Выход: CX:DX - 32-разрядный линейный адрес
Form_32Bit_Address   PROC
           shl     edx,4
           add     edx,ecx
           mov     ecx,edx
           shr     ecx,16
           ret
Form_32Bit_Address   ENDP
;**************************************************************
;   Процедура вывода строки на экран, работает в качестве
;   обработчика прерывания.
; Вход : DS:BX - адрес сообщения
;        DL - строка экрана
;        DH - колонка экрана
;**************************************************************
Int10_Proc   Proc  Near              ; Обработчик прерывания
           pusha                     ; INT 39d
           xor     cx,cx             ; Очистка CX
           mov     cl,dh             ; CL = колонка
           sal     cl,1              ; CL = CL*2
           xor     dh,dh             ; DX = строка
           imul    dx,160d    ; Умножаем на число байт в строке
           add     dx,cx      ; Прибавляем смещение в строке
                              ; Результат: DX = смещение в
                              ; видеопамяти
           push    Video_Desc
           pop     es         ; ES = сегмент видеопамяти
           mov     di,dx      ; DI = смещение в этом сегменте
m:         mov     ax,[bx]    ; AL = очередной символ строки
           cmp     al,'$'     ; Конец строки ?
           jz      Ex         ; Да - выход
           mov     cx,es:[di] ; Получить атрибут в CH
           mov     ah,ch      ; AX = символ с атрибутом
           stosw              ; Записать символ в видеопамять
           inc     bx         ; Перейти к следующему символу
           jmp     short   m
ex:        popa
           iret               ; Возврат из прерывания
Int10_Proc Endp
;**************************************************************
;Процедура выполняющая какие-либо действия в защищенном режиме
;**************************************************************
MY_PROC    PROC
         pusha
         push    es
         push    Video_Desc       
         pop     es                
                                  
         mov     dh,0fh            
         call    Paint_Screen
         lea     bx,Mess          
         mov     dx,200Bh         
         int     39d              
        mov ax,10h
        mov bl,1
        div bl
        lea bx, Mess2
         mov     dx,200Ch         
         int     39d               
         pop     es  
         popa
         ret
MY_PROC ENDP
;**************************************************************
; Процедура очищает экран и устанавливает цвета в соответствии
; с заданным атрибутом.
; Вход : ES - селектор дескриптора текстового видеобуфера
;        DH - атрибут.
;**************************************************************
PAINT_SCREEN  PROC
           push    cx si di es
           mov     cx,80*25          
           xor     si,si             
           xor     di,di            
Paint1:    lodsw                    
                                     
           mov     ah,dh            
           mov     al,20h           
           stosw                    
                                    
           loop    Paint1            
           pop     es di si cx
           RET
PAINT_SCREEN ENDP
obr11       proc
        
obr11       endp
Cseg_Leng  Equ     $                 ; Длина сегмента Cseg
Cseg      Ends
End       Start
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2016, 12:43
Ответы с готовыми решениями:

Перенести таблицу прерываний реального режима в расширенную память
Модифицировать программу . Перенести таблицу прерываний реального режима в расширенную память, для чего скопировать в защищенном режиме...

Получить таблицу прерываний
Здравствуйте! Возник вопрос, как вывести таблицу прерываний используя wmi запросы? Есть wmi класс Win32_IRQResource и в нем есть вся...

Вызов функций через таблицу прерываний
Уважаемые участники форума cyberforum.ru, очень нужна ваша помощь. Столкнулся с такой вот проблемой: написал класс обработки 64-битных...

2
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
18.01.2016, 13:10
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от Usledovatel Посмотреть сообщение
но как менять не знаю
1. Написать обработчик прерывания и добавить в IDT.
3. После загрузки GDT и перехода в PM загрузить селектор данных.
4. Скопировать IDT в расширенную память.
5. Рассчитать новый Idt_Pointer.
6. Загрузить IDT.
7. Вызвать прерывание.
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 10
18.01.2016, 20:17  [ТС]
помогите написать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2016, 20:17
Помогаю со студенческими работами здесь

Где посмотреть таблицу векторов прерываний?
Доброго времени суток. Собственно, вопрос в заголовке темы - откуда брать таблицу? В datasheet'е не нашёл, в аппнотах - тоже.

Как разместить таблицу векторов прерываний в atmega8?
Что сделал не так?

Как правильно размещать таблицу прерываний (в ATmega 328 в частности)?
.cseg ; Выбор сегмента программного кода .org 0 ; Установка текущего адреса на ноль jmp RESET ;0x0000 RESET - сброс ;...

Поместить адрес регистра в память
Есть кусочек кода mov ,al mov eax, mov ,eax test rcx,rcx

Какие функции прерываний используются в обработчике прерываний от клавиатуры?
Под функциями же имеется ввиду int ..h?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru