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

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

18.01.2019, 10:06. Просмотров 272. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2019, 10:06
Ответы с готовыми решениями:

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

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

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

Почему не компилируется программа?
.model tiny .code org 100h ; СОМ-программа start: lea dx,msg mov ah,9 int 21h ...

почему вылет программа masm 32
форма создана при помощи Masm Bulder 3.4 равботает нормально добавил процедуру нахождения суммы...

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

Добавлено через 1 минуту
а как его реализовать?
0
Kukuxumushu
1595 / 591 / 107
Регистрация: 13.06.2015
Сообщений: 2,017
Завершенные тесты: 2
20.01.2019, 13:20 4
dableproger,
Assembler
1
2
mov al,20h
out 20h,al
это перед iret быть должно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2019, 13:20

почему программа ругается на exit ????
stacksg segment stack dw 32 dup(?) stacksg ends datasg segment Path db 'tmp.txt', 0...

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

Почему программа не имеет доступ к файлам?
файл kyrsova.asm .model small .stack 100h .data .code start: mov ax,@data


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

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

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