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

Почему программа некорректно завершается?

18.01.2019, 10:06. Показов 1036. Ответов 3

Студворк — интернет-сервис помощи студентам
Задачей было написать резидентную программу для DOS, которая проигрывает ноты из массива (1сек на каждую ноту)
Программа запускается, в фоне проигрываются ноты. но как только ноты заканчиваются, DOS перестает на что либо реагировать

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
.model tiny
.code
org 100h 
.386
start:jmp load
ppresenceflag dw 1260h
old dd 0
outSound dw ?
la dw 2711
;массив частот соответсвующих нотам
notes dw 1B8h, 1BEh, 1EDh, 20BH, 22AH,24BH, 26EH, 293H,2BAH, 2E3H,310H,33EH,370H
counter db 18
i dw 0
isItFirst db 1
 
;процедура, проигрывающая звук  
bip proc 
    pusha
    mov al,0b6H;управляющтй бит
    out 43H,al
    mov ax,outSound;частота
    out 42H,al;младшая
    mov al,ah
    out 42H,al;старшая
    in al,61H
    mov ah,al
    or al,3
    out 61H,al
popa
ret
bip endp
 
;процедура задержки 
void proc 
pusha
    and al,11111100b
    out 61h,al
    mov cx,04h
    mov dx,93e0h
    mov ah,86h
    int 15h 
    popa
ret
void endp
handler:
 
 
 
handler proc
pushf                               ; создание в стеке структуры для IRET
    call    cs:old                   ; вызов старого обработчика прерываний
    push    ds                       ; сохранение модифицируемых регистров
    push    es
    push    ax
    push    bx
    push    cx
    push    dx
    push    di
    push    cs
    pop     ds
    
    ;для отсчета минтуы используется счетчик counter
    ;тк прерывание срабатывает 18 раз в секнуду
    ;смена звучащей ноты изменяется только тогда когда 
    ;counter становится равным 0
    dec counter
    cmp counter,0
    jne met1
    ;воспроизведениие ноты
    ;и смена ноты на следующуюю
    mov bx,i
    mov ax,notes[bx]
    mov outSound, ax
    call bip
    add i,2
    mov counter,18
    cmp i, 24 
    jle met1
    add i,2
    call void
    ;выход из обработчика прерывания
    met1:
    pop     di   
    pop     dx
    pop     cx
    pop     bx
    pop     ax
    pop     es
    pop     ds
    
iret   
handler endp
end_handler:
 
;не резидентная часть программы
 
;получаем адрес обработчика прерывания
load:mov ax, 351Ch
int 21h
 
cmp bx,ppresenceflag; флаг присутствия, если программа
; уже есть в памяти повтораная запись не будет производиться
jne exit
;сохранение контекста старого обработчика прерывания
mov word ptr old, bx
mov word ptr old+2,es
mov ax,251Ch
mov dx,offset handler; получаем адрес метки handler
int 21h
mov ax,3100h
mov dx,(end_handler-start+10Fh)/16; получение размера 
;обработчика прерывания в параграфах
int 21h
;выход из программы с сохранением нового обработчика прерывания
 
exit:
mov ax,3100h
int 21h
 
ret
end start
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.01.2019, 10:06
Ответы с готовыми решениями:

Некорректно работает программа
Добрый вечер ! мне нужно найти произведение всех нечетных элементов массива , но почему то программа с произведением не работает (в...

При нажатии кнопки мыши - на экране, в том месте установить символ "l"
Здравствуйте господа! У меня проблема с программой, очень нужна помощь . Программа должна работать следующим образом: при нажатии на...

Найти значение функции. Программа завершается некорректно
Помогите пожалуйста, ошибок компилятор не выдаёт, но винда аварийно завершает работу программы...что не так?:gsad: Вычислить значение...

3
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
18.01.2019, 21:33
dableproger, а где у вас сброс контроллера прерываний?
3
0 / 0 / 0
Регистрация: 18.01.2019
Сообщений: 2
20.01.2019, 09:03  [ТС]
А как его реализовать?

Добавлено через 1 минуту
а как его реализовать?
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
20.01.2019, 13:20
dableproger,
Assembler
1
2
mov al,20h
out 20h,al
это перед iret быть должно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2019, 13:20
Помогаю со студенческими работами здесь

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

Рекурсия, почему программа завершается аварийно?
Подскажите, почему не работает рекурсия?? #include <iostream> using namespace std; void fn(int value) { fn(value); } int...

Прерывание SIGINT. Почему не завершается программа?
Здравствуйте. Решал такую задачу: 12. Написать программу, предоставляющую информацию обо всех активных процессах в системе. Передать эту...

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

Не могу понять почему программа работает некорректно (односвязные списки)
Построить однонаправленный список чисел. Затем исключить из него все повторы чисел, оставить каждое число в списке в единственном...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 11.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru