Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler, MASM, TASM

Войти
Регистрация
Восстановить пароль
 
NikoX_93
10 / 10 / 3
Регистрация: 22.11.2011
Сообщений: 85
Записей в блоге: 1
#1

Как лучше сделать? - Assembler

25.04.2013, 10:46. Просмотров 419. Ответов 1
Метки нет (Все метки)

У меня задача такая:

"Программа очищает экран и вырезает в его центре инверсное окно разумных размеров. Вводимый с клавиатуры символ должен, с разумной скоростью, двигаться вокруг этого окна (по его кромке). При вводе следующего символа все повторяется. Выход из программы по нажатию F8."

Пока только вырезал инверсное окно.

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
stack segment para stack 'stack'        ;Описание сегмента стека
db 100 dup (?)              ;Под стек выделяется 100 байт
stack ends
 
data segment para public  'data'    ;Описание сегмента данных
 
                                                ; Данные
 
data ends
 
code segment para public 'code'     ; Сегмент кода
assume cs:code, ds:data         ; Оператор осуществляет привязку сегментных
                    ; регистров к описанным сегментам. Необ-ходим
                    ; для правильной трансляции
 
start1: mov ax,data         ; В сегментный регистр
mov ds,ax               ; ds загружается базовый адрес сегмента данных
 
                                ; очистка экрана
mov cx,0                ; левый верхний угол экрана. Строка=0, столбец=0.
mov dx,184fh            ; правый нижний угол экрана. Строка=24 (18h), стол-бец=79 (4fh)
mov bh,7            ; белый по черному
mov ax,619h             ; функция 6. Поднять на 25 строк (19h), то есть на весь экран
int 10h
 
mov ah,6
mov ch,5                ; в cx задается левый верхний угол
mov cl,2                ; области
mov dh,2                ; в dx задается правый нижний угол
mov dl,75               ; области
mov al,15
mov bh,11111000b
int 10h
 
mov ah,7                ; задержка экрана           
int 21h
mov ah,4ch              ; выход в NORTON
int 21h
 
code  ends
end start1
Подскажите дальше - как сделать, чтобы символ мог вокруг этого выреза. И чтобы при нажатии клавиши F8 выходил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 10:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как лучше сделать? (Assembler):

как лучше сделать irq-->idt-->gdt - Assembler
всем доброго времени суток, к сожалению osdev.ru пропал с радаров интернета, по этому решил обратиться сюда, собрал IDT GDT ...

Отдельно упорядочить (как угодно, но лучше по возрастанию) и вывести на экран элененты с четными и нечётными номерами позиций. - Assembler
Здравствуйте!!!! Погите с написанием следующей программы: Ввести массив чисел. Отдельно упорядочить (как угодно, но лучше по...

у меня два вопроса. 1) как сделать выход по нажатию клавии ESC 2) как вывести ответ. - Assembler
вот код ideal model small stack 256 dataseg op1 db 1 op2 db 1 op3 db 1 op4 db 1

Как лучше сделать? - Turbo Pascal
Задача звучит следующим образом: В каждой декаде месяца найти температуру самого холодого дня и вывести число этого месяца. А...

Как лучше сделать? - Удаление вирусов
Я работаю в магазине бытовой техники. Там у нас есть парочку компов в продаже. Ну и каждый соответсвенно из продавцев считает, что его...

Как лучше сделать? - Ruby on Rails
Приветствую. я только начал изучать RoR и поэтому ещё не сильно разбираюсь в нём, но всё таки решил попрактиковаться создав свой проект...

1
NikoX_93
10 / 10 / 3
Регистрация: 22.11.2011
Сообщений: 85
Записей в блоге: 1
11.05.2013, 21:38  [ТС] #2
Сам спросил - сам ответил:
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
sseg segment para stack 'sseg'          ;Описание сегмента стека
db 100 dup (?)                          ;Под стек выделяется 100 байт
sseg ends
 
data segment para public  'data'    ;Описание сегмента данных
; Данные 
char    db  ?  ;сам символ
posx    db  20 ;горизонтальная координата - последующий x
posy    db  5  ;вертикальная координата - последующий y  
py      db  ?  ;предыдущий x - необходим для очистки символа
px      db  ?  ;предыдущий y - необходим для очистки символа                       
 
data ends
 
code segment para public 'code'     ; Сегмент кода
assume cs:code, ds:data, ss:sseg    ; Оператор осуществляет привязку сегментных
                                    ; регистров к описанным сегментам. Необ-ходим
                                    ; для правильной трансляции
; подпрограмма задержки
wait_prog   proc  far
            mov bx,3000             ; время задержки
         m3:mov cx,0ffffh
         m4:loop m4 
            dec bx
            jnz m3
            ret
wait_prog   endp
; подпрограмма установки курсора
set_prog    proc  far
            ; установка курсора в указанной позиции
            mov ah, 02h     
            mov dh, posy
            mov dl, posx
            int 10h
            ; вывод символа в указанную позицию 
            mov ah, 09h
            mov bl, 07h
            mov al,char
            mov cx, 1
            int 10h
            ret
set_prog    endp
 
start1:
mov ax,data
mov ds,ax
;====================Начало программы===============================
; очистка экрана
mov ax, 0600h
mov bh, 07h
mov cx, 0000h
mov dx, 184fh
int 10h
; установка курсора
mov dh,posy         ; Установка курсора "вверх - вниз".
mov dl,posx         ; Установка курсора "вправо - влево".
mov bh,0
mov ah,2
int 10h
; прячем курсор
mov ah, 1
mov ch, 20
mov cl, 0
int 10h
; вырезаем инверсное окно
mov ah,7            
xor al,al
mov bh,0f0h
mov ch,6            ; в cx задается левый верхний угол          
mov cl,20           ; области
mov dh,18           ; в dx задается правый нижний угол
mov dl,60           ; области
int 10h
; проверка на F8
m10: cmp ah,42h      ; проверка - нажата ли f8?
     jne work         ; нет - идём на выполнение программы
     mov ah,4ch       ; да - выход в NORTON
     int 21h
; ждем ввода символа
work:mov ah,0
     int 16h
; отсекаем функциональные клавиши
     cmp al,0
     je m10
; сохраняем введённый символ
mov char,al
; =======================для позиции по x (слева направо)=======================
m1:
; подпрограмма установки курсора
call set_prog
; задержка
call wait_prog
inc posx            ; posx = posx + 1
cmp posx,61         ; сравнение posx с 61
je m2               ; если равно - переход к следующему шагу
; стираем символ в текущей позиции (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
jmp m1              ; пошли на вывод символа в следующей позиции
; =======================для позиции по y (сверху вниз)=====================
m2:
; стираем последний символ с предыдущего шага (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
; подпрограмма установки курсора
call set_prog
; задержка
call wait_prog
inc posy            ; posy = posy + 1
cmp posy,19         ; сравнение posy с 19
je m6               ; если равно - переход к следующему шагу
; стираем символ в текущей позиции (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
jmp m2              ; пошли на вывод символа в следующей позиции
; =====================для позиции по x (справа налево)==============================
m6:
; стираем последний символ с предыдущего шага (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
; подпрограмма установки курсора
call set_prog
; задержка
call wait_prog
dec posx            ; posx = posx - 1
cmp posx,19         ; сравнение posx с 20
je m7               ; если равно - переход к следующему шагу
; стираем символ в текущей позиции (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
jmp m6              ; пошли на вывод символа в следующей позиции
; =======================для позиции по y (снизу вверх)================================
m7:
; стираем последний символ с предыдущего шага (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
; подпрограмма установки курсора
call set_prog
; задержка
call wait_prog
dec posy            ; posy = posy - 1
cmp posy,4          ; сравнение posy с 4
je m11              ; если равно - переход к следующему шагу
; стираем символ в текущей позиции (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
jmp m7              ; пошли на вывод символа в следующей позиции
; после выполнения программы возвращаем исходные данные и уходим на проверку нажатия F8
m11:
; стираем последний символ с предыдущего шага (пробелом)
mov ah, 0eh
mov al, ' '
int 10h
mov posy,5
mov posx,20
jmp m10; 
 
code  ends
end start1
Если вдруг кому-нибудь пригодится
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 21:38
Привет! Вот еще темы с ответами:

Как сделать лучше? - jQuery
Задача такая: есть таблица с заполнеными данными из sql. C помощью jquery хочу добавить кнопку "Добавление строки" код в function.js ...

Как лучше сделать - MS Access
Задачка следующая. Есть заявка, у которой, 3 идентификатора.(инд1 инд2 и № самой заявки) В самой заявке есть след столбци: название,...

Как лучше сделать? - SQL Server
Имеется поле значений(float),необходимо в эту же таблицу добавить поле значения которого a(i)=a(i)-a(i-1). Чувствую надо делать с помощью...

Как лучше сделать? - Delphi БД
У меня есть таблица табл.doc(ее часть). Данная таблица создана программно.Поля "ИТОГО" и "Всего" тоже считаются программно, автоматически....


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru