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

При нажатии на F1 очистить правую половину экрана, а при нажатии на F2 - левую половину

23.02.2010, 13:13. Показов 3488. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте)) Помогите мне, пожалуйста, с лабораторной)) Вот задание:
Перехват прерываний от клавиатуры и работа с видеопамятью
Заполнить 0-ю страницу видеопамяти произвольным текстом. При нажатии на F1 очистить правую половину экрана, а при нажатии на F2 - левую половину экрана. При повторном нажатии на кнопку содержимое соответствующей половины экрана должно восстанавливаться.
Есть код программы, на основе которой нужно делать эту. Вот код:
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
;===========================================================================
;Програма буде виконувати зафарбовування супроводжуючого тексту червоним та синім кольором при натисненні клавіш F1 та F2 відповідно та забезпечувати вихід з програми за 
 
допомогою клавіші Esc
;===========================================================================
 
 
.386
esc_key equ 01h         ;скан-код клавіші Esc
 F1_key equ 3bh;02h     ;клавіша 1
 F2_key equ 3ch;03h     ;клавіша 2
 
 RED        equ     0Ach        ;коди кольорів
 BLUE       equ     0F9h
 GREEN  equ     0E5h
 
 
 
_ST SEGMENT para    STACK 'stack' use16
    dw  32000 dup (?)
_ST         ENDS
 
 
_DATA   SEGMENT para 'DATA'     use16
 msg        db  'Press:',10,13              ;текст повідомлення
        db  'ESC - for exit.',10,13
        db  'F1 - fill by red color.',10,13
        db  'F2 - fill by blue color.',10,13,'$'
_DATA ENDS
 
 
_TEXT    SEGMENT    para 'CODE' use16
ASSUME  CS:_TEXT,DS:_DATA,SS:_ST
int9ptr dw 2 dup (?)
setint9 PROC
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; процедура "перехоплення" переривання від клавіатури і встановлення вектора ; переривань прикладного обробника 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MOV AH,35H      ;отримати вектор переривання
    MOV AL,9            ;переривання від клавіатури (9) N=9
    INT 21H             ;значення, що повертається:
                    ;es:bx - вказівник на системну процедуру
                    ;обробки переривання від клавіатури
 
    mov cs:int9ptr,bx       ; зберегти в сегменті кодів вказівник 
    mov cs:int9ptr+2,es         ; на системну процедуру
 
    mov dx,offset userint9
    push ds
    push cs         ;ds:dx - вказівник на процедуру користувача  
    pop ds          ;оброб. переривання від клавіатури
 
    MOV AH,25H      ; встановити вектор "перехоплення"
    MOV AL,9            ; переривання від клавіатури (9) N=9
    INT 21H 
    pop ds
 
    ret
 ; int9ptr  dw 2 dup (?)
 
setint9 ENDP
 
retint9 PROC
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;  процедура відновлення попереднього (системного)
;  вектора переривання від клавіатури
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push ds
    push dx
    mov dx,cs:int9ptr   ; ds:dx - вказівник на початкову (системну)
    mov ax,cs:int9ptr+2 ; процедуру обробки переривання від
    mov ds,ax           ; клавіатури
    
 
    MOV AH,25H  ; встановити вектор системної процедури
    MOV AL,9        ; обробки переривання від клавіатури
    INT 21H     ; 
 
    pop dx
    pop ds
 
    ret
retint9 ENDP
 
userint9    proc    far
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Процедура обробки переривань від клавіатури,
; викликається при будь-якому натисканні або відтисканні клавіш клавіатури,
; здійснює повернення в MS-DOS після натискання клавіші Esc
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    pushf
    call    dword ptr cs:int9ptr    ;виклик основного обработчика
                        ;преривання клавіатури
                        ;(для занесення символу в буфер)  
    pushad
                        ; читання порту клавіатури
    in  al,60h          ;введення скан-коду клавіші - розряди 0-6
    mov ah,al               ;7-ий розряд дорівнює 0 при натисканні
 
    push    ax              ;скан-код клавіші
    push    3832                ;позиція виводу
    call    show                ;виведення скан-коду на екран
    
    cmp ah,esc_key          ;якщо натиснутий Еsc
    je  short ui9020        ;вихід з програми
 
    cmp ah,F1_key           ;натиснута 1
    je  short ui_F1
 
    cmp ah,F2_key           ;натиснута 2
    je  short ui_F2
 
    jmp ui9040
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui9020:
    call    retint9         ;повернення системного вектора переривання
    mov     ax,4c00h            ;вихід з програми
    int     21h      
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui_F1:      ; виводення для контролю посередині екрану ; ASCII коду символів
    push    '01'                ; ASCII коду символів
    push    2000                ; у 16-вому коді
    call    show
    
    push    RED             ; фарбування відповідно екрану і тексту
    call    fill
    jmp short ui9040
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui_F2:                  ; виводення для контролю посередині екрану
    push    '02'                ; ASCII коду символів
    push    2160                ; букви "F" та цифри "1"
    call    show                ; у 16-вому коді
    
    push    BLUE                ; фарбування відповідно екрану і тексту
    call    fill
 
 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ui9040:
    popad
    iret                    ; закінчення обробки переривання
userint9    endp 
show    proc    near        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;процедура виводу числового значення натиснутої клавіші.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
    push    bp
    mov     bp,sp
    pusha
    push    es
    mov     ax,0b800h       ;константа віеопам'яті
    mov     es,ax
 
    std             ;запис відбудеться справа-наліво
ls20:
    mov     di,[bp+4]       ;точка виводу
    mov     bx,[bp+6]       ;те, що ми виводимо в 16-му коді
    mov     cx,4
    mov     ah,0ah      ;зелений колір символу,чорний - фону
ls40:
    mov     al,bl           ;обробка молодшого байту символу
    and     al,00001111b    ;виділили молодшу тетраду(число від 0 до 15)
    cmp     al,10           ;чи число більше за 10
    jl  ls100           ;якщо менше – просто виводимо
    add     al,7            ;якщо літера то виводимо як символ літери
ls100:
    add     al,30h      ;тому що скан-коди цифр починаються з 30h
    stosw               ;зберігаємо за адресою es:di значення ax
    shr     bx,4            ;наступна тетрада
    loop    ls40
 
    pop     es
    popa
    pop     bp
    ret     4
show  endp
 
fill    proc    near        
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;процедура зміни атрибутів кольору тексту на екрані
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push    bp
    mov     bp,sp
    pushad
    push    es
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    push    0b800h
    pop es
    
    mov     ax,[bp+4]   ;атрибути кольору
    cld             ;заповнення атрибутів йде зліва-направо
    xor di,di
 @go:   
    inc     di
    stosb               ;запис за адресою es:di значення al
    cmp     di,2000     ;доки не опрацьовано весь екран=80*25*2
    jl      @go
 
    pop     es
    popad
    pop     bp
    ret 2
fill    endp
cont db ?
 
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Процедура, що виводить на екран символьне позначення клавіш (окрім ;функціональних)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
print_text  proc    near    
 printing:  
    mov ah,10h      ;зчитування скан-коду натиснутої клавіші
    int 16h
        or  al,al           ;якщо символ функціональний, то не обробляємо
    je printing         ;його цією процедурою
    
    mov dl,al           ;якщо це літера, цифра, тощо
    mov ah,02h      ;виводимо символ
    int 21h
    jmp printing
 @exit:
    ret
print_text  endp
 
 
;- - - - - - - - - - - - - Початок роботи програми - - - - - - - - - - - - - 
begin:
    mov     ax,_data
    mov     ds,ax
 
    mov     ax,3            ;задати текстовий режим 80 на 25
    int     10h
 
    mov     ah,10h      ;відключити режим миготіння
    mov     al,3
    mov     bl,0
    int     10h
 
 
    mov ah,09h      ;вивести повідомлення msg
    mov dx,offset msg   
    int 21h
 
    cli             ; заборона переривань
    call    setint9     ;"перехоплення" int9
    sti             ;дозвіл переривань
    push    GREEN           ;початкові установки вигляду екрану
    call    fill
    call    print_text          ;запуск фонової процедури(див. нижче)
    cli
    call    retint9     ;відновлення системного вектора переривань
    sti 
    mov     ax,4c00h        ;вихід з програми
    int     21h
 
_TEXT ENDS
    end  begin
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2010, 13:13
Ответы с готовыми решениями:

Нажимая на левую кнопку мышки очистить нечетные колонки экрана, а при нажатии на правую кнопку - чётные колонки экрана
Задание: Заполнить 0-ю страницу видеопамяти произвольным текстом. Нажимая на левую кнопку мышки очистить нечетные колонки экрана, а при...

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

Объект должен двигаться при нажатии на левую/правую часть экрана как в Flappy Bird (2d)
Объект должен двигаться при нажатии на левую/правую часть экрана, как в Flappy Bird, проект будет в 2d, помогите пжста

7
0 / 0 / 0
Регистрация: 13.06.2015
Сообщений: 2
25.02.2010, 10:09
Ребята, помогите пожалуйста...
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
03.08.2014, 07:30
думаю для начала нужно сделать две процедуры наподобие процедуры fill: fill_left (для заполнения левой части) и fill_right (для правой части). они отличаются только числом, заносимым в регистр di. в принципе можно оставить и одну процедуру fill, но тогда придется работать со стеком. с двумя просто будет нагляднее. вот выкладываю немного измененный и переделанный код..

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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
.386
 esc_key equ 01h         
 F1_key  equ 3Bh 
 F2_key  equ 3Ch
 
 red     equ 0C9h       
 blue    equ 09Ah
 green   equ 02Fh
 
 
 
_st segment para stack 'stack' use16
         dw  32000 dup (?)
_st ends
 
 
_data segment para 'data' use16
 msg    db  'Press:',10,13            
        db  'ESC - for exit.',10,13
        db  'F1 - fill by red color.',10,13
        db  'F2 - fill by blue color.',10,13,'$'
_data ends
 
 
_text segment para 'code' use16
assume  cs:_text,ds:_data,ss:_st
 
int9ptr dw 2 dup (?)
 
setint9 proc
    mov ah,35h      
    mov al,09h           
    int 21h                         
 
    mov cs:int9ptr,bx       
    mov cs:int9ptr+2,es        
 
    mov dx,offset userint9
    
    push ds
    push cs         
    pop ds         
 
    mov ah,25h     
    mov al,09h        
    int 21h 
    
    pop ds
 
    ret
setint9 endp
 
retint9 PROC
    push ds
    push dx
    
    mov dx,cs:int9ptr   
    mov ax,cs:int9ptr+2
    mov ds,ax
    
    mov ah,25h 
    mov al,09h        
    int 21h    
    
    pop dx
    pop ds
 
    ret
retint9 ENDP
 
userint9 proc far
    pushf
    call dword ptr cs:int9ptr    
    
    pushad
                        
    in al,60h          
    mov ah,al        
    
    push ax        
    push 3832               
    call show         
    
    cmp ah,esc_key     
    je short ui9020
 
    cmp ah,F1_key           
    je short ui_F1
 
    cmp ah,F2_key          
    je short ui_F2
 
    jmp ui9040
 
ui9020:
    call retint9     
    mov ah,4Ch
    mov al,00h         
    int 21h      
 
ui_F1:      
    push red         
    call fill_left
 
    push '01'                
    push 2002       
    call show
    
    jmp short ui9040
 
ui_F2:
    push blue
    call fill_right
             
    push '02'                
    push 2162                
    call show            
 
    ui9040:
    popad
    iret               
userint9 endp
 
show proc near        
 
    push bp
    mov bp,sp
    
    pusha
    
    push es
    mov ax,0B800h     
    mov es,ax
 
    std            
    
    ls20:
    mov di,[bp+4]
    mov bx,[bp+6]    
    mov cx,4
    mov ah,0Ah 
    
    ls40:
    mov al,bl       
    and al,00001111b   
    cmp al,10         
    jl ls100        
    add al,7
    
    ls100:
    add al,30h     
    stosw             
    shr bx,4       
    loop ls40
 
    pop es
    
    popa
    
    pop bp
    ret 4
    
show  endp
 
fill_left proc near        
    push bp
    mov bp,sp
    pushad
    push es
    
    push 0B800h
    pop es
    
    mov ax,[bp+4]
    cld
    xor di,di
    
    push cx
    mov cx,25
    @go1:
        push cx
        mov cx,40
        color1:
        inc di
        stosb
        loop color1
        add di,80
        pop cx
    loop @go1
    pop cx
 
    pop es
    popad
    pop bp
    ret 2
fill_left endp
 
fill_right proc near        
    push bp
    mov bp,sp
    pushad
    push es
 
    push 0B800h
    pop es
    
    mov ax,[bp+4]
    cld
    mov di,80
    
    push cx
    mov cx,25
    @go2:
        push cx
        mov cx,40
        color2:
        inc di
        stosb
        loop color2
        add di,80
        pop cx
    loop @go2
    pop cx
 
    pop es
    popad
    pop bp
    ret 2
fill_right endp
 
cont db ?
 
print_text proc near    
 printing:  
    mov ah,10h
    int 16h
    
    or al,al
    je printing
    
    mov dl,al
    mov ah,02h
    int 21h
    jmp printing
 
    @exit:
    ret
print_text endp
 
begin:
    mov ax,_data
    mov ds,ax
 
    mov ah,00h
    mov al,03h
    int 10h
 
    mov ah,10h 
    mov al,03h
    mov bl,00h
    int 10h
 
    mov ah,09h
    mov dx,offset msg   
    int 21h
    
    cli            
    call setint9     
    sti  
    
    push green           
    call fill_left
    
    push green
    call fill_right
    
    call print_text 
    
    cli
    call retint9    
    sti 
    
    mov ax,4Ch
    mov al,00h      
    int 21h
 
_text ends
    end  begin
Добавлено через 8 минут
для того чтобы при повторном нажатии на кнопку содержимое соответствующей половины экрана восстанавливалось можно попробовать объявить две переменные (chk_left и chk_right к примеру), которые будут принимать значения 0 или 1 попеременно в зависимости от нажатой клавиши F1 или F2 соответственно. и в зависимости от этого будут также попеременно заполняться части. но это пока наброски без внедрения кода.. так что не могу гарантировать, что продвижение в этом направлении будет правильным..
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.08.2014, 11:36
proc3nt, всё - вздор. Int 9 перехватывать не надо(достаточно Int 16/AH=00h), сохранить содержимое стр. 0 можно в стр. 1, а для заливки цветом подойдёт int 10/ah=06.
0
Прощай, Мир!
 Аватар для proc3nt
1673 / 831 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
03.08.2014, 16:45
не спорю. но просто [ТС] дал код программы, на основе которой нужно делать эту. на это я и ориентировался. да и условие об этом же говорит (на <title> данной вкладки).
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.08.2014, 17:08
Цитата Сообщение от proc3nt Посмотреть сообщение
да и условие об этом же говорит
Дык, для перехвата клавы пользуется Int 15/AH=4Fh, вот примерчик. И никто не мешает полностью копировать видеостр.1 в стр. 0, а потом затирать нужную половину экрана по Int 10/AH=06h. Ближе к полуночи напишу - сейчас самое пекло,+30.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
03.08.2014, 18:37
Можно символы не копировать и затирать, а изменять атрибуты символов на черный/белый.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.08.2014, 19:37
Цитата Сообщение от AFP Посмотреть сообщение
а изменять атрибуты символов
А если там многоцветная произвольная картинка, что тогда? Атрибуты всё равно придётся где-то хранить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2014, 19:37
Помогаю со студенческими работами здесь

Отобразить левую половину матрицы на правую
Подскажите, как отобразить левую половину второй матрицы на правую зеркально симметрично относительно вертикальной оси. #include...

Отобразить левую половину матрицы на правую
Делать через указатели. В главной функции динамично выделить память под указанную пользователем размерность и заполнить матрицу случайными...

Отобразить правую половину матрицы на левую
Суть условия задачи: Размерность матрицы вводится с клавиатуры. Заполнить матрицу случайными числами. Отобразить правую половину матрицы...

Отобразить левую половину матрицы на правую зеркально
Заполните матрицу случайными числами. Отобразить левую половину матрицы нп правую зеркально симметрично относительно вертикальной оси.

Поменяв местами левую и правую половину списка
Как будет примерно выглядеть это задание на лиспе? Дан список L. Если длина списка нечетна, построить список L1, поменяв местами левую и...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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 10.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