Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75

Создание пользовательского обработчика прерывания, определяющего наименьшее значение в массиве

25.09.2017, 17:40. Показов 1864. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят,как мне в прерывании поменять его функционал
Например ,есть номер прерывания 6E ,а мне нужно чтобы эта процедура определяла наименьшее значение в массиве
Спасибо за внимание
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2017, 17:40
Ответы с готовыми решениями:

Создание пользовательского обработчика прерывания определяющего установку единиц в 9-ом и 2-ом битах слова
Можете, пожалуйста, объяснить код и сказать является ли он верным? .386 cseg segment use16 assume cs:cseg chsl dw 0204h segm dw...

Выход из обработчика прерывания
Есть обработчик прерывания, который проверяет состояние кнопки и в зависимости от состояния кнопки переходит в определенный адрес. Как...

Выход из обработчика прерывания
Задача: По прерыванию (нажатие кнопки) нужно покинуть рабочий цикл и передать управление некой подпрограмме. Обработчик прерывания: ...

16
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 18:50
Назначить собственный обработчик на указанное прерывание (перехватить прерывание). Внизу перечислены подобные темы.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 19:00  [ТС]
ФедосеевПавел, где внизу?=)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 19:06
В самой нижней части данной веб-страницы есть таблица "Похожие темы".
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 19:52  [ТС]
ФедосеевПавел, я вот вроде все прочитал,но все равно не могу понять
Вот я вроде написал шапку,сделал кодовый сегмент и сегмент данных(на всякий случай),вызвал прерывание,а что делать дальше не могу понять=(
Как мне его перехватить и заставить делать то ,что мне нужно
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.386
 
volnistii segment use16
 
 
volnistii ends
 
skajida segment use16
 
assume ds:volnistii,cs:skajida
 
ahahah: mov dx,volnistii
 
    mov ds,dx
 
    
 
    int 6eh
 
skajida ends
 
end ahahah
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 20:23
Начните с того, что решите задачу по написанию программы с процедурой, которая бы
Цитата Сообщение от adam1105 Посмотреть сообщение
определяла наименьшее значение в массиве
Параметры в процедуру передавайте через регистры.

А потом уже оформите процедуру в прерывание.

Так даже не знаю, что посоветовать... Попробуйте почитать методичку. В ней, обычно, содержится до 80% кода.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 20:42  [ТС]
ФедосеевПавел, как найти наименьшее я понимаю,я не знаю,как мне перейти к этому(от вызова процедуры к ее изменению),вот у меня входные параметры это адрес массива и его длина ,а выходные это минимальное значение,но я не понимаю ,как мне перейти от строчки Int 6eh к этому
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 21:19
По ссылке Написание собственного прерывания пример перехвата прерывания, только ему нужно не минимум в массиве найти, а массив символов перебрать и по одному вывести на экран.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 21:42  [ТС]
ФедосеевПавел, по поводу этих строк
mov ah, 35h ;функция получения вектора
mov al, 60h ;номер вектора
int 21h

у меня вместо Int 21h будет же 6Eh?
и почему он взял во второй и третьей строчках 35 и 65
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 21:52
Не знаю. Думаю, что он прочитал справку http://www.codenet.ru/progr/dos/int_0026.php

Добавлено через 6 минут
Ловлю на слове
Цитата Сообщение от adam1105 Посмотреть сообщение
как найти наименьшее я понимаю,
Сделайте эту часть, и я помогу завершить.
Только нужно, чтобы параметры процедуре передавались через регистры.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 23:05  [ТС]
ФедосеевПавел, вот вроде сделал,правда нет возможности сейчас прогнать код в проге
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
.386
 
volnistii segment use16
 
mass db 1,-2,34,-40,14,23,-31,0
 
 
 
volnistii ends
 
skajida segment use16
 
assume ds:volnistii,cs:skajida
 
ahahah: mov dx,volnistii
 
    mov ds,dx
 
    
    mov si,0
    mov di,1
 
     m1:mov al,ds:mass[si]          ;до
    cmp ds:mass[di],al
    jl short levii
    mov bh,al
    inc si
    inc di
    cmp si,8
        ja short end
    jmp short m1
 
 
  levii:mov bh,ds:mass[di]
    inc si
    inc di
    cmp si,8
        ja short end
    jmp short m1
 
 
 
 
 
    end:mov ah,4ch
    int 21h
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.09.2017, 23:09
Завтра вечером вернусь из командировки и попробую доработать.
0
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
25.09.2017, 23:17  [ТС]
ФедосеевПавел, ок,спасибо,если у самого получится ,то напишу=)
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
26.09.2017, 01:28
Цитата Сообщение от adam1105 Посмотреть сообщение
mov ah, 35h ;функция получения вектора
mov al, 60h ;номер вектора
int 21h
Цитата Сообщение от adam1105 Посмотреть сообщение
и почему он взял во второй и третьей строчках 35 и 65
35h - стандартная функция получения старого вектора, чтобы восстановить его заново после того как полностью закончит использование новый назначенный вектор.. номер вектора указывается в регистре al, для твоего случая 6Eh..
Assembler
1
2
3
mov ah, 35h
mov al, 6Eh
int 21h
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
27.09.2017, 00:45
Сначала нужно получить работающую процедуру
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
volnistii   segment use16
    mass    dw  1,-2,34,-40,14,23,-31,0
    len dw  ($-mass)/2
volnistii ends
 
skajida     segment use16
 
assume ds:volnistii,cs:skajida
 
ahahah:
    mov dx, volnistii
    mov     ds, dx
 
    lea dx, mass
    mov cx, len
    call    ArrayMin
 
    call    Show_AX
 
 
Exit:
    mov ax, 4c00h
    int     21h
 
;на входе:
;ds:dx - адрес массива
;cx    - длина массива
;на выходе
;ax - минимальный элемент
ArrayMin    proc
    push    bx
    push    cx
    push    dx
    push    si
    push    di
 
    mov ax, 0
    ;если массив пустой - выход
    jcxz    Break
    mov si, dx
    mov ax, [si]    ;Min:=A[0]
    dec cx
    ;если в массиве единственный элемент
    jcxz    Break
 
    add si, 2
 
ForI:               ;for i:=1 to N-1
    cmp ax, [si]    ;  if Min>A[i] then
    jle NextI
    mov ax, [si]    ;    Min:=A[i]
NextI:
    add si, 2
    loop    ForI
 
Break:
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    ret
ArrayMin    endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx,     10
        xor     di,     di  ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        push    ax
        mov     dx,     '-'
        mov     ah,     2   ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ; выводим из стека на экран
@@Show:
        pop     dx              ; dl = очередной выводимый символ
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
skajida     ends
end ahahah
Потом переделать её в прерывание

Добавлено через 19 минут
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
volnistii       segment use16
        mass    dw      1,-2,34,-40,14,23,-31,0
        len     dw      ($-mass)/2      ;длина массива
 
        int6Eold        dd      ?       ;адрес исходного вектора 6E
volnistii ends
 
_stack  segment stack
        db      1024 dup(?)
_stack  ends
 
 
skajida         segment use16
 
assume ds:volnistii,cs:skajida
 
ahahah:
        mov     dx,     volnistii
        mov     ds,     dx
 
        ;сохранение исходного вектора прерывания
        mov     ah,     35h     ;функция получения вектора
        mov     al,     6Eh     ;номер вектора
        int     21h
 
        mov     word ptr[int6Eold+2],   es      ;сохраняем сегмент
        mov     word ptr[int6Eold],     bx      ;сохраняем смещение
        ;установка собственного вектора прерывания
        push    ds                      ;сохраняем ds
        mov     dx,     offset ArrayMin ;смещение для процедуры в dx
        mov     ax,     seg ArrayMin
        mov     ds,     ax
        mov     ah,     25h             ;функция установки вектора
        mov     al,     6Eh             ;номер вектора
        int     21h                     ;меняем прерывание
        pop     ds               ;восстанавливаем ds
 
        ;вызов пользовательского прерывания
        lea     dx,     mass
        mov     cx,     len
        int     6Eh
        ;печать результатов
        call    Show_AX
        ;восстановление исходного вектора прерывания
        push    ds                      ;сохраняем ds
        lds     dx,     int6Eold
        mov     ah,     25h             ;функция установки вектора
        mov     al,     6Eh             ;номер вектора
        int     21h                     ;меняем прерывание
        pop     ds                      ;восстанавливаем ds
 
Exit:
        mov     ax,     4c00h
        int     21h
 
;на входе:
;ds:dx - адрес массива
;cx    - длина массива
;на выходе
;ax - минимальный элемент
ArrayMin        proc
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        mov     ax,     0
        ;если массив пустой - выход
        jcxz    Break
        mov     si,     dx
        mov     ax,     [si]    ;Min:=A[0]
        dec     cx
        ;если в массиве единственный элемент
        jcxz    Break
 
        add     si,     2
 
ForI:                           ;for i:=1 to N-1
        cmp     ax,     [si]    ;  if Min>A[i] then
        jle     NextI
        mov     ax,     [si]    ;    Min:=A[i]
NextI:
        add     si,     2
        loop    ForI
 
Break:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        iret
ArrayMin        endp
 
; выводит знаковое 16-разрядное число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx,     10
        xor     di,     di      ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax,     ax
        jns     @@Conv
        push    ax
        mov     dx,     '-'
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ; выводим из стека на экран
@@Show:
        pop     dx              ; dl = очередной выводимый символ
        mov     ah,     2       ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
skajida         ends
end     ahahah
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
27.09.2017, 02:12
Цитата Сообщение от adam1105 Посмотреть сообщение
я не понимаю ,как мне перейти от строчки Int 6eh к этому
чел не понимает, что такое прерывания..
когда зовётся какое-нить прерывание, DOS лезет в таблицу по адресу 0000:0000, где хранятся веткоры прерываний. Каждый вектор размером 4-байта в формате сегмент:смещение. Поэтому твой вектор INT-6Eh будет лежать в таблице по адресу 6Eh*4h=01B8h.
Code
1
2
3
4
5
6
7
8
9
10
11
12
C:\debug
-d 0:01b8
0000:01B0                          8A ED 00 F0 8A ED 00 F0           ........
0000:01C0  35 00 96 03 36 25 02 D0-BC 00 96 03 4E 07 7E D3   5...6%......N.~.
0000:01D0  F0 00 96 03 C6 0C 0C 02-0A 01 96 03 24 01 96 03   ............$...
0000:01E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:01F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0200  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
0000:0230  00 00 00 00 00 00 00 00                           ........
-
Сейчас вектор(6Eh) указывает на адрес [F000:ED8Ah].
Вектор - это ссылка на обработчик прерывания. Твой обработчик должен найти наименьшее. Значит ты должен написать обработчик (который будет искать наименьшее), и подменить адрес в таблице векторов на адрес , где находится твой обработчик в программе. Функция 35h сохраняет оригинальный вектор в таблице прерываний, а функция 25h подменяет его.

Не по теме:

лучше послушай музыку:
Marilyn Manson - All,
Peter Tagtgren(PAIN) - CRASHED (all),
Prodigy-VOODOO,
MANOWAR - Wheels Of Fire,
Emigrate - GET DOWN..

2
0 / 0 / 0
Регистрация: 01.12.2016
Сообщений: 75
27.09.2017, 19:40  [ТС]
ФедосеевПавел, спасибо,буду разбираться=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2017, 19:40
Помогаю со студенческими работами здесь

Возврат из обработчика прерывания.
Продублирую вопрос сюда, ибо в &quot;Мелких вопросах&quot; висит он неприкаянно: Как осуществить возврат из обработчика прерываний. Чип -...

наименьшее значение в массиве поменять с последним элементом в массиве
В массиве C из N элементов найти элемент, имеющий наименьшее значение и поменять его местами с последним элементом. Значение N задать при...

Выгрузка резидента из обработчика прерывания
Здравствуйте! Вопрос такой: Как в программе выгрузить из памяти резидент , в конце обработчика прерывания int 09h(в данном случае)???? ...

Прерывания в ОСи: прототип функции-обработчика
Как реализовать прерывания на C++. Какой должен быть прототип функции-обработчика. Как делать выход из обработчика. Mожет callback надо...

Выход из цикла в функции обработчика прерывания
Здравствуйте. Понадобилась программа работающая по прерыванию, а именно по приему данных через UART. Пишу в CodeVision AVR. Использую...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru