Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 6

Прерывание MS-DOS

04.05.2013, 05:57. Показов 2112. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться. В учебнике Калашникова в пятом уроке вот такая программа для практики:
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
CSEG segment
org 100h
 
Start:
 
mov ax,0B800h
mov es,ax
 
mov al,1
mov ah,31
 
mov cx,254
next_screen:
    mov di,0
    call out_chars
    inc al
loop next_screen
 
mov ah,10h
int 16h
 
int 20h
 
out_chars proc
    mov dx,cx
    mov cx,2000
    next_face:
        mov es:[di],ax
        add di,2
    loop next_face
    mov cx,dx
    ret
out_chars endp
 
CSEG ends
end Start
Заканчиваться она должна, по идее, после того как пользователь нажмёт клавишу и сработает прерывание int 20h. Однако я печатал сам и забыл это прерывание написать. Но разницы в работе программы никакой. После нажатия клавиши программа всё равно закрывалась. Почему так? Если int 20h нет, то что даёт команду программе закрыться?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2013, 05:57
Ответы с готовыми решениями:

Организовать аппаратное прерывание DOS
Вопрос заключается в следующем: как организовать аппаратное прерывание? Конкретно нужно вот что: на любом этапе работы программы при...

Прерывание на получение времени в MS DOS
Подскажите, нашел только для поулчение даты

Очистка экрана через DOS, используя 21 прерывание
можно ли как-нибудь очистить экран через 21 прерывание?? мне в голову кроме прокрутки экрана вниз ничего не приходит. PS: заранее не...

6
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
04.05.2013, 06:25
Если "забыть" в данном случае int 20h, то после
Цитата Сообщение от BarannikovMaxim Посмотреть сообщение
mov ah,10h
int 16h
управление перейдёт на подпрограмму out_chars, которая завершаясь инструкцией ret передаст управление на адрес CS:0000h, а там находится инструкция int 20h. Структура PSP.
1
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 6
04.05.2013, 06:30  [ТС]
Argogo, хм. Интересно. Теперь буду знать. Спасибо за объяснение :3
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
04.05.2013, 11:26
*.com проги можно завершать и обычным ret'ом. поэтому в данном случае все нормально, как и писал Argogo.
более тонкое дело когда эта прога запускается под вынью. пусть будет такой код:
Assembler
1
2
3
4
5
6
7
8
9
CSEG segment
org 100h
Start:
xor ax, ax
int 16h
;int 20h
;ret
end start
CSeg ends
под досей Вы бы зависли, а вот под виндой в консоли вы бы просто завершились, или вылезла ошибка, что ntvdm обнаружил неверную инструкцию. дело в слудующем: в оперативной памяти находится код других прог, данные, и прочий мусор. под досей не завершив прогу проц будет выполнять то, что находилось в оперативе за вашей прогой. пример:
Assembler
1
2
3
4
5
6
7
8
9
xor ax, ax
int 16h
;int 20h
;ret
out dx, al
xor al, bl
mov al, [si+bx+4]
stosb
;и так далее
тут видно, что прога не завершится, а продолжит выполение с 5 строки и, скорее всего, зависнет. это под досей. под вынью иначе. там все досовые проги запускаются в эмулируем дос пространстве и обычно вся память забита кодом 0000h, что в переводе на асм означает
Assembler
1
add [bx+si], al
в большинстве случаев вынь закрывает такую прогу самостоятельно.
2
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 6
04.05.2013, 14:41  [ТС]
Только я в одном моменте не разобрался. Искал про это в учебнике, чтобы понять, но там, кажется, про это просто не объяснено, или будет объяснено позже. Вот, например, если не ввести прерывание int 20h, то управление перейдёт на подпрограмму out_chars. Как это произойдёт? Будут выполняться все инструкции после out_chars proc до инструкции перед out_chars endp? Скорее всего так, но хочу убедиться, ибо конкретно про этот момент не нашёл.
0
 Аватар для Troll_Face
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
04.05.2013, 15:02
процедура - это ни что-то сверхъестественное. это тот же самы код, только для удобства во время разработки он оформляется в виде процедуры. все, что между метками name proc .... name endp будет размещено так, как оно построено в исходнике, только там директив proc\endp не будет. пример ваша прога. вы ее под отладчиком видели?
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
mov ax,0B800h
mov es,ax
 
mov al,1
mov ah,31
 
mov cx,254
next_screen:
    mov di,0
    call out_chars
    inc al
loop next_screen
 
mov ah,10h
int 16h
 
int 20h
mov dx,cx
mov cx,2000
next_face:
mov es:[di],ax
add di,2
loop next_face
mov cx,dx
ret
только заместо меток будут числа.
еще пример:
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
mov di, offset array
    mov cx, ARR_SIZE
    mov ax, 0FFFFh
    call InputArray
    mov al, 13
    int 29h
    mov al, 10
    int 29h
    
    mov si, di
    mov ax, 0FFFFh
    call OutArray
    mov ax, 4c00h
    int 21h
    
InputArray proc
    push ax
    push di
    push cx
    
    or ah, ah
    jne @@2
@@1:
    call InputInt
    stosb
    loop @@1
    jmp short @@3
@@2:
    call InputInt
    stosw
    loop @@2
@@3:    
    pop cx
    pop di
    pop ax
    ret
InputArray endp
 
OutArray proc
    push si
    push ax
    push cx
    
    or ah, ah
    jne @@2
@@1:
    lodsb
    call OutInt
    mov al, ' '
    int 29h
    loop @@1
    jmp short @@3
@@2:
    lodsw
    call OutInt
    mov al, ' '
    int 29h
    loop @@2
@@3:    
    pop cx
    pop ax
    pop si
    ret
OutArray endp
    
InputInt proc 
    push dx
    push bx
    push cx
    push si
    push di
    push ds
    push cs
    pop ds
    mov ah,0ah
    xor di,di
    mov dx, offset buff 
    int 21h
    mov dl,0ah
    mov ah,02
    int 21h 
    mov si,offset buff+2 
    cmp byte ptr [si],"-"
    jnz ii1
    mov di,1  
    inc si    
ii1:
    xor ax,ax
    mov bx,10  
ii2:
    mov cl,[si] 
    cmp cl,0dh  
    jz enddecin
    
    cmp cl,'0'  
    jl er
    cmp cl,'9'  
    ja er
 
    sub cl,'0'
    mul bx   
    add ax,cx
    inc si    
    jmp ii2  
er:  
    mov dx, offset error
    mov ah,09
    int 21h
    int 20h
 
enddecin:
    cmp di,1 
    jnz ii3
    neg ax   
ii3:
    pop ds
    pop di
    pop si
    pop cx
    pop bx
    pop dx
    ret
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
 
OutInt proc
    push ax
    push dx
    push bx
    push cx
    push di
    test ax, ax
    jns oi1
    mov di, 1
    neg ax
oi1:
    xor cx, cx
    mov bx, 10
oi2:
    xor dx, dx
    div bx
    add dx, '0'
    push dx
    inc cx
    test ax, ax
    jne oi2
    
    mov ah, 2
    cmp di, 1
    jne oi3
    mov dl, '-'
    int 21h
oi3:
    pop dx
    int 21h
    loop oi3
    pop di
    pop cx
    pop bx
    pop dx
    pop ax
    ret
OutInt endp
а вот так она будет в памяти:
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
mov di, offset array
    mov cx, ARR_SIZE
    mov ax, 0FFFFh
    call InputArray
    mov al, 13
    int 29h
    mov al, 10
    int 29h
    
    mov si, di
    mov ax, 0FFFFh
    call OutArray
    mov ax, 4c00h
    int 21h
    push ax
    push di
    push cx
    
    or ah, ah
    jne @@2
@@1:
    call InputInt
    stosb
    loop @@1
    jmp short @@3
@@2:
    call InputInt
    stosw
    loop @@2
@@3:    
    pop cx
    pop di
    pop ax
    ret
    push si
    push ax
    push cx
    
    or ah, ah
    jne @@2
@@1:
    lodsb
    call OutInt
    mov al, ' '
    int 29h
    loop @@1
    jmp short @@3
@@2:
    lodsw
    call OutInt
    mov al, ' '
    int 29h
    loop @@2
@@3:    
    pop cx
    pop ax
    pop si
    ret
    push dx
    push bx
    push cx
    push si
    push di
    push ds
    push cs
    pop ds
    mov ah,0ah
    xor di,di
    mov dx, offset buff 
    int 21h
    mov dl,0ah
    mov ah,02
    int 21h 
    mov si,offset buff+2 
    cmp byte ptr [si],"-"
    jnz ii1
    mov di,1  
    inc si    
ii1:
    xor ax,ax
    mov bx,10  
ii2:
    mov cl,[si] 
    cmp cl,0dh  
    jz enddecin
    
    cmp cl,'0'  
    jl er
    cmp cl,'9'  
    ja er
 
    sub cl,'0'
    mul bx   
    add ax,cx
    inc si    
    jmp ii2  
er:  
    mov dx, offset error
    mov ah,09
    int 21h
    int 20h
 
enddecin:
    cmp di,1 
    jnz ii3
    neg ax   
ii3:
    pop ds
    pop di
    pop si
    pop cx
    pop bx
    pop dx
    ret
 db "incorrect number$"      ;только будет не строка, а последовательность символов
 db 6, 0, 0, 0, 0, 0, 0, 0
    push ax
    push dx
    push bx
    push cx
    push di
    test ax, ax
    jns oi1
    mov di, 1
    neg ax
oi1:
    xor cx, cx
    mov bx, 10
oi2:
    xor dx, dx
    div bx
    add dx, '0'
    push dx
    inc cx
    test ax, ax
    jne oi2
    
    mov ah, 2
    cmp di, 1
    jne oi3
    mov dl, '-'
    int 21h
oi3:
    pop dx
    int 21h
    loop oi3
    pop di
    pop cx
    pop bx
    pop dx
    pop ax
ret
только в место понятных меток будут смещения. так вот если, к примеру, в 14 строке убрать int 21h, то будет сразу же работать процедура InputArray. если в какой-либо процедуре убрать ret (например, 58 строка, где заканчивается процедура OutArray) сразу же будет работать процедура InputInt.
1
0 / 0 / 0
Регистрация: 03.05.2013
Сообщений: 6
04.05.2013, 15:09  [ТС]
Troll_Face, под отладчиком видел. В общем-то, я так и предполагал, но не мог не убедиться (лучше уж точно знать, чем программировать на предположениях). Спасибо за разъяснение :3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.05.2013, 15:09
Помогаю со студенческими работами здесь

Как в ms-dos настроить прерывание аппаратное по lpt порту?
Почему может прерывание не работать не подскажете .MODEL tiny .386 .DATA oldSeg dw 0 oldOfs dw 0 base = 0378h .CODE...

Как в DOS-BOX написать BAT-файл чтобы ЛЕГКО запустить DOS-программу ?
ВСЕМ ДОБРОГО ВРЕМЕНИ ! Надо на Windows_7 СРОЧНО запустить старую программу, написанную еще под DOS c базами данных DBASE ... Для этого...

Написать программу, выводящую на экран номер версии DOS, а также системную дату и время на языке MS-DOS
написать программу,выводящую на экран номер версии DOS,а также системную дату и время на языке MS-DOS

Когда DOS был жив, можно ли было переделать windows98 и > драйвера звуковой карты под DOS?
Если я правильно понимаю там прямая запись в порты(если на самом низком уровне) это ведь можно повторить на любой ОС?

WmWare и DOS, как скопировать в DOS файлы
есть MS_DOS в wmWare как скопировать туда асcемблерные файлы с основного компа?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru