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

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

19.09.2020, 00:54. Показов 3291. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, форум.
Выполнив все заданные мне работы по asm, столкнулся с последний. Тема работы - "Обработка прерываний."
Задание:
Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре. С клавиатуры можно ввести любую латинскую букву, при этом, выводимый символ изменяется на введённый символ. Вывод осуществлять непрерывно с некоторой задержкой. Задержка между выводом каждого символа определяется нажатием цифровой клавиши, следующим способом: введённую цифру умножить на 29, это и будет число повторений цикла задержки. Для анализа нажатия клавиши использовать вектор 1Ch.
Разбирающиеся люди, пожалуйста подскажите, как написать код в таком формате (имеется ввиду работа с видео), до это разрабатывал только консольные приложения.
Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2020, 00:54
Ответы с готовыми решениями:

Ввести символ и вывести его в текущую позицию курсора с атрибутами
Необходимо реализовать данную задачу использованием компилятора TASM. Ввести символ и вывести его в текущую позицию курсора с атрибутами:...

Вывести приглашение к вводу символа, ввести символ, вывести введенный символ в центре очищенного экрана
Приложение DosBox Tasm.

как фон переместить правее или шапку левее
не могу переместить фон, подскажите!!! чтобы все ровненько стало!!!

11
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
19.09.2020, 01:20
Это какой-то наркотический бред полоумного шизофреника.
0
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 9
19.09.2020, 01:28  [ТС]
Полностью согласен, особенно это ощущается на контрасте. Прошлое задание - разбить строку на 2 части.
Я накидал (скопипастил) код, который просто выводит символ, немного подправил, чтобы она выводил именно нужный символ. Но на этом мои продвижения в этом задании закончились. Да и вывод нужного символа реализован криво, думаю можно сделать лучше.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
19.09.2020, 13:59
Vladisalvvv, разбивайте задание на подзадачи и выполняйте последовательно.
Цитата Сообщение от Vladisalvvv Посмотреть сообщение
Выводить в текущее положение курсора символ, введённый с клавиатуры. Этот же символ выводить в позицию выше, ниже, левее или правее текущего символа, в зависимости от нажатия клавиш “8”, “2”, “4”, “6” на цифровой клавиатуре.
В переводе это означает, что при помощи цифровой клавиатуры задаётся режим - куда выводить дублирующий символ.
При помощи int 16h ah=00h можно экспериментально узнать коды этих клавиш и записать на бумажке.

Ввод символа с клавиатуры без "эха" - int 16h ah=00h.
Вывод символа в текущей позиции без изменения положения курсора - int 10h ah=0Ah
Получить координаты курсора - int 10h ah=03h
Изменить позицию курсора - int 10h ah=02h
Получить номер текущей видеостраницы - int 10h ah=0Fh
Детали в справочниках
http://www.codenet.ru/progr/dos/
http://www.techhelpmanual.com/2-main_menu.html
http://www.ctyme.com/intr/int.htm

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

Вероятно, вторая часть подразумевает перехват прерывания таймера для отсчёта времени задержки. Время задержки будет меняться в ходе программы в зависимости от нажатия клавиш "0..."9" основной клавиатуры.
Потом вы нажимаете и не отпускаете клавишу с латинской буквой - и в зависимости от задержки - должен меняться темп вывода символов на экран.
Может имеется в виду настройка int 16h ax=0305h
0
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 9
19.09.2020, 18:55  [ТС]
Получилось реализовать половину программу, как раз до момента с таймером.
Возник вопрос, как реализовать задержку (допустим 5 секунд) с помощью вектора 1ch?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
19.09.2020, 19:17
Перехватываете прерывание 1Ch.
В прерывании выполняете всего одно действие декремент переменной - только настройте сегмент данных перед обращением.

А в основной программе:
Assembler
1
2
3
4
  mov [Timer], 50000 / 182  ;вызов прерывания 1Ch - 1 раз в 18.2 мс=0.0182c
  @@wait_for_5s:
    cmp [Timer], 0
  jnz @@wait_for_5s
Добавлено через 3 минуты
Что-то я напутал с вычислением константы для таймера.
Прерывание 1Ch вызывается 18,2 раза в секунду. Значит за 5 секунд будет вызвано 18,2*5=91 раз
Assembler
1
2
3
4
  mov [Timer], 5 * 182 / 10 ;вызов прерывания 1Ch - 18.2 раз в секунду
  @@wait_for_5s:
    cmp [Timer], 0
  jnz @@wait_for_5s
Добавлено через 4 минуты
Или в обработчике прерывания
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  push ax
  push ds
  mov ax, @data
  mov ds, ax
  dec [Timer]
  jnz @@Next
    .................
    вот здесь какие-то быстрые действия, требуемые для программы,
    например, вывод на экран
    .................
    mov ax, [InitTimer]  ;ещё раз инициализируем таймер для повторения цикла
    mov [Timer], ax
  @@Next:
.......
  pop ds
  pop ax
  iret
0
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 9
19.09.2020, 21:28  [ТС]
Не подскажете могу ли я воспользоваться вашим кодом для этой программы и как его правильно вставить в нее.
Хочу вынести задержку в отдельную процедуру - delay.
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
.8086
.model small
.stack 100h
.data
     
.data?
 
.code
Main PROC
    mov ax,@data
    mov ds,ax
    
    mov ax,3
    int 10h
    mov bh,0
    xor ax,ax
    int 33h
    xchg ax,cx
    jcxz @exit
    
    mov ax,0Ch
    mov cx,10100b
    push cs 
    pop es
    mov dx,offset mouse
    int 33h
        
    mov ax,1
    int 33h
        
@for: 
mov ah,0
    int 16h
    dec ah
    jnz @for
    mov ax,14h
    xor cx,cx
    int 33h
    int 20h
@exit:   
        
    mov ah,4Ch
    int 21h
Main ENDP
 
 
mouse proc far 
    mov ax,2; Спрятать курсор
    int 33h
 
    mov ax, cx; ax <- x
    mov cl, 3
    shr ax, cl ; x : px -> #symbol
    shr dx, cl ; y : px -> #symbol
 
    mov dh, dl
    mov dl,al
 
    MOV  AH,02          
    MOV  BH,00          
    INT  10H
    
    MOV  AH,09 
    mov ah,01h ; задаем функцию
    int 21h ; вызов прерывания
    ;MOV  AL,'2'     
    MOV  BH,00          
    MOV  BL,0FH         
    MOV  CX,1  
    ;call poz
    call enter_check
    int 10H
 
    mov ax,1 ; Возвращаем курсор
    int 33h
 
    retf
mouse endp
 
 
enter_check proc
@back:
    mov bl,al ; сохраняем bl в dx
    mov ah,08h ; задаем функцию
@back_enter:
    int 21h ; вызов прерывания
    cmp al,0Dh ; проверяем нажатие Enter
    je @click_enter ; если нажали Enter, то выход
    cmp al,30h ; проверяем нажатие Enter
    je @exit_program ; если нажали Enter, то выход
    cmp al, 38h; провверяем нажатие '8'
    je @click_8
    cmp al, 32h; провверяем нажатие '2'
    je @click_2
    cmp al, 34h; провверяем нажатие '4'
    je @click_4
    cmp al, 36h; провверяем нажатие '6'
    je @click_6 
    call delay ;;;;;;;;;;;;;
    
    mov bl,al
    jmp @back_enter
    
@click_8:
    dec dh
    call izmen_poloj_kursora
    call vivod_sim
    inc dh
    call izmen_poloj_kursora
    jmp @back
    
@click_2:
    inc dh
    call izmen_poloj_kursora
    call vivod_sim
    dec dh
    call izmen_poloj_kursora
    jmp @back   
    
@click_6:
    inc dl
    call izmen_poloj_kursora
    call vivod_sim
    dec dl
    call izmen_poloj_kursora
    jmp @back
    
@click_4:
    dec dl
    call izmen_poloj_kursora
    call vivod_sim
    inc dl
    call izmen_poloj_kursora
    jmp @back
    
        
@click_enter:
    ret
    
@exit_program:
    mov ah,4Ch
    int 21h
    
enter_check endp
 
 
vivod_sim proc
    MOV AH,09 ;Функция вывода
    MOV al,bl ;Выводимый символ
    MOV CX,1 ;Число повторений символа
    MOV BH,00          
    MOV BL,0FH
    INT 10H ;Вызвать BIOS
    ret
vivod_sim endp
 
 
izmen_poloj_kursora proc
    MOV AH,02 ;Установить положение курсора
    MOV DH,dh ;Строка
    MOV DL,dl ;Столбец
    INT 10H ;Вызвать BIOS
    ret
izmen_poloj_kursora endp
 
 
delay proc  
    push bx
    push cx
    push dx
 
 
  
    pop dx
    pop cx
    pop bx
  
    ret
delay endp   
 
end Main
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
19.09.2020, 21:58
Что это за код? Он не подходит под условие из первого сообщения - какая-то "мышь"...
0
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 9
19.09.2020, 22:45  [ТС]
А в каком смысле? Вроде выполняет все до таймера.
То есть печатает символ, дальше обрабатывает след клавишу(делает проверка на 8,2,6,4), если введены они печатает символ выше, ниже..
Или я что-то не так понимаю?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
19.09.2020, 22:53
В коде обработчик мыши, о котором в условии ни слова.
Поэтому вопрос - что это за код?
Если код для другой задачи, то и ответ по задержке будет другим - есть вариант через обращение к функции задержки.
1
0 / 0 / 0
Регистрация: 29.09.2019
Сообщений: 9
19.09.2020, 23:20  [ТС]
Похоже вы правы.
Когда начал заниматься этим заданием не понял фразу "в текущее положение курсора символ", потом погугли похожие задачи, наткнулся на реализацию с обработчиком мыши, похоже это меня и запутало..
Сейчас отпишу преподавателю, может быть его устроит такая реализация.
А не подскажете, где я могу почитать информацию про задержку для этого кода, все ровно доделаю его для себя.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
20.09.2020, 00:11
Динамический вывод системного времени
только там DOS com программа и всё в одном сегменте - для DOS exe будет чуть сложнее при обращении к данным

Assembler
23
24
25
26
27
        mov     counter, 18             ;ожидать примерно 1 секунду
 
WaitTimer_1s:
        cmp     counter, 0
        jnz     WaitTimer_1s
Обработчик
Assembler
144
145
146
147
148
149
; Обработчик прерывания 1Ch (пользовательский обработчик IRQ0)
int1Ch_handler  proc    far
        dec     word ptr cs:counter     ; увеличить счетчик накоплений
        db      0EAh                    ; команда jmp far
old_int1Ch      dd      0               ; адрес старого обработчика
int1Ch_handler  endp
Добавлено через 29 минут
Возможно, пояснения по работе с прерыванием 1Ch (или, что почти то же самое с 08h) есть в книге
Зубков. Ассемблер для DOS, Windows, Linux.
А так сразу и не вспомню - это относится исключительно к программированию в DOS и к ассемблеру имеет отношение только из-за удобства ассемблера при перехвате прерываний.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2020, 00:11
Помогаю со студенческими работами здесь

Вывести символ, введенный в инпут
Всем драсьте! Вот вроде бы все просто: $('input').keydown(function(){ con ($(this).val()); }); Но в консоль выводится...

Как вывести на консоль введённый символ?
Всем добрый день! Написал учебный пример для ввода данных трёх типов: integer, real, char . Код компиляцию проходит. Но при исполнении...

Если введенный символ является цифрой от «0» до «5», то вывести слово «до»
помогите пожалуйста). Если введенный символ является цифрой от «0» до «5», то вывести слово «до» , если цифрой от «6» до «9», то вывести...

Вывести true если введенный символ является гласной буквой
Программа должна выдавать true если введенный символ является гласной. Паскаль.Использовать функции в модуле. (Заранее спасибо!)

Вывод буквы в текущей позиции курсора
Программа MASM,TASM которая выводит английскую букву &quot;D&quot; в текущей позиции курсора,то есть в левом верхнем углу экрана.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru