Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
32 / 32 / 16
Регистрация: 18.08.2009
Сообщений: 93

Перевод процессора в защищённый режим и обработка прерываний от таймера

21.11.2010, 13:05. Показов 5503. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Дали лабу: Перевести процессор в защищённый режим и обработать прерывания от таймера.
С переводом вроде как разобрался, а вот с прерыванием проблема. Если запрещаешь все прерывания, то всё работает нормально, т.е процессор переходит в защищённый режим и возвращается обратно в реальный. Если разрешаешь прерывания, то комп перезагружается.
Вот код который у меня получился:
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
                                        .586P
                    .model compact
                    ;===========================
                    desc struc
                    lim dw 0
                    base_l dw 0
                    base_m db 0
                    attr_1 dw 0
                    base_h db 0
                    desc ends
                    ;==========================
                    trap struc
                    offset_l dw 0
                    sel dw 16
                    cntr db 0
                    dtype db 8Fh
                    offs_h dw 0
                    trap ends
                    ;==========================
                    stk segment stack use16
                      dp 256  dup (0)
                    stk ends 
                    ;=========GDT================
                    ;Data segment
                    data segment use16
                    gdt_null desc<0,0,0,0,0> ;selector 0
                    gdt_data desc<data_size-1,0,0,92h,0> ;selector 8 
                    gdt_code desc<code_size-1,0,0,98h,0> ;selector 16
                    gdt_stack desc<255,0,0,92h,0> ;selector 24
                    gdt_screen desc<4095,8000h,0Bh,92h,0> ;selector 32
                    gdt_size=$-gdt_null ; GDT size for command lgdt
                    ;=========IDT=================
                        idt label word
                        trap 13 dup (<err1>)        
                        trap <err1>
                        trap 18 dup (<err1>)
                        trap<new_8,,8Eh>            
                        idt_size=$-idt
                    ;=============================
                    psedesc df 0;
                    sum db 48
                    attr db 0fh
                    a dw 0
                    msg db 43,44,45,46,48,48,48,'$';
                    master_mask db 0
                    slave_mask db 0
                    data_size=$-gdt_null
                    data ends
                    text segment use16
                    assume CS:text,DS:data
                    main proc
                    xor eax,eax
                    mov ax,data
                    mov ds,ax
                    shl eax,4
                    mov ebp,eax
                    mov bx,offset gdt_data ;вычисляем размер сегмента данных
                    mov [bx].base_l ,ax
                    shr eax,16
                    mov [bx].base_m,al
                    xor eax,eax
                    mov ax,cs
                    shl eax,4
                    mov bx,offset gdt_code ;вычисляем размер сегмента кода
                    mov [bx].base_l,ax
                    shr eax,16
                    mov [bx].base_m,al
                    xor eax,eax
                    mov ax,ss
                    mov bx,offset gdt_stack ;вычисляем размер сегмента стека
                    shl eax,4
                    mov [bx].base_l,ax
                    shr eax,16
                    mov [bx].base_m,al
                    ;;;;;;;;;;;;;;;;;;;;;;;;;;;
                    mov dword ptr psedesc+2,ebp
                    mov word ptr psedesc,gdt_size-1
                    lgdt psedesc ;;load GDT
                    cli
                    ;=============reset interrupt controller=====
                    in al,21h
                    mov master_mask,al
                    in al,0a1h
                    mov slave_mask,al
                    ;================
                    mov al,11h
                    out 20h,al
                    mov al,32
                    out 21h,al
                    mov al,4
                    out 21h,al
                    mov al,1
                    out 21h,al                  
                    ;=============set mask========================
                    mov al,0feh
                    out 21h,al
                    mov al,0ffh
                    out 0a1h,al
                    ;============load IDT=========================
                    mov word ptr psedesc,idt_size-1
                    xor eax,eax
                    mov ax,offset idt
                    add eax,ebp ;line adress idt
                    mov dword ptr psedesc+2,eax
                    lidt psedesc 
                    ;=============================================
                    mov eax,CR0
                    or eax,1
                    mov CR0,eax
                    ;;;теперь процессор работает в защищённом режиме
                    db 0eah ;far jamp code
                    dw offset continue 
                    dw 16 ;code selector
                    continue:
                    mov ax,8
                    mov ds,ax
                    mov ax,24
                    mov ss,ax
                    mov ax,32
                    mov es,ax
                    
                    mov cx,65000
                    meta2:
                    mov a,cx
                    mov cx,65000
                    meta1:
                                        loop meta1
                    mov cx,a
                    loop meta2
                    cld
                    mov    di, 800
                    mov    cx, 640
                        mov    ax, word ptr sum        
                    PrintLoop1:    stosw
                    inc    ax
                    loop    PrintLoop1
                    mov gdt_data.lim,0ffffh
                    mov gdt_code.lim,0ffffh
                    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
                    
                    db 0eah
                    dw offset reset
                    dw 16
                    reset:
                    mov eax,CR0
                    and al,0feh
                    mov CR0,eax
                    db 0eah
                    dw offset return
                    dw text
                    return:
                    mov ax,data
                    mov ds,ax
                    mov ax,stk
                    mov ss,ax
                    mov sp,256
                    ;===========================================
                    mov ax,3ffh
                    mov word ptr psedesc,ax
                    mov eax,0
                    mov dword ptr psedesc+2,0
                    lidt psedesc
                    ;=============reset interrupt controller=====
                    mov al,11h
                    out 20h,al
                    mov al,8h
                    out 21h,al
                    mov al,4
                    out 21h,al
                    mov al,1
                    out 21h,al  
                    ;=========
                    mov al,master_mask
                    out 21h,al
                    mov al,slave_mask
                    out 0a1h,al             
                    ;==============================================
                    sti
                    mov ah,09h
                    mov dx,offset msg
                    int 21h
                    mov ax,4c00h
                    int 21h
                    main endp
                    ;====================================================
                    ;====================================================
                    ;===proc for trap====================================
                    err1 proc
                      mov ax,0
                      ret
                    err1 endp
                    ;==proc for interrupt 8===============================
                    new_8 proc
                    cld
                    mov    di, 800
                    mov    cx, 640
                        mov    ax, word ptr sum        
                    PrintLoop:    stosw
                    inc    ax
                    loop    PrintLoop
                    mov al,20h
                    out 20h,al
                    db 66h
                    iret    
                    new_8 endp
                    ;=====================================================
                    code_size=$-main
                    text ends
                    
                    end main
Если кто нибудь может помочь буду очень благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2010, 13:05
Ответы с готовыми решениями:

Перевод процессора в защищённый режим в виртуальной машине
Я изучаю ассемблер. Добрался до темы &quot;защищённый режим&quot;. Прочитал, понял. В книге есть упражнение по переводу процессора в ЗР. Я...

Защищённый режим работы процессора
Процессор работает в защищённом режиме, без подкачки страниц. В регистре CS находится значение 0x0008,а в реестре EIP находится значение...

Защищенный режим работы процессора
Объясните пожалуйста суть защищенного режима работы процессора.

3
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
22.11.2010, 15:18
честно говоря не люблю подобные задачи решать в тасме - слишком много опкодов писать приходится. Вот решение задачи в виде загрузочного модуля(вполне помещается в 512 байт- можно даже еще добавить пару обработчиков прерываний). Программа для fasm
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
org 0x7c00
use16
start:
    mov ax, 3
    int 10h
 
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, start
    mov bp, sp
 
    in  al, 92h
    or  al, 2
    out 92h, al
 
    cli
    in  al, 70h
    or  al, 80h
    out 70h, al     ; disable NMI
 
    lgdt    fword [GDTR]
    lidt    fword [IDTR]
 
    mov eax, cr0
    or  al, 1
    mov cr0, eax
 
    jmp 00001000b:protected_entry
 
;===============================================================================
use32
protected_entry:
    mov ax, 16
    mov ds, ax
    mov ss, ax
    mov ax, 24
    mov es, ax
 
    in  al, 70h
    and al, 7fh
    out 70h, al
    sti
    jmp $
 
; int 8 (IRQ0)
int8_handler:
    mov    di, 800
    mov    cx, 640
    mov    ax, word sum        
PrintLoop:    stosw
    inc    ax
    loop    PrintLoop
 
int_EOI:
; сброс заявки в контроллере прерываний: посылка End-Of-Interrupt
    push    ax
    mov al, 20h
    out 020h, al   ; в ведущий (Master) контроллер
    out 0a0h, al   ; в ведомый (Slave) контроллер.
    pop ax
    iretd
 
; #GP
GP_handler:
    pop eax ; код ошибки
    mov esi, gp
    int 1
    iretd
 
gp db '**GENERAL PROTECTION FAULT**',0
 
sum dw 0
 
include "gdt.inc"
include "idt.inc"
 
ends:   rb 510-(ends-start)
db 055h, 0aah
Assembler
1
2
3
4
5
6
7
8
9
10
11
; Global Descriptor Table
GDT:
     dd  0,0 ; пустой дескриптор
     db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00    ; код   (селектор = 8h)
     db  0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00    ; данные (селектор = 10h)
     db  0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 01000000b, 00    ; видеобуфер (селектор = 18h)
;    db  0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 00000000b, 00    ; код реального режима, base=0, 16-bit (D=0), limit=0FFFFh (G=0), селектор = 20h
 
    GDT_size     equ $-GDT
    GDTR     dw GDT_size-1
         dd GDT
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
; Interrupt Descriptor Table
IDT:
     dd 0,0 ; 0
     dd 0,0
     dd 0,0 ; 2
     dd 0,0 ; 3
     dd 0,0 ; 4
     dd 0,0 ; 5
     dd 0,0 ; 6
     dd 0,0 ; 7
     dw int8_handler, 08h, 1000111000000000b, 0   ; 8  (IRQ 0 - системный таймер)
     dd 0, 0
     dw int_EOI, 08h, 1000111000000000b, 0   ; 10  (IRQ 2 - ведомый контроллер прерываний)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 11  (IRQ 3 - COM2)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 12  (IRQ 4 - COM1)
     dw GP_handler, 08h, 1000111000000000b, 0   ; 13  #GP
     dw int_EOI, 08h, 1000111000000000b, 0   ; 14  (IRQ 6 - FDD)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 15  (IRQ 7 - LPT1)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 16 (8)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 17 (9)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 18 (10)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 19 (11)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 20 (12)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 21 (13)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 22 (14)
     dw int_EOI, 08h, 1000111000000000b, 0   ; 23 (15)
 
    IDT_size     equ $-IDT
    IDTR         dw IDT_size-1
                 dd IDT
;    REAL_IDTR    dw 3FFh
;                 dd 0
Добавлено через 53 минуты
как то плохо получилось картинка статична, не понятно что это прерывание таймера. Вот так лучше:
Assembler
1
2
3
4
5
6
7
8
9
10
11
...
int8_handler:
    mov    di, 800
    mov    cx, 640
    inc word [sum]
    mov    ax, word [sum]
PrintLoop:  stosw
    inc    ax
    dec cx
    jnz    PrintLoop
...
почему то с loop работать не захотело... В чем проблема - сам не понял
2
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
22.11.2010, 16:18
use32=используется ecx
1
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
22.11.2010, 16:45
Цитата Сообщение от airyashov Посмотреть сообщение
use32=используется ecx
не догадался

Добавлено через 13 минут
кстати неплохо бы повесить на клавиатуру пустой обработчик - а то любое нажатие на клавишу вешает комп
idt.inc:
Assembler
1
2
3
4
5
...
     dw int8_handler, 08h, 1000111000000000b, 0   ; 8  (IRQ 0 - системный таймер)
;    dd 0, 0
     dw int9_handler, 08h, 1000111000000000b, 0
...
main.asm:
Assembler
1
2
3
4
...
int9_handler:
    jmp int_EOI
...
Добавлено через 11 минут
обработчик GP_handler не корректно работает(отсутствует реализация int 1). Не помню где брал исходный код, кажется на васме, в общем его можно просто убрать
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.11.2010, 16:45
Помогаю со студенческими работами здесь

Перейти в защищённый режим процессора и обратно
Стоит linux ubuntu 18.04. Задание: перейти в зазищенный режим процессора и обратно. Программа строится успешно, однако потом завершается...

Защищенный режим работы процессора: нужна литература
Дайте хорошую литературу по защищенному режиму с наличием примеров кода.

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

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

Защищённый режим ОС
Надеюсь, я верно выбрал раздел на форуме :) Меня интересует такой вопрос... Каким образом приложения типа ArtMoney могут получать доступ к...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru