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

С помощью клавиш-стрелок можно перемещать эту звездочку по всему экрану

21.04.2023, 17:39. Показов 890. Ответов 2
Метки asm, tasm (Все метки)

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

Для проверки left shift, я добавляла в главный цикл этот кусок кода:

Assembler
1
2
3
4
5
6
7
 ; бесконечный цикл, пока не будет нажата клавиша left shift
        mov ah, 00h
        int 16h
        cmp ah, 0   ; проверяем код нажатой клавиши
        je _loop     ; если клавиша не была нажата, продолжаем цикл
        cmp ah, 2Ah ; проверяем код клавиши left shift
        jne _loop    ; если это не left shift, продолжаем цикл
Но не работает ничего.


Также не срабатывает выход при нажатии клавиши tab.
Вот программа:

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
include io.asm
sstack segment stack
db 128 dup (?)
sstack ends
sdata segment
 
 
    simb   db               ' '
    simb1    db  '*' ;сам символ
    x    db  40 ;горизонтальная координата
    y    db  12 ;вертикальная координата
 
sdata ends
scode segment
assume cs:scode,ds:sdata,ss:sstack
start:
mov ax,sdata
mov ds,ax
; прячем курсор
mov ah, 1
mov ch, 20
mov cl, 0
int 10h
 
; чистим экран 
call clear_scr
 
    ; главный цикл
_loop:     call char_out; выводим символ на экран
 
    ; отсекаем функциональные клавиши
; cmp AL, 0 
    mov ah, 0 ; считываем код нажатой клавиши
    int 16h
    cmp al, 0 ; если это символ
    je left
    cmp ah, 9 ;al, 9
    jne _loop       ; если это Tab
    je exit
 
left:            
    cmp ah, 4bh ; влево
    jne right
    call move_left
                 call clear_scr 
right:  cmp ah, 4dh ; вправо
    jne down
    call move_right
    call clear_scr
    
down:   cmp ah, 50h ; вниз
    jne up
    call move_down
    call clear_scr
    
up: cmp ah, 48h ; вверх
    jne _loop
    call move_up
    call clear_scr
                 jmp _loop
 
exit:   call clear_scr
    ;mov ah, 4ch
    ;int 21h
    MOV AH, 4CH
    INT 21H
    
clear_scr   proc near   ; функция очистки экрана
    mov ax, 0600h
    mov cx, 0000h
    mov dx, 184fh
    int 10h
clear_scr   endp
 
 
char_out proc near      ; вывод текущего символа
    mov ah, 02h     ; в указанной позиции
;   mov bh, 0
    mov dh, y
    mov dl, x
    int 10h
 
    mov ah, 09h
;   mov bh, 0
    mov bl, 07h
    mov al, simb1
    mov cx, 1
    int 10h
    ret
    
    
char_out endp
 
 
; проверки на допустимость и изменения координат символа
move_up proc near
    cmp y, 0
    je mup
    dec y
mup:    ret
move_up endp
 
move_left proc near
    cmp x, 0
    je mlft
    dec x
mlft:   ret
move_left endp
 
move_right proc near
    cmp x, 79
    je mrgt
    inc x
mrgt:   ret
move_right endp
 
move_down proc  near
    cmp y, 24
    je mdn
    inc y
mdn:    ret
move_down endp
 
scode ends
end start
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2023, 17:39
Ответы с готовыми решениями:

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

Перемещать звёздочку с помощью клавиш стрелок <curses.h>
После запуска программы на экран должна вывестись звёздочка и она перемещается с помощью клавиш стрелок #include &lt;curses.h&gt; ...

Окна, которые можно минимизировать и разворачивать на весь экран, перемещать по экрану мышкой
Есть у SmartGWT или у Sencha такие объекты -окна, которые можно минимизировать и разворачивать на весь экран, перемещать по экрану...

2
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
21.04.2023, 19:00
Лучший ответ Сообщение было отмечено aam как решение

Решение

По нажатию Left Shift в программе в углу появляется символ.
По Tab делается выход в Дос. Можете доработать с гашением аппаратного курсора.
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
sstack segment stack
db 256 dup (?)
sstack ends
sdata segment
 
 
    simb   db    32  ; пробел
    simb1    db  '*' ;сам символ
    x    db  40 ;горизонтальная координата
    y    db  12 ;вертикальная координата
 
sdata ends
scode segment
assume cs:scode,ds:sdata,ss:sstack
start:
mov ax,sdata
mov ds,ax
; прячем курсор
; mov ah, 1
; mov ch, 20
; mov cl, 0
; int 10h
 
; чистим экран 
call clear_scr
 
    ; главный цикл
_loop:  mov al,simb1
    call char_out; выводим символ на экран
    call getkey
    push ax ; сохраняем код нажатой клавиши
    mov al,simb
    call char_out; выводим пробел на экран
    pop ax
 left:            
    cmp ah, 4bh ; влево
    jne right
    call move_left
                 call clear_scr 
right:  cmp ah, 4dh ; вправо
    jne down
    call move_right
down:   cmp ah, 50h ; вниз
    jne up
    call move_down
up: cmp ah, 48h ; вверх
    jne _loop
    call move_up
    jmp _loop
 
exit:   call clear_scr
    ;mov ah, 4ch
    ;int 21h
    MOV AH, 4CH
    INT 21H
    
clear_scr   proc near   ; функция очистки экрана
;    mov ax, 0600h
;    mov cx, 0000h
;    mov dx, 184fh
    mov ax,3
    int 10h
    ret
clear_scr   endp
 
; подпрограмма ожидания кода клавиши
getkey  proc near
    mov ah,1
    int 16h
    jnz get1 ; если клавиша нажата, то переход с чтению кода клавиши
    mov ah,2 ; опрос флагов клавиатуры
    int 16h
    call dosmile ; левый шифт нажат ?
    jmp getkey ; возврат на ожидание клавиатуры
get1:   mov ah,0 ; чтение нажатой клавиши
    int 16h
    cmp al,9 ; TAB
    jz exit
    ret
getkey  endp
 
dosmile proc near
    push es
    push ax
    mov ax,0B800h
    mov es,ax
    pop ax
    test al,2 ; al - флаги клавиатуры
    mov al,32 ; бит=0 - символ пробела
    jz dosmi1
    mov al,1  ; бит=1 - символ мордочки
dosmi1: mov ah,15 ; атрибут цвета символа
    xor di,di ; 0 - адрес верхнего левого угла
    mov es:[di],ax ; пишем символ в угол
    pop es
    ret
dosmile endp
 
; не то чтобы совсем плохая подпрограмма - решите какая из двух подходит больше
char_out_bad proc near      ; вывод текущего символа al
    push ax 
    mov ah, 02h     ; в указанной позиции
    mov bh, 0
    mov dh, y
    mov dl, x
    int 10h
    pop ax 
    mov ah, 09h
    mov bh, 0
    mov bl, 07h
    mov cx, 1
    int 10h
    ret
char_out_bad endp
 
char_out proc near
    push ax
    push es
    push di
    push ax
    mov ax,0B800h
    mov es,ax
    mov al,80 ; di=2*(80*y+x) - адрес видеопамяти
    mul y
    add al,x
    adc ah,0
    add ax,ax
    mov di,ax
    pop ax
    mov ah,15 ; атрибут
    mov es:[di],ax ; пишем символ в видео память
    pop di
    pop es
    pop ax
    ret
char_out endp 
 
; проверки на допустимость и изменения координат символа
move_up proc near
    cmp y, 0
    je mup
    dec y
mup:    ret
move_up endp
 
move_left proc near
    cmp x, 0
    je mlft
    dec x
mlft:   ret
move_left endp
 
move_right proc near
    cmp x, 79
    je mrgt
    inc x
mrgt:   ret
move_right endp
 
move_down proc  near
    cmp y, 24
    je mdn
    inc y
mdn:    ret
move_down endp
 
scode ends
end start
1
1 / 1 / 0
Регистрация: 28.03.2022
Сообщений: 16
21.04.2023, 20:41  [ТС]
Цитата Сообщение от qbfan Посмотреть сообщение
По нажатию Left Shift в программе в углу появляется символ.
По Tab делается выход в Дос.
За комментарии особая благодарность!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2023, 20:41
Помогаю со студенческими работами здесь

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

Движение текста по экрану с помощью клавиш управления курсором
осуществить движение текста по экрану с помощью клавиш управления курсором. Текст содержит имя студента и номер группы;

Круг перемещается по экрану с помощью клавиш управления курсора
Круг передвигается по экрану с помощью ←,· *, ↓, →. При нажатии клавиши «пробел» меняется стиль заполнения случайным образом. При...

Можно ли с помощью команды COPY перемещать и удалять файлы?
Народ, подскажите пожалуйста, можно ли с помощью команды COPY (в CMD) перемещать и удалять файлы?

Как можно с помощью стрелок передвигать созданное окно в модуле Crt?
Подскажите как можно с помощью стрелок передвигать созданное окно в модуле Crt. Спасибо!


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
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-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru