Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
kirillnjar
0 / 0 / 1
Регистрация: 03.11.2017
Сообщений: 6
1

Обработка прерываний при выполнении инструкции BOUND

17.03.2019, 21:38. Просмотров 874. Ответов 2
Метки нет (Все метки)

Доброго времени суток.

Задача:
Задан массив и границы некоторой области памяти. Необхо-
димо преобразовать массив следующим образом: просматривается по
очереди каждый элемент массива, и если он лежит внутри заданных
границ, то на его место записывается число "1", иначе - "0".
Элементы массива - слова. Для проверки используется команда
BOUND.

Наработки:
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
.386
sseg    segment stack 'stack' use16
        dw 256 dup(?)
sseg    ends
 
data    segment use16
BoundMas        label   word
        StartI  dw  1                       ;Индекс начала
        EndI    dw  4                       ;Индекс конца
Mas     dw      11 dup(0)                   ;Массив
OldInt05h       dd      ?
data    ends
 
code    segment use16
        assume  cs:code,ds:data,ss:sseg
        
        ;новый обработчик прерывания int 05h для обработки команды bound
NewInt05h       proc        
        mov     dword ptr [si], '0'         ;Устанавливаем 0
        ;для остановки генерации прерывания
        ;регистр приводится к требуемым границам
        mov     bx,     [StartI]
        
        ;завершаем цепочку обработчиков прерывания:
        iret
NewInt05h       endp
start:         
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     data
        mov     ds,     ax
        
        ;перехват Int 05h
        mov     ax,     3505h
        int     21h
        mov     word ptr [OldInt05h+0], bx
        mov     word ptr [OldInt05h+4], es
        push    ds
        mov     ax,     cs
        mov     ds,     ax
        mov     ax,     2505h
        mov     dx,     offset cs:NewInt05h
        int     21h
        pop     ds
        
         ;обработка массива
        lea     si,     [Mas]       ;Загружаем массив
        mov     cx,     10          ;Устанавливаем размер массива
        xor     ebx,    ebx         ;Обнуляем ebx
        cld                         ;Устанавливаем направление
Repeated:
        inc     bl                          ;Увеличиваем счетчик
        push    bx                          ;сохраняем bx т.к. на прерывании он может инзмениться
        mov     dword ptr [si], '1'         ;Устанавливаем 1
        bound   bx, dword ptr [BoundMas]    ;Проверяем находится ли в пределах (если нет переход на newInt05h)
        pop     bx
        add     si,     4                   ;Следующий элемент
        loop    Repeated        
        
                ;восстановление Int 05h
        push    ds
        mov     ax,     2505h
        lds     dx,     [OldInt05h]
        int     21h
        pop     ds
        
;завершение программы
        lea     dx,     Mas ; вывести сообщение        
        push ax             ; сохранить AX
        mov ah,09h          ; вывести сообщение с
        int 21h             ; помощью функции DOS
        pop ax              ; восстановить AX
        mov     ax,     4C00h
        int     21h
        
code ends
end start
Проблема:
До определенного момента все работает как нужно.
Когда в cx остается 3 программа идет на start. После этого она вообще игнорирует обработчик и после исключения опять переходит на start.
Помогите пожалуйста.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2019, 21:38
Ответы с готовыми решениями:

Обработка прерываний мыши
Добрый день. Задан курсовик-игра с щёлканьем мыши по появляющимся в рандомном месте квадратам....

Обработка программных прерываний...
Всем привет! выполняем лабораторные работы на MASMe, преподаватель дал задание, уже второй день не...

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

Masm Обработка стандартных прерываний
Со сдачей затянул,сейчас надо срочно сдать. С ассемблером почти не знаком (полный нуб), изучать...

Обработка прерываний: замена клавиш на цифры
Здравствуйте. Хочу я, значит, в резидентной программе по обработке прерывания от клавиатуры, что бы...

2
ФедосеевПавел
Модератор
4252 / 2341 / 940
Регистрация: 01.02.2015
Сообщений: 7,735
17.03.2019, 22:58 2
Лучший ответ Сообщение было отмечено kirillnjar как решение

Решение

строка 56 - через несколько шагов вы покидаете пределы массива Mas и '0' и '1' начинаете затирать память после массива - как повезёт с компоновщиком - вероятно, новый обработчик прерывания.
1
kirillnjar
0 / 0 / 1
Регистрация: 03.11.2017
Сообщений: 6
19.03.2019, 13:40  [ТС] 3
Спасибо за помощь. Забыл что для dw смещение на следующий элемент +2.
Итоговый вариант получился следующим.

Кликните здесь для просмотра всего текста

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
.386
sseg    segment stack 'stack' use16
        dw 256 dup(?)
sseg    ends
 
data    segment use16
BoundMas        label   word
        StartI  dw  5                       ;Индекс начала
        EndI    dw  7                       ;Индекс конца
Mas     dw      11 dup(0)                   ;Массив
OldInt05h       dd      ?
data    ends
 
code    segment use16
        assume  cs:code,ds:data,ss:sseg
        
        ;новый обработчик прерывания int 05h для обработки команды bound
NewInt05h       proc        
        mov     dword ptr [si], '0'         ;Устанавливаем 0
        ;для остановки генерации прерывания
        ;регистр приводится к требуемым границам
        mov     bx,     [StartI]
        
        ;завершаем цепочку обработчиков прерывания:
        iret
NewInt05h       endp
start:         
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     data
        mov     ds,     ax
        
        ;перехват Int 05h
        mov     ax,     3505h
        int     21h
        mov     word ptr [OldInt05h+0], bx
        mov     word ptr [OldInt05h+4], es
        push    ds
        mov     ax,     cs
        mov     ds,     ax
        mov     ax,     2505h
        mov     dx,     offset cs:NewInt05h
        int     21h
        pop     ds
        
         ;обработка массива
        lea     si,     [Mas]       ;Загружаем массив
        mov     cx,    11          ;Устанавливаем размер массива
        xor     ebx,    ebx         ;Обнуляем ebx
        cld                         ;Устанавливаем направление
Repeated:
        inc     bl                          ;Увеличиваем счетчик
        push    bx                          ;сохраняем bx т.к. на прерывании он может инзмениться
        mov     dword ptr [si], '1'         ;Устанавливаем 1
        bound   bx, dword ptr [BoundMas]    ;Проверяем находится ли в пределах (если нет переход на newInt05h)
        pop     bx
        
        ;Вывод полученного числа
        mov     eax, dword ptr [si]
        mov     ah,2h     ; вывести младшую цифру
        mov     dl,al     ;  результата с помощью
        int     21h       ;  функции DOS   
        
        add     si,     2                   ;Следующий элемент    
        loop    Repeated        
        
        ;восстановление Int 05h
        push    ds
        mov     ax,     2505h
        lds     dx,     [OldInt05h]
        int     21h
        pop     ds
        
;завершение программы
        mov     ax,     4C00h
        int     21h
        
code ends
end start
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2019, 13:40

Обработка исключений/прерываний в compatibility mode
Привет! Делаю обработку исключений для compatibility mode. Заметил странную вещь - если в...

Перевод процессора в защищённый режим и обработка прерываний от таймера
Всем доброго времени суток. Дали лабу: Перевести процессор в защищённый режим и обработать...

Ошибка при выполнении инструкции Merge
Есть две таблицы, А и Б Обе должны содержать данные по адресным объектам, а именно - домам. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru