Идеи становятся силой...
121 / 121 / 64
Регистрация: 08.12.2009
Сообщений: 445
1

Прерывания от внешних устройств

29.03.2011, 02:52. Показов 2767. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток, подскажите как можно выполнить следующее задание, к заданной программе, заранее большое спасибо.

1. При нажатии на левую клавишу мыши все задачи с состоянием Hesitation останавливаются, при следующем нажатии на левую клавишу задачи продолжают свою работу.

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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
.386
;================================================= =====
; МОДЕЛЬ мультипрограммной СИСТЕМЫ
;================================================= =====
max_prg equ 10; максимальное количество "одновременно"
; Выполняемых задач
time_slice equ 65535 ; количество микросекунд, выделенных на один
; Квант времени (макс. 65535)
 
 
_ST SEGMENT WORD STACK 'stack' use16
    top label word
dw 32000 dup (?)
dw 100 dup (?) ; резерв для ошибок
; Анти переполнения стека
_ST ENDS
 
 
_DATA SEGMENT WORD PUBLIC 'DATA' use16
@Ms_dos_busy dd (?); Логический адрес признаки занятости MS-DOS
int8set db 0; признак перехват прерывания от таймера
int9set db 0; признак перехват прерывания от клавиатуры
fon equ max_prg; признак фоновой задачи;
fonsp label word; адрес сохранения SP фоновой задачи
sssp dd top; логический адрес стека фоновой задачи
; Массив значений SP для задач (для стека каждой задачи отведено 1000 слов)
; Заданы начальные значения
stp dw 1000, 2000, 3000, 4000
          dw 5000, 6000, 7000, 8000
         dw 9000, 10000, 11000, 12000
          dw 13000, 14000, 15000, 16000
nprg dw 0; номер активной задачи (от 0 до max_prg-1)
; Или признак фоновой задачи (fon)
init db 16 dup (0); массив состояния задач
clock db 16 dup (1); массив разрешенного числа квантов задач
clockt db 16 dup (0); массив счетчиков квантов задач
screen_addr dw 16 dup (0); адрес (смещение от начала видеостраницы)
; Области ввода на экран значений задачи
names label word; массив имен задач
          db '0 T1T2T3T4T5T6T7T8T9TATBTCTDTETFT '
clk dw 0; счетчик прерываний от таймера
_DATA ENDS
 
 
_TEXT SEGMENT BYTE PUBLIC 'CODE' use16
ASSUME CS: _TEXT, DS: _DATA
 
;------------------------------------------------- -----------
; Процедура "перехват" прерывание от таймера (int8)
;------------------------------------------------- -----------
;================================================= =========================
setint8 PROC
mov al, int8set
        
or al, al; контроль "перехват" перехватов
jnz zero_8
 
mov AH, 35H; получить вектор прерывания
mov AL, 8; прерывания от таймера (8)
        
int 21H; значения возвращаемого:
                              ; Es: bx - логический адрес системной процедуры
                                ; Обработки прерывания от таймера
        
mov cs: int8ptr, bx; сохранить логическую адрес системной
mov cs: int8ptr +2, es; процедуры в сегменте кодов
        
mov dx, offset userint8 ;формирование в ds: dx логической
push ds; адреса процедуры пользователя
push cs; для обработки прерываний от таймера
        
pop ds
mov AH, 25H; установить вектор
mov AL, 8; прерывания от таймера
 
INT 21H; ds: dx - указатель на пользовательскую
; Процедуру обраб. прерывания от таймера
 
mov ax, time_slice; установить заданную величину кванта времени
 
out 40h, al; 40h - адрес 8-разрядного порта таймера
; Через который задают период таймера
; Сначала младший байт, а затем старший
 
jmp $ +2; стандартный метод согласования скоростного
; Процессора с более медленным внешним
; Устройством. Предполагаем, что
; "Бессмысленная" команда jmp очищает буфер
; Предварительной выборки команд и, тем самым,
; Замедляет работу процессора. Между тем
; Внешнее устройство будет готов
; Принять следующий байт
nop
mov al, ah; (старший байт)
out 40h, al
    pop ds
mov int8set, 0ffh; запрет повторных вхождений
 
zero_8:
        ret
int8ptr dw 2 dup (?)
setint8 ENDP
;================================================= =========================
;------------------------------------------------- -----------
; Процедура восстановления вектора прерывания от таймера
;------------------------------------------------- -----------
;================================================= =========================
retint8 PROC
    push ds
push dx
mov al, 0ffh; восстановить нормальную работу
out 40h, al; системного таймера
jmp $ +2
 
nop
 
out 40h, al
mov dx, cs: int8ptr
mov ds, cs: int8ptr +2
 
mov AH, 25H; восстановить исходный вектор
mov AL, 8; прерывания от таймера
 
int 21H; ds: dx - указатель (логическая адрес)
; На начальную (системную) процедуру
                            ; Обраб. прерывания от таймера
    pop dx
    pop ds
mov int8set, 0h; разрешение следующих "перехватов"
        ret
retint8 ENDP
;================================================= =========================
;------------------------------------------------- ----------
; Процедура "перехват" прерывание от клавиатуры (int9)
;------------------------------------------------- -----------
;================================================= =========================
setint9 PROC
        mov al, int9set
        or al, al
        jnz zero_9
        mov AH, 35H; получить вектор прерывания
        mov AL, 9; прерывания от клавиатуры (9)
        int 21H; значения возвращаемого:
; Es: bx - указатель на системную процедуру
; Обработки прерывания от клавиатуры
        mov cs: int9ptr, bx; сохранить в сегменте кодов указатель
        mov cs: int9ptr +2, es; на системную процедуру
        mov dx, offset userint9
 
    push ds
    push cs; ds: dx - указатель на процедуру пользователя
    pop ds; обраб. прерывания от клавиатуры
        mov AH, 25H; установить вектор "перехвата"
        mov AL, 9; прерывания от клавиатуры (9)
int 21H
 
pop ds
        mov int9set, 0ffh; запрет повторных вхождений
    
zero_9:
        ret
int9ptr dw 2 dup (?)
setint9 ENDP
;================================================= =========================
;------------------------------------------------- -------------------------
; Процедура восстановления прежнего (системного)
; Вектора прерывания от клавиатуры
;------------------------------------------------- -------------------------
;================================================= =========================
retint9 PROC
    push ds
    push dx
        mov dx, cs: int9ptr; ds: dx - указатель на начальную (системную)
        mov ds, cs: int9ptr +2; процедуру обработки прерывания от клавиатуры
        mov AH, 25H; установить вектор системной процедуры
        mov AL, 9; обработки прерывания от клавиатуры
        int 21H
 
pop dx
    pop ds
        mov int9set, 0h; разрешение следующих "перехватов"
        ret
retint9 ENDP
;================================================= =========================
;------------------------------------------------- -------------------------
; Процедура обработки прерываний от клавиатуры,
; Вызывается при любом нажатии или отжима клавиш клавиатуры,
; Осуществляет возврат в MS-DOS после отжима клавиши Esc
;------------------------------------------------- -------------------------
;================================================= =========================
userint9 proc far
esc_key equ 01h; скан-код клавиши esc
    pusha
    push es
        in al, 60h; ввести скан-код - разряды 0-6
        mov ah, al; седьмой разряд равен 0 при нажатии
        and al, 7fh; клавиши, 1 - при отжима
 
push ax; al - "чистый" скан-код (без признака
; Нажатие - отжима)
    push 2600
        call show; отражение скан-кода на экране
        cmp al, esc_key
        je ui9010
 
; (Вариант 2)
 
    pop es
    popa
        jmp dword ptr cs: int9ptr; переход на системную
                                    ; Процедуру обработки
                                    ; Прерываний от клавиатуры,
                                    ; Выполнит все необходимые действия, включая
                                    ; Возврат в прерванную программу
 
; (Вариант 1)
; САМОСТОЯТЕЛЬНАЯ РЕШЕНИЯ ПРОБЛЕМ С КЛАВИАТУРОЙ
 
ui9010:
        mov bx, ax
        in al, 61h; бит 7 порта 61h предназначен для ввода
; Подтверждающего импульса в клавиатуру ПЭВМ.
; Клавиатура блокируется пока не поступит
                                ; Подтверждающий импульс
        mov ah, al
        or al, 80h
        out 61h, al; вывод на клавиатуру L --- ¬
        jmp $ +2
        mov al, ah
        out 61h, al; подтверждающего импульса -----
        mov al, 20h; разблокировать в контроллере прерывания
                                ; Прохождения запросов на прерывание
; Текущего и меньшего уровней приоритета,
        out 20h, al; что обеспечит возможность последующего
; Прерывания от клавиатуры
        mov ax, bx
        cmp ah, al; проверка события прерывания - от нажатия
                               ; Или от отжима клавиши клавиатуры
        je ui9040
                               ; Отжима клавиши
ui9020:
    push es
        les bx, @ms_dos_busy; es: bx - адрес признаки
; Занятости MS-DOS
        mov al, es: [bx]; ax - признак занятости MS-DOS
    pop es
        or al, al; проверка
; Если была прервана работа MS-DOS
; В "неудачный" момент
        jnz ui9040; то нельзя от нее требовать
                               ; Выполнение ряда функций
; (В общем случае MS-DOS
; Не обеспечивает повторное вхождение)
        call retint8
        call retint9
        mov ax, 4c00h
        int 21h; ЗАКОНЧИТЬ РАБОТУ
; Многопрограммных МОДЕЛИ
ui9040:
    pop es; восстановить стек прерванной программы
    popa
        iret; закончить обработку прерывания
userint9 endp
;================================================= =========================
;------------------------------------------------- -------------------------
; Процедура обработки прерывания от таймера
; (Менеджер квантов)
; Коды состояния задач (используются в массиве init)
;------------------------------------------------- -------------------------
;================================================= =========================
ready equ 0; задача загружена в память и
                           ;Готовая к начального запуска
                           ; Статус устанавливается вне менеджером квантов
execute equ 1; задача выполняется
hesitation equ 2; задача приостановлена ??и ждет своей очереди
close equ 4; выполнение задачи завершено
stop equ 8; задача остановлена
                            ; Статус устанавливается и изменяется
                            ; Вне менеджера квантов
absent equ 16; задача отсутствует
;================================================= =========================
;------------------------------------------------- -------------------------
userint8 PROC far
;------------------------------------------------- -------------------------
;================================================= =========================
    pushad; сохранение РОН в стеке прерванной задачи
    push ds
 
; (Вариант 3)
 
pushf; программная имитация аппаратного прерывания
 
; Отметка признак разрешения на прерывание (if) аппаратурой сброшена в 0.
 
call cs: dword ptr int8ptr
; Вызов системной процедуры обработки прерывания int8,
; Которая, между прочим, разблокирует 8-е прерывание в контроллере прерываний
; Но аппаратные прерывания невозможны, поскольку if = 0
        mov ax, _data; в прерванной программе содержимое сегментного регистра
        mov ds, ax; ds в общем случае может быть любым
        inc clk; программный счетчик прерываний от таймера
; Может быть полезным при изучении модели
push clk
    push 2440
call show; вывод на экран значение счетчика
        xor esi, esi
        mov si, nprg
        cmp si, fon; прервана задача фоновая?
        je disp005
; Прервана задача не фоновая
        cmp clockt [si], 1; есть еще не использованные кванты?
        jc disp010
        dec clockt [si]; уменьшить счетчик квантов
 
pop ds
    popad; продолжить выполнение прерванной задачи
        iret
 
disp005:; прервана задача фоновая
        mov fonsp, sp
        mov nprg, max_prg - 1; обеспечить пересмотр задач с 0-вой
        mov cx, max_prg; max_prg - max количество задач
        jmp disp015
 
disp010:; прервана задача не фоновая
        mov stp [esi * 2], sp
        mov init [si], hesitation; приостановить текущую задачу
        mov cx, max_prg
 
disp015:
; Определение задачи, которой необходимо передать управление
        mov di, max_prg +1
        sub di, cx
        add di, nprg
        cmp di, max_prg
        jc disp018
        sub di, max_prg
 
disp018:
        xor ebx, ebx
        mov bx, di
 
; Push bx
    ; Push 3220
; Call show
; Сх пробегает значения max_prg, max_prg-1 ,..., 2,1
; Bx пробегает значения nprg +1, nprg +2 ,..., max_prg-1, 0 ,..., nprg
 
        cmp init [bx], ready
        je disp100; переход на первоначальный запуск задачи
        cmp init [bx], hesitation
        je disp020; переход на возобновление работы
                                    ; Следующей задачи
        loop disp015
 
; Отсутствуют задачи, которые можно запустит
; (Перезапустить), поэтому
 
        mov sp, fonsp; устанавливаем стек фоновой задачи
        mov nprg, fon
    
pop ds; из стека фоновой задачи восстанавливаем
    popad; содержимое регистров
        iret ;возврат в фоновую задачу
 
disp020:
; Восстановление работы следующей задачи
    ; Push bx
    ; Push 2480
    ; Call show
        mov nprg, bx
        mov sp, stp [ebx * 2]
        mov al, clock [bx]
        mov clockt [bx], al; установить разрешенную
                                    ; Количество квантов
        mov init [bx], execute; состояние задачи - задача выполняется
 
pop ds
    popad
        iret
 
disp100:
; Первоначальный запуск задачи
        mov nprg, bx
        mov sp, stp [ebx * 2]
        mov al, clock [bx]
        mov clockt [bx], al; установить разрешенную
                                    ; Количество квантов
        mov init [bx], execute
 
    push names [ebx * 2]; имя задачи
    push screen_addr [ebx * 2]; адрес "окна" для задачи на экране
    push 22; разрядность счетчика
        call Vcount; запуск
        xor esi, esi
        mov si, nprg ; на ax - номер задачи,
                                    ; Завершила свою работу в пределах
                                    ; Очередного кванта времени
        mov init [si], close
        mov sp, fonsp
        mov nprg, fon
    pop ds
    popad
        iret ;возврат в фоновую задачу
 
userint8 ENDP
;================================================= =========================
;------------------------------------------------- -------------------------
; Vcount - процедура для моделирования независимых задач
;Входные параметры:
; 1-й - имя задачи (два символа) [bp +8]
; 2-й - смещение в видеосторинци "окна" задачи [bp +6]
; 3-й - количество двоичных разрядов счетчика [bp +4]
; Выполняемые действия:
; При запуске:
; - Позволяет прерывания
; - Создает в стеке 10-байтных область для локальных данных
; Размещает в эту область по адресу [bp-2] состояние от деления
; 3-го параметра на 32 (фактическая разрядность счетчика -
; Перестраховка от ошибок в задании разрядности)
; - Записывает в эту область по адресу [bp-6] маску с числом
; Единиц в младших разрядов равным фактической
; Разрядности счетчика
; - Записывает в ноль в 4-х байт ный счетчик по адресу [bp-10]
 
; Далее в цикле:
; - Выводит показатели счетчика на экран
; - Увеличивает значение счетчика на 1
; Завершения задачи после перехода счетчика
; Из состояния "все единицы" в состояние все 0
;------------------------------------------------- -------------------------
;================================================= =========================
Vcount proc near
    push bp
        mov bp, sp
        sub sp, 10 ;формирование в стеке области для
                                ; Хранения данных
        sti
 
push es
        mov ax, 0b800h
        mov es, ax
mov ax, [bp +4]; ax = количество разрядов счетчика
        and ax, 31; ax = ax mod 32 (для перестраховки)
        mov [bp-2], ax; по [bp-2] количество разр. счетчика
                                ; <32
        mov cx, ax
        mov eax, 001b
        shl eax, cl
        dec eax; eax - маска с числом 1 равным
                                ; Количества разрядов счетчика
        mov [bp-6], eax
        mov dword ptr [bp-10], 0; сброс счетчика
        mov di, [bp +6]; вывод имени задачи
        mov dx, [bp +8]
        mov ah, 1011b
        mov al, dh
        
cld
        
stosw
        mov al, dl
        
stosw
        std; подготовка к выводу счетчика
        add di, cx; начиная с младших разрядов
        add di, cx
        mov bx, di
        xor edx, edx
 
l20:; вывод показателей счетчика в двоичном
                                ; Формате
        mov di, bx
        mov cx, [bp-2]
        mov ah, 1010b; 1010b атрибут символа, атрибут фона - 0
                                ; (Черный)
 
l40:
        mov al, '0'
        shr edx, 1
        jnc l60
        mov al, '1'
 
l60:
        stosw
        loop l40
 
        inc dword ptr [bp-10]; +1 в счетчик
        mov edx, dword ptr [bp-10]
        and edx, [bp-6]; проверки на 0
        jnz l20
 
    pop es
        add sp, 10
        mov ax, [bp +8]
        and ax, 0fh
        cli
    pop bp
        ret 6
Vcount endp
;================================================= =========================
;================================================= =========================
show proc near
    push bp
        mov bp, sp
    pusha
    push es
        mov ax, 0b800h
        mov es, ax
        std
 
ls20:
        mov di, [bp +4]
        mov bx, [bp +6]
        mov cx, 4
        mov ah, 0ah
 
ls40:
        mov al, bl
        and al, 00001111b
        cmp al, 10
        jl ls100
        add al, 7
 
ls100:
        add al, 30h
        stosw
        shr bx, 4
        loop ls40
 
pop es
    popa
    pop bp
        ret 4
show endp
;================================================= =========================
;================================================= =========================
begin:
        mov ax, _data
        mov ds, ax
 
        mov ax, 3; задать текстовый режим 80 на 25
        int 10h
 
        mov ah, 10h; отключить режим мигания
        mov al, 3
        mov bl, 0
        int 10h
 
        mov cx, max_prg
        xor esi, esi
        mov bx, 4
 
b10:
 mov screen_addr [esi * 2], bx; заполнения таблицы
                               ; Адресов вывода для задач
 mov init [si], ready; первоначальное заполнение
; Таблицы состояния задач
 add bx, 80
        inc si
        loop b10
 
; SETINT
 
cli; запрет прерываний
mov ah, 34h
int 21h; es: bx - адрес признаки занятости MS-DOS
 
mov word ptr @ms_dos_busy, bx
mov word ptr @ms_dos_busy +2, es
 
call setint8; "перехват" int8
call setint9; "перехват" int9
 
lss sp, sssp; стек фоновой задачи
mov nprg, fon
 
push 'FN'
    push 1800
    push 30
        call Vcount; запуск фоновой задачи
; В процедуре Vcount устанавливается разрешение
; На прерывание и при очередных прерываниям
; От таймера менеджер квантов (userint8)
; Будет запускать другие задачи
 
; Управление в эту точку будут переданы по команде RET после завершения фоновой
; Задачи, а это возможно лишь после завершения других задач
 
       call retint8; восстановление системных векторов
      call retint9
sti
      mov ax, 4c00h
     int 21h
 _TEXT ENDS
end begin
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2011, 02:52
Ответы с готовыми решениями:

Программирование внешних устройств
Программирование внешних устройств Целью этой лабораторной работы является изучение способов...

Программирование внешних устройств
Здравствуйте активные пользователи сего форума :) Хотелось бы попросить помощи у знающих людей....

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание...

Обработчик прерывания int 21h (по книге Калашникова)
Доброе время суток, я чтиаю книгу Калашникова-Ассемблер и уже втрой день не могу понять почему...

3
Идеи становятся силой...
121 / 121 / 64
Регистрация: 08.12.2009
Сообщений: 445
12.04.2011, 01:51  [ТС] 2
подскажите пожалуйста , как вставить процедуру для обработки мышью, а именно как его прописать, что бы задача Hesitation останавливалась? (теориетически)
0
Идеи становятся силой...
121 / 121 / 64
Регистрация: 08.12.2009
Сообщений: 445
30.05.2011, 20:59  [ТС] 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
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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
.386
;===============================================================================
;-------------------------------------------------------------------------------
;           МОДЕЛЬ МУЛЬТИПРОГРАМНОЇ СИСТЕМИ
;===============================================================================
;-------------------------------------------------------------------------------
max_prg     equ     10      ; максимальна кількість "одночасно"
                            ; виконуваних  задач
time_slice  equ     65535   ; кількість мікросекунд, виділених на один
                            ; квант часу (максимальне значення 65535)
_ST     SEGMENT     WORD STACK 'stack' use16
            dw      32000 dup (?)
    top     label   word
            dw      100 dup (?)     ; резерв для помилок
                                    ; анти переповнення стека
_ST     ENDS
 
_DATA   SEGMENT    WORD PUBLIC 'DATA' use16
 
    @ms_dos_busy    dd    (?)       ; логічна адреса ознаки зайнятості MS-DOS
 
    int8set db  0                   ; ознака перехоплення переривання від таймера
    int9set db  0                   ; ознака перехоплення переривання від клавіатури
 
    fon     equ     max_prg         ; ознака фонової задачі;
    fonsp   label   word            ; адреса збереження SP фонової задачі
    sssp    dd      top             ; логічна адреса стека фонової задачі
; масив значень SP для задач, (для стека кожної задачі відведено 1000 слів)
; задані початкові значення 
    stp     dw      1000,  2000,  3000,  4000
            dw      5000,  6000,  7000,  8000
            dw      9000,  10000, 11000, 12000
            dw      13000, 14000, 15000, 16000
    nprg    dw      0               ; номер активної задачі (від 0 до 
                                    ; max_prg-1)
                                    ; або ознака фонової задачі (fon)
 
; масив стану задач
    init    db      16 dup (0)
; масив дозволеного числа квантів задач
    clock   db      16 dup (1)
; масив лічильників квантів задач 
    clockt  db      16 dup (0)
    screen_addr     dw      16 dup (0)  ; адреса (зміщення від початку відеосторінки)
                                        ; області введення на екран значень задачі
; масив імен задач
    names   label   word
            db      '0T1T2T3T4T5T6T7T8T9TATBTCTDTETFT'
    clk     dw      0                   ;   лічильник переривань від таймера 
    intmset db      0
    pressed db      0
    stopped db      16 dup(0)
_DATA         ENDS
 
_TEXT    SEGMENT     BYTE PUBLIC 'CODE' use16
ASSUME  CS:_TEXT, DS:_DATA
;===============================================================================
;-------------------------------------------------------------------------------
; процедура "перехоплення" переривання від таймера (int8)
;===============================================================================
;-------------------------------------------------------------------------------
setint8 PROC
;-------------------------------------------------------------------------------
    mov al, int8set
    or  al, al              ; контроль "перехоплення" перехоплень
    jnz zero_8   
    MOV AH, 35H             ; отримати вектор переривання
    MOV AL, 8               ; переривання від таймера (8)
    INT 21H                 ; значення що повертається:
; es:bx - логічна адреса системної процедури
; обробки переривання від таймера
    mov cs:int8ptr, bx      ; зберегти логічну адресу системної
    mov cs:int8ptr+2,es     ; процедури в сегменті кодів
 
    mov dx,offset userint8  ;формування в ds:dx логічної
    push ds                 ; адреси процедури користувача
    push cs                 ; для обробки переривань від таймера
    pop  ds
        MOV AH,25H          ; встановити вектор
        MOV AL,8            ; переривання від таймера
        INT 21H             ; ds:dx - покажчик на користувацьку
; процедуру оброб. переривання від ;таймера
        mov ax, time_slice  ; встановити задану величину кванту часу
        out 40h, al         ; 40h - адреса 8-розрядного порта таймера, 
; через який задають період таймера 
; спочатку молодший байт,
; а потім старший
        jmp $ + 2           ; стандартний метод узгодження швидкісного
                            ; процесора з більш повільним зовнішнім
                            ; пристроєм. Припускаємо, що
                            ; "безглузда" команда jmp очищує буфер
                            ; попередньої вибірки команд і, тим самим,
                            ; уповільнює роботу процесора. Тим часом
                            ; зовнішній пристрій буде готовий 
                            ; прийняти наступний байт
        nop
        mov al, ah          ; (старший байт)
        out 40h, al
    pop ds
    mov int8set, 0ffh       ; заборона повторних входжень
zero_8:
    ret
int8ptr  dw 2 dup (?)
setint8  ENDP
;===============================================================================
;-------------------------------------------------------------------------------
;  Процедура відновлення вектора переривання від таймера
;===============================================================================
;-------------------------------------------------------------------------------
retint8 PROC
;-------------------------------------------------------------------------------
    push ds
    push dx
        mov al, 0ffh            ; відновити нормальну роботу
        out 40h, al             ; системного таймера
        jmp $+2
        nop
        out 40h, al
        mov dx, cs:int8ptr
        mov ds, cs:int8ptr+2
 
        MOV AH, 25H         ; відновити початковий вектор
        MOV AL, 8           ; переривання від таймера
        INT 21H             ; ds:dx - вказівник (логічна адреса) 
    ; на початкову (системну) процедуру
    ; оброб. переривання від таймера
    pop dx
    pop ds
        mov int8set, 0h      ; дозвіл наступних "перехоплень"
    ret
retint8 ENDP
;===============================================================================
;-------------------------------------------------------------------------------
setint9 PROC
;===============================================================================
;-------------------------------------------------------------------------------
;  процедура "перехоплення" переривання від клавіатури (int9)
;-------------------------------------------------------------------------------
    mov al, int9set
    or  al, al
    jnz zero_9
    MOV AH, 35H             ; отримати вектор переривання
    MOV AL, 9               ; переривання від клавіатури (9)
    INT 21H                 ; значення що повертається:
                            ; es:bx - вказівник на системну процедуру
                            ; обробки переривання від клавіатури
    mov cs:int9ptr, bx      ; зберегти в сегменті кодів вказівник 
    mov cs:int9ptr+2, es    ; на системну процедуру
 
    mov dx, offset userint9
    push ds
    push cs                 ; ds:dx - вказівник на процедуру користувача
    pop  ds                 ; оброб. переривання від клавіатури
        MOV AH, 25H         ; встановити вектор "перехоплення"
        MOV AL, 9           ; переривання від клавіатури (9)
        INT 21H             
    pop ds
        mov int9set,0ffh    ; заборона повторних входжень
    zero_9:
        ret
int9ptr dw  2 dup (?)
setint9 ENDP
;===============================================================================
;-------------------------------------------------------------------------------
;  Процедура відновлення попереднього (системного)
;  вектора переривання від клавіатури
;===============================================================================
;-------------------------------------------------------------------------------
retint9 PROC
;-------------------------------------------------------------------------------
    push ds
    push dx
        mov dx, cs:int9ptr      ; ds:dx - покажчик на початкову (системну)
        mov ds, cs:int9ptr+2    ; процедуру обробки переривання від клавіатури
        MOV AH, 25H             ; встановити вектор системної процедури
        MOV AL, 9               ; обробки переривання від клавіатури
        INT 21H                  
    pop dx
    pop ds
    mov int9set, 0h             ; дозвіл наступних "перехоплень"
        ret
retint9 ENDP
;===============================================================================
;-------------------------------------------------------------------------------
; Процедура обробки переривань від клавіатури,
; викликається при любому натисканні або відтисканні клавіш клавіатури,
; здійснює повернення в MS-DOS після відтискання клавіші Esc
;===============================================================================
;-------------------------------------------------------------------------------
userint9    proc    far
;-------------------------------------------------------------------------------
esc_key equ 01h             ; скан-код клавіші esc
    pusha
    push es
        in al, 60h          ; ввести скан-код - розряди 0-6
        mov ah, al          ; 7-ий розряд дорівнює 0 при натисканні
        and al, 7fh         ; клавіші, 1- при відтисканні
        push ax             ; al - "чистий" скан-код (без ознаки 
                            ; натискання - відтискання) 
        push 2600
            call show           ; відображення скан-коду на екрані
            cmp al, esc_key
            je ui9010
; (варіант 2)
    pop es
    popa
    jmp dword ptr cs:int9ptr    ; перехід на системну
                                ; процедуру обробки
                                ; переривань від клавіатури, яка
                                ; виконає всі необхідні дії, включаючи
                                ; повернення в перервану програму
; (варіант 1)
; САМОСТІЙНЕ ВИРІШЕННЯ ПРОБЛЕМ З КЛАВІАТУРОЮ
    ui9010:
    mov bx, ax
    in  al, 61h                 ; біт 7 порта 61h призначений для введення
                                ; підтверджуючого імпульсу в клавіатуру ПЕОМ.
                                ; Клавіатура блокується поки не надійде
                                ; підтверджуючий імпульс
    mov ah, al
    or  al, 80h
    out 61h,al                  ; виведення на клавіатуру  L---¬     
    jmp $+2 
    mov al, ah                                |
    out 61h, al                 ; підтверджуючого імпульсу   -----
    mov al, 20h                 ; розблокувати в контролері переривання
                                ; проходження запитів на переривання 
                                ;поточного та меншого рівнів пріоритету,
    out 20h, al                 ; що забезпечить можливість наступного 
                                ; переривання від клавіатури
    mov ax, bx
    cmp ah, al                  ; перевірка події переривання - від натискання
                                ; чи від відтискання клавіші клавіатури
    je  ui9040
                                ;відтискання клавіші
    ui9020:
    push    es
        les bx, @ms_dos_busy    ; es:bx - адреса ознаки 
                                ; зайнятості MS-DOS
        mov al, es:[bx]         ; ax - ознака зайнятості MS-DOS
    pop es
    or al, al                   ; перевірка
; якщо була перервана робота MS-DOS
; в "невдалий" момент
    jnz         ui9040          ; то не можна від неї вимагати
                                ; виконання ряду функцій
                                ; (в загальному випадку MS-DOS 
                                ; не забезпечує повторне входження)
    call retint8
    call retint9
    mov  ax, 4c00h
    int  21h                    ; ЗАКІНЧИТИ РОБОТУ
; БАГАТОПРОГРАМНОЇ МОДЕЛІ
    ui9040:
    pop es                      ; відновити стек перерваної програми
    popa
        iret                    ; закінчити обробку переривання
userint9 endp
;===============================================================================
;-------------------------------------------------------------------------------
; процедура обробки переривання від таймера
; (менеджер квантів)
; коди стану задач (використовуються в масиві init)
ready       equ     0       ; задача завантажена в пам’ять і
                            ; готова до початкового запуску
                            ; статус встановлюється поза менеджером квантів
execute     equ     1       ; задача виконується
hesitation  equ     2       ; задача призупинена і чекає своєї черги
close       equ     4       ; виконання задачі завершено
stop        equ     8       ; задача зупинена  
                            ; статус встановлюється і змінюється
                            ; поза менеджера квантів
absent      equ     16      ; задача відсутня 
;===============================================================================
;-------------------------------------------------------------------------------
userint8    PROC    far
;-------------------------------------------------------------------------------
    pushad                  ; збереження РОН в стеку перерваної задачі
    push ds
; (варіант 3)
    pushf                   ; програмна імітація апаратного переривання
; ВІДМІТИМО - ознака дозволу на переривання (if) апаратурою скинута в 0.
        call cs:dword ptr int8ptr
            ;виклик системної процедури обробки переривання int8,
            ;яка, між іншим, розблокує 8-ме переривання в контролері переривань 
            ;але апаратні переривання не можливі, оскільки if=0
        mov ax, _data       ;в перерваній програмі вміст сегментного регістра
        mov ds, ax          ;ds в загальному випадку може бути любим
        inc clk             ; програмний лічильник переривань від таймера
        push clk                ; може бути корисним при вивченні моделі
        push 2440
            call show           ; виведення на екран значення лічильника
            xor esi, esi
            mov si, nprg
            cmp si, fon         ; перервана задача фонова ?
            je disp005
                                ; перервана задача не фонова
            cmp clockt[si], 1   ; є ще не використані кванти ?
            jc disp010
            dec clockt[si]      ; зменшити лічильник квантів
    pop ds
    popad                       ; продовжити виконання перерваної задачі
        iret
    disp005:                        ; перервана задача фонова
        mov fonsp, sp
        mov nprg, max_prg-1         ; забезпечити перегляд задач з 0-вої
        mov cx, max_prg             ; max_prg - max кількість задач
        jmp disp015
    disp010:                        ; перервана задача не фонова
        mov stp[esi*2], sp              
        mov init[si], hesitation    ; призупинити поточну задачу
        mov cx, max_prg
    disp015:
    ; визначення задачі, якій необхідно передати управління
        mov di, max_prg+1
        sub di, cx
        add di, nprg
        cmp di, max_prg
        jc disp018
        sub di, max_prg
    disp018:
        xor ebx, ebx
        mov bx, di
;push       bx
;push       3220
;call       show
; сх пробігає значення max_prg,max_prg-1,...,2,1
; bx пробігає значення  nprg+1,nprg+2,...,max_prg- 
;1,0,...,nprg
        cmp init[bx], ready
        je disp100                  ; перехід на початковий запуск задачі
        cmp init[bx], hesitation
        je disp020                  ; перехід на відновлення роботи
; наступної задачі
        loop disp015
; відсутні  задачі, які можна запустить
; (перезапустити), тому 
        mov sp, fonsp               ; установлюємо стек фонової задачі
        mov nprg, fon
        pop ds                      ; із стека фонової задачі відновлюємо
        popad                       ; вміст регістрів
        iret                        ; повернення в фонову задачу
        disp020:
; відновлення роботи наступної задачі
;push  bx
;push  2480
;call  show
        mov nprg ,bx
        mov sp, stp[ebx*2]
        mov al, clock[bx]
        mov clockt[bx], al          ; встановити дозволену
                                    ; кількість квантів
        mov init[bx], execute       ; стан задачі - задача виконується
    pop ds
    popad
        iret
    disp100:
; першопочатковий запуск задачі
        mov nprg, bx
        mov sp, stp[ebx*2]
        mov al, clock[bx]
        mov clockt[bx], al          ; встановити дозволену
                                    ; кількість квантів
        mov init[bx], execute
        push names[ebx*2]           ; ім'я задачі
        push screen_addr[ebx*2]     ; адреса "вікна" для задачі на екрані 
        push 22                     ; розрядність лічильника
            call Vcount             ; запуск
            xor esi, esi
            mov si, nprg            ; на ax - номер задачі, яка
; завершила свою роботу в межах
; чергового кванту часу
            mov init[si], close
            mov sp, fonsp
            mov nprg, fon
        pop         ds
        popad
            iret                    ; повернення в фонову задачу
userint8       ENDP
;===============================================================================
;-------------------------------------------------------------------------------
;           ВЫПОЛНЕНИЕ ЗАДАНИЯ
;===============================================================================
;-------------------------------------------------------------------------------
setmous PROC 
;-------------------------------------------------------------------------------
    pusha                   ; записываем (размещаем) в стеке регистры общего назанчния
                            ; AX, CX, DX, BX, SP, BP, SI, DI
        MOV al, intmset
        or  al, al
        jnz zero_m
             
        xor ax, ax
        mov ax, 0ch         ; функция 0Ch позволяет программно задать реакцию на события 
                            ; связанные с мышью: ее перемещения, нажатие и отпускание кнопок. 
                            ; события, на которые необходимо реагировать, должны быть отмечены 
        mov cx, 100b        ; единицами в соответствующих разрядах регистра CX.
    push es
    push cs                 ; связываем мышь...
    pop es
        lea dx, userintm    ; получение эфективно адресса источника
        int 33h             ; инициализация мыши
    pop es
        xor cx, cx
        mov intmset, 0ffh
    zero_m:
    popa
        ret
setmous ENDP
;-------------------------------------------------------------------------------
retmous PROC
;-------------------------------------------------------------------------------
push ax
    xor cx, cx
    mov ax, 0ch             ;функция 0Ch позволяет программно задать реакцию на события
                            ; связанные с мишью
    int 33h                 ;драйвер мыши. Если эта функция возвращает AX = 0, то драйвер 
                            ;отсутствует. Если драйвер загружен, то AX = 0FFFFh , а в 
                            ;регистре BX - число кнопок мыши
    mov intmset, 0h
pop ax
    ret     
retmous ENDP
;===============================================================================
;-------------------------------------------------------------------------------
; в данной процедури происходит сравнение с нашей задачей, если была нажата 
; соответствующая конпка мыши, то есть в нашем случае именно правая, то
; при сравнении, приостановить данную задачу, после чего, при повтороном
; нажатии кнопки , продолжить выполнение задачи
;===============================================================================
;-------------------------------------------------------------------------------
userintm PROC far
;-------------------------------------------------------------------------------
pusha
        mov bl, pressed
        or  bl, bl          ; нажималась ли мышь
        jnz wp              ; мышь уже нажималась
                            ; не нажималась
        xor ax, ax
        mov al, 10h
        mov si, 0
    wh:
        cmp si, ax
        
        je ex               ; если равно...                
        
        cmp init[si], hesitation    ; сравниваем с нашей задачей, если это она и 
                                    ; мишь кпопки нажата, то приостановить 
        jne goon                    ; если не ноль
        
        mov init[si], stop
        mov stopped[si], 0ffh       ; 255
    goon:
        inc si
        jmp wh                      ; передача управления...
        
    wp:
                                    ; нажималась
        xor ax, ax
        mov al, 10h
        mov si, 0
    fr:
        cmp si, ax
        
        je ex                       ; если равно...
; если функция преостановлена то работает в этой части области процедуры
; для возобновления задачи        
        cmp stopped[si], 0ffh       ; 255
        
        jne ns                      ; если не равно...
        
        mov init[si], hesitation
        not stopped[si]
    ns:
        inc si                      ; ++
        jmp fr                      ; передача управления...
        
    ex:
        not bl                      ; устанавливаем обpатное значение бит
        mov pressed, bl
popa
    ret
userintm ENDP
;===============================================================================
;-------------------------------------------------------------------------------
;       КОНЕЦ ВЫПОЛНЕНИЯ
;===============================================================================
;-------------------------------------------------------------------------------
 
;===============================================================================
;-------------------------------------------------------------------------------
; Vcount - процедура для моделювання незалежних задач 
; вхідні параметри:
;   1-й - ім'я задачі (два символа) [bp+8]
;   2-й - зміщення в відеосторінці "вікна" задачі [bp+6]
;   3-й - кількість двійкових розрядів лічильника [bp+4]
; Виконувані дії:
;    при запуску:
;  - дозволяє переривання
;  - створює в стеку 10-байтну область для локальних даних
;  - розміщує в цю область по адресі [bp-2] статок від ділення
;               3-го параметра на 32 (фактична розрядність лічильника -
;               перестраховка від помилок в завданні розрядності)
;   - записує в цю область по адресу [bp-6] маску з числом
;               одиниць в молодших розрядів рівним фактичній 
;               розрядності лічильника
;  - записує в нуль в 4-х байт ний лічильник по адресу [bp-10]
 
;   в подальшому в циклі:
;           - виводить показники лічильника на екран
;           - збільшує значення лічильника на 1
;  завершення задачі після переходу лічильника 
;  з стану "всі одиниці" в стан всі 0
;-------------------------------------------------------------------------------
Vcount proc    near
;-------------------------------------------------------------------------------
    push    bp
        mov bp, sp
        sub sp, 10                          ; формування в стеку області для
                                            ; збереження даних
        sti
        push es
            mov     ax, 0b800h
            mov     es, ax
            mov     ax, [bp+4]              ; ax = кількість розрядів лічильника
            and     ax, 31                  ; ax=ax mod 32 (для перестраховки)
            mov     [bp-2], ax              ; по [bp-2] кількість розр. лічильника <32
            mov     cx,ax
            mov     eax,001b
            shl     eax,cl
            dec     eax                     ; eax - маска с числом 1 рівним
; кількості розрядів лічильника
            mov     [bp-6], eax
            mov     dword ptr [bp-10], 0    ; скидання лічильника
            mov     di, [bp+6]              ; вивід імені задачі
            mov     dx, [bp+8]
            mov     ah, 1011b
            mov     al, dh
            cld
            stosw
            mov     al, dl
            stosw
            std                             ; підготовка до виводу лічильника
            add     di, cx                  ; починаючи с молодших розрядів
            add     di, cx
            mov     bx, di
            xor     edx, edx
        l20:                                ; вивід показників лічильника  в двоїчному 
                                            ; форматі
            mov     di, bx
            mov     cx, [bp-2]
            mov     ah, 1010b               ; 1010b атрибут символу, атрибут фона - 0 
                                            ; (чорний)
        l40:
            mov     al, '0'
            shr     edx, 1
            jnc     l60
            mov     al, '1'
        l60:
            stosw
            loop    l40
            inc     dword ptr [bp-10]       ; +1 в лічильник
            mov     edx, dword ptr [bp-10]
            and     edx, [bp-6]             ; перевірка на 0
            jnz     l20
        pop     es
        add     sp, 10
        mov     ax, [bp+8]
        and     ax, 0fh
        cli
    pop     bp
        ret 6
Vcount endp
;===============================================================================
;-------------------------------------------------------------------------------
;===============================================================================
;-------------------------------------------------------------------------------
show    proc    near
;-------------------------------------------------------------------------------
    push bp
        mov bp, sp
        pusha
        push es
            mov     ax, 0b800h
            mov     es, ax
            std
        ls20:
            mov     di, [bp+4]
            mov     bx, [bp+6]
            mov     cx, 4
            mov     ah, 0ah
        ls40:
            mov     al, bl
            and     al, 00001111b
            cmp     al, 10
            jl  ls100
            add     al, 7
        ls100:
            add     al, 30h
            stosw
            shr     bx, 4
            loop    ls40
    pop es
    popa
    pop bp
        ret     4
show  endp
;===============================================================================
;-------------------------------------------------------------------------------
;===============================================================================
;-------------------------------------------------------------------------------
;===============================================================================
;-------------------------------------------------------------------------------
    begin:
        mov     ax, _data
        mov     ds, ax
        mov     ax, 3                       ; задати текстовий режим 80 на 25
        int     10h
        mov     ah, 10h                     ; відключити режим миготіння
        mov     al, 3
        mov     bl, 0
        int     10h
        mov     cx, max_prg
        xor     esi, esi
        mov     bx, 4
    b10:
        mov     screen_addr[esi*2], bx      ; заповнення таблиці
                                            ; адрес виводу для задач
        mov     init[si],ready              ; першопочаткове заповнення
                                            ; таблиці стану задач
        add     bx, 80
        inc     si
        loop    b10
;SETINT
        cli                                 ; заборона переривань
        mov     ah, 34h
        int     21h                         ; es:bx - адреса ознаки зайнятості MS-DOS
        mov     word ptr @ms_dos_busy, bx
        mov     word ptr @ms_dos_busy+2, es
 
        call        setint8                 ; "перехоплення" int8
        call        setint9                 ; "перехоплення" int9
        call        setmous                 ; вызов процедуры пользователя
 
        lss         sp, sssp                ; стек фонової задачі
        mov         nprg, fon
        push        'FN'
        push        1800
        push        30
            call        Vcount              ; запуск фонової задачі
; в процедурі Vcount установлюється дозвіл
;на переривання і при чергових перериваннях
; від таймера менеджер квантів (userint8) 
; буде запускать інші задачі
; управління в цю точку буде передано по команді RET по завершені фонової 
; задачі, а це можливо лише після завершення інших задач
            call        retint8     ; відновлення системних векторів 
            call        retint9
            call        retmous
        sti
    mov ax,4c00h
    int 21h
 _TEXT   ENDS
end  begin
0
Идеи становятся силой...
121 / 121 / 64
Регистрация: 08.12.2009
Сообщений: 445
01.06.2011, 02:11  [ТС] 4
Цитата Сообщение от Hidalgo08 Посмотреть сообщение
кто может уделить время, пжл помгите, в чем причина?
разобрался, потестил внимательно, получается что так и надо было, а точнее так и получатся что один процес будет крутиться.
0
01.06.2011, 02:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2011, 02:11
Помогаю со студенческими работами здесь

Вычислить адрес вектора прерывания по номеру прерывания.
17. По заданному номеру прерывания (13 h) вычислите логические адреса хранения исходных адресов...

Подключение внешних устройств к Acer'aм.
Может и был такой вопрос, плохая связь, долго просматривать всё. Глупый правда вопрос, но как...

Подключение внешних устройств к MatLab
Добрый день, уважаемые форумчане. Столкнулся с такой проблемой, что необходимо подключить...

C++ Win32 Project: ПРОГРАММИРОВАНИЕ ВНЕШНИХ УСТРОЙСТВ
Помогите пожалуйста. На базе архитектуры WIN 32 Application создать многооконное приложение: ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru