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

Вводимый с клавиатуры символ появляется одновременно во всех четырех углах экрана

12.12.2016, 17:41. Показов 2084. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа очищает экран. Вводимый с клавиатуры символ появляется одновременно во всех четырех углах экрана и с разумной скоростью слетается по диагоналям в центр экрана, где и застывает. При следующем нажатии любой из символьных клавиш все повторяется. Выход из программы по нажатию клавиши F10.

Все получается с одним символом.
Как сделать так чтобы появлялись 4 символа по углам?
Координаты перемещения знаю как настроить.
Курсор получается в левом верхнем углу. Как его одновременно отобразить в четырех углах?
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
code segment                    
assume cs:code, ds:code         
org 100h         
               
start:                                                                     
jmp begin
 
x db 0 
y db 0  
v db 79 
z db 24                      ;координата курсора по Х, исходный столбец 0
simb db 0
 
begin:
 
; прячем курсор
 mov ah, 1
 mov ch, 20
 mov cl, 0
 int 10h
 
; чистим экран красным цветом, символ будет черным
mov cx, 0
mov dx, 184fh
mov bh, 40h
mov ax, 600h
int 10h
 
m1:
 
; ждем нажатия клавиши
mov ah, 0
int 16h
 
; отсекаем функциональные клавиши
cmp al, 0
je m1
 
; проверяем на ESC
cmp al, 1bh
je exit
 
; сохраняем принятый символ
mov simb, al
 
; выводим пробел в центр экрана (стираем старый символ)
mov ah, 2
mov dx, 0c28h
mov bh, 0
int 10h
 
mov ah, 0eh
mov al, ' '
int 10h
 
m2:
 
; устанавливаем курсор для вывода символа лв
mov ah, 2
mov bh, 0
mov dh, y              
mov dl, x                
int 10h
 
; выводим символ в текущую позицию курсора
mov ah, 9
mov cx, 1
mov bl, 40h
mov bh, 0
mov al, simb
int 10h
 
; задержка
mov ah, 0
int 1ah
mov bx, dx
add bx, 2
 
 
 
 
m3:
mov ah, 0
int 1ah
cmp dx, bx
jb m3
 
; увеличиваем Х координату курсора на единицу
inc x
inc x
inc x
inc y
 
; проверка на выход за центр экрана (40-й столбец)
cmp x, 41
cmp y, 13
 
 
jne m4
mov x, 0
mov y, 0             ; восстанавливаем исходное значение Х координаты курсора
jmp m1               ; пошли на ожидание нажатия клавиши  
 
 
m4:
; стираем символ в текущей позиции (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
jmp m2               ; пошли на вывод символа в следующей позиции
 
 
exit:
mov ah, 4ch
int 21h
code ends
end start
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2016, 17:41
Ответы с готовыми решениями:

Найти вводимый символ с клавиатуры
Всем Добрый вечер! Не могу никак понять где находится вводимое число с клавиатуры. Тип консольный. Листинг с примером ввода цифры...

Как отобразить вводимый символ с клавиатуры
Доброго времени суток ! Такой вопрос : - Вводим символ с клавиатуры, нужно получить его код в разных системах счисления (2,8,16) ...

Вводимый символ с клавиатуры и перемещение его с использованием цифр
Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
12.12.2016, 19:21
В принципе, т.к. положения курсоров взаимосвязаны, то достаточно координат одного символа, остальные будут вычисляться по несложным формулам.
x, y - из левого верхнего угла
x, 24-y - из левого нижнего
79-x,y - из правого верхнего
79-x, 24-y - из правого нижнего

Добавлено через 1 час 7 минут
А вы изучали прямой доступ к видеопамяти - т.к. не получается записать символ в правый нижний угол экрана без перевода строки.

Чуть позже заметил, что вы стирали символ пробелом через функцию телетайпа (со сдвигом курсора). Если захотите, переделаете на прерывания BIOS без сдвига.
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
code segment
assume cs:code, ds:code
org 100h
 
start:
        jmp     begin
 
        x       db 0
        y       db 0
        v       db 79
        z       db 24        ;координата курсора по Х, исходный столбец 0
        symb    db 0
 
begin:
 
        ; прячем курсор
        mov     ah,     1
        mov     ch,     20
        mov     cl,     0
        int     10h
 
        ; чистим экран красным цветом, символ будет черным
        mov     cx,     0
        mov     dx,     184fh
        mov     bh,     40h
        mov     ax,     600h
        int     10h
 
m1:
        ; восстанавливаем исходное значение Х координаты курсора
        mov     x,      0
        mov     y,      0
        ; ждем нажатия клавиши
        mov     ah,     0
        int     16h
 
        ; отсекаем функциональные клавиши
        cmp     al,     0
        je      m1
 
        ; проверяем на ESC
        cmp     al,     1bh
        je      exit
 
        ; сохраняем принятый символ
        mov     symb,   al
 
; выводим пробел в центр экрана (стираем старый символ)
        mov     ah,     2
        mov     dx,     0c28h
        mov     bh,     0
        int     10h
 
        mov     ah,     0eh
        mov     al,     ' '
        int     10h
 
m2:
        mov     al,     symb
        call    Show4Symbols
 
        ; задержка
        mov     ah,     0
        int     1ah
        mov     bx,     dx
        add     bx,     2
 
m3:
        mov     ah,     0
        int     1ah
        cmp     dx,     bx
        jb      m3
 
        ; увеличиваем Х координату курсора на единицу
        inc     x
        inc     x
        inc     x
        inc     y
 
; проверка на выход за центр экрана (40-й столбец)
        cmp     x,      41
        ja      @@Final
        cmp     y,      13
        ja      @@Final
 
; стираем символ в текущей позиции (пробелом)
        mov     al,     ' '
        call    Show4Symbols
        jmp     m2      ; пошли на вывод символа в следующей позиции
 
@@Final:
        jmp     m1      ; пошли на ожидание нажатия клавиши
 
exit:
        mov ah, 4ch
        int 21h
;---------------------------------------------------
ShowSymb        proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
        push    es
        ; устанавливаем курсор для вывода символа
        push    ax
        mov     ax,     0b800h
        mov     es,     ax
        mov     al,     80*2
        mul     dh
        mov     dh,     0
        shl     dx,     1
        add     ax,     dx
        mov     di,     ax
        pop     ax
        ; выводим символ в текущую позицию курсора
        mov     es:[di],al
 
        pop     es
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowSymb        endp
;------------------------------------------------------
Show4Symbols    proc
        ; устанавливаем курсор для вывода символа лв
        mov     dh,     y
        mov     dl,     x
        call    ShowSymb
        ; устанавливаем курсор для вывода символа пн
        mov     dh,     24
        sub     dh,     y
        mov     dl,     79
        sub     dl,     x
        call    ShowSymb
        ; устанавливаем курсор для вывода символа лн
        mov     dh,     24
        sub     dh,     y
        mov     dl,     x
        call    ShowSymb
        ; устанавливаем курсор для вывода символа пв
        mov     dh,     y
        mov     dl,     79
        sub     dl,     x
        call    ShowSymb
 
        ret
Show4Symbols    endp
 
code ends
end start
0
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 31
13.12.2016, 13:06  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Если захотите, переделаете на прерывания BIOS без сдвига.
Спасибо большое!
Подскажите, как можно сделать прерывания BIOS без сдвига?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
13.12.2016, 13:19
http://www.codenet.ru/progr/dos/int_0009.php
Функции 09h, 0Ah, а также некоторые функции вывода целой строки 13h.

Попробуйте. Если из Правого Нижнего угла будет переводить, можно сдвинуть правую границу с 79 на 78 - отступить 1 одну позицию. Это будет не сильно заметно.
0
0 / 0 / 0
Регистрация: 12.12.2016
Сообщений: 31
13.12.2016, 13:25  [ТС]
ФедосеевПавел, Спасибо. Сделали через очистку экрана.
Подскажите, как сделать выход из программы клавишей f10?
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
code segment                    
assume cs:code, ds:code         
org 100h         
               
start:                                                                     
jmp begin
x db 10 
y db 0 
v db 79 
z db 24                      ;?????????? ??????? ?? ?, ???????? ??????? 0
simb db 0
 
begin:
 
; ?????? ??????
 mov ah, 1
 mov ch, 20
 mov cl, 0
 int 10h
 
; ?????? ????? ??????? ??????, ?????? ????? ??????
mov cx, 0
mov dx, 184fh
mov bh, 40h
mov ax, 600h
int 10h
 
m1:
 
; ???? ??????? ???????
mov ah, 0
int 16h
 
; ???????? ?????????????? ???????
cmp al, 0
je m1
 
 
; ????????? ?? ESC
cmp ah, 44h
jnz noexit
jmp exit
noexit:
 
; ????????? ???????? ??????
mov simb, al
mov x, 0 
mov y, 0
mov v, 72 
mov z, 24
 
; ??????? ?????? ? ????? ?????? (??????? ?????? ??????)
mov ah, 2
mov dx, 0c28h
mov bh, 0
int 10h
 
mov ah, 0eh
mov al, ' '
int 10h
 
m2:
 
; ????????????? ?????? ??? ?????? ??????? ??
mov ah, 2
mov bh, 0
mov dh, z              
mov dl, x                
int 10h
 
; ??????? ?????? ? ??????? ??????? ???????
mov ah, 9
mov cx, 1
mov bl, 40h
mov bh, 0
mov al, simb
int 10h
 
 
; ????????????? ?????? ??? ?????? ??????? ??
mov ah, 2
mov bh, 0
mov dh, z              
mov dl, v                
int 10h
 
; ??????? ?????? ? ??????? ??????? ???????
mov ah, 9
mov cx, 1
mov bl, 40h
mov bh, 0
mov al, simb
int 10h
 
; ????????????? ?????? ??? ?????? ??????? ??
mov ah, 2
mov bh, 0
mov dh, y              
mov dl, v                
int 10h
 
; ??????? ?????? ? ??????? ??????? ???????
mov ah, 9
mov cx, 1
mov bl, 40h
mov bh, 0
mov al, simb
int 10h
 
; ????????????? ?????? ??? ?????? ??????? ??
mov ah, 2
mov bh, 0
mov dh, y              
mov dl, x                
int 10h
 
; ??????? ?????? ? ??????? ??????? ???????
mov ah, 9
mov cx, 1
mov bl, 40h
mov bh, 0
mov al, simb
int 10h
 
; ????????
mov ah, 0
int 1ah
mov bx, dx
add bx, 2
 
 
m3:
mov ah, 0
int 1ah
cmp dx, bx
jb m3
 
; ??????????? ? ?????????? ??????? ?? ???????
inc x
inc x
inc x
inc y
dec z
dec v
dec v
dec v
 
 
; ???????? ?? ????? ?? ????? ?????? (40-? ???????)
cmp x, 41
cmp y, 13
 
jne m4
mov x, 0
mov y, 0 
           ; ??????????????? ???????? ???????? ? ?????????? ???????
jmp m1               ; ????? ?? ???????? ??????? ???????  
 
 
m4:
 
mov cx, 0
mov dx, 184fh
mov bh, 40h
mov ax, 600h
int 10h
 
jmp m2               ; ????? ?? ????? ??????? ? ????????? ???????
 
 
exit:
mov ah, 4ch
int 21h
code ends
end start
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,888
Записей в блоге: 11
13.12.2016, 15:27
Assembler
35
36
37
38
39
40
41
        cmp     al, 0
        jne     @@ShowMustGoOn
        cmp     ah, 121
        jnz noexit
        jmp exit
noexit:
@@ShowMustGoOn:
Если не напутал с условиями, то так.

В вашей программе я бы выделил недочёт - каждый из 4-х символов выводится отдельным кодом, и очистка (пробелом) также отдельным кодом. В моей программе была иная структура - из основной программы вызывалась подпрограмма рисования 4-хсимволов, которая вызывала п/п рисования одного символа. И сам вывод символа был однообразным.

Но, как сделали, так сделали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2016, 15:27
Помогаю со студенческими работами здесь

Заполнить с клавиатуры двумерный массив на 16 элементов. Найти среднее арифметическое элементов, расположенных в четырех углах
1) Заполнить с клавиатуры двумерный массив на 16 элементов. Найти среднее арифметическое элементов, расположенных в четырех углах;

Удалить из сообщения все слова, содержащие вводимый с клавиатуры символ
Дана строка: "Компьютерная программа — последовательность инструкций, предназначенных для исполнения устройством управления вычислительной...

Какие функции считывают символ, вводимый с клавиатуры не выводя его на экран
Учил Си с начала только что окончившегося учебного года) Это мой первый язык программирования! Последняя написанная мной программа была...

Вывести на экран все слова строки, которые начинаются на вводимый с клавиатуры символ
Дана строка, состоящая из 4 слов. Вывести на экран все слова строрки, которые начинаются на вводимый с клавиатуры символ

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru