IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Построение и управление квадратиками
18192123
сообщение 15.04.2008 17:15
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Имеется набор из 9-ти квадратиков. Выбор активного из них осуществляется нажатием соответствующей цифровой клавиши. Активный квадратик можно передвигать по полю, используя курсорные клавиши, а по нажатию "пробела" - менять его цвет. Написать программу построение различных фигур, испльзуя такой принцип управления.

Пока останавилась на построении набора квадратиков..Вот что получилось:

text segment 'code' ; (1) начало сегмента команд
assume CS:text,DS:data; (2)
vertical proc; (3) объявление процедуры построения вертикальной линии
v: ; (4)
push CX; (5) сохраним в стек счетчик цикла
mov AH,0Ch; (6) функция вывода пикселя
mov AL,6; (7) установка цвета
mov BH,0; (8) видеостраница
mov CX,SI; (9) установка X-координаты
int 10h; (10) вызов BIOS
inc DX; (11) счетчик Y-координаты
pop CX; (12) выгрузим из стека счетчик цикла
loop v; (13) уменьшим его на единицу
ret; (14) выход из подпрограммы
vertical endp; (15) конец текста подпрограммы
horizontal proc; (16) объявление процедуры построения горизонтальной линии
h: ; (17)
push CX; (18) сохраним в стек счетчик цикла
mov AH,0Ch; (19) функция вывода пикселя
mov AL,6; (20) установка цвета
mov BH,0; (21) видеостраница
mov CX,SI; (22) установка X-координаты
int 10h; (23) вызов BIOS
inc SI; (24) счетчик Х-координаты
pop CX; (25) выгрузим из стека счетчик цикла
loop h; (26) уменьшим его на единицу
ret; (27) выход из подпрограммы
horizontal endp; (28) конец текста подпрограммы

begin: ;(29) начало основной программы
mov AX,00h; (30) функция задания режима
mov AL,10h; (31) графический режим EGA
int 10h; (32) вызов BIOS
mov cx,3
rect: push cx
mov SI,100; (33) Х-координата
add si,i
mov DX,100; (34) Y-координата
add dx,i
mov CX,20; (35) длина стороны
call vertical; (36) вызов подпрограммы
mov SI,100; (37) Х-координата
add si,i
mov DX,100; (38) Y-координата
add dx,i
mov CX,20; (39) длина стороны
call horizontal; (40) вызов подпрограммы

mov SI,120; (33) Х-координата
add si,i
mov DX,100; (34) Y-координата
add dx,i
mov CX,20; (35) длина стороны
call vertical; (36) вызов подпрограммы

mov SI,100; (37) Х-координата
add si,i
mov DX,120; (38) Y-координата
add dx,i
mov CX,21; (39) длина стороны
call horizontal; (40) вызов подпрограммы
add i,22
pop cx
loop rect

mov AH,08h
int 21h

mov AH,00h
mov AL,03h
int 10h

mov AX,4C00h; (41) завершение программы
int 21h; (42)
text ends; (43) конец сегмента команд

data segment
i dw 0
data ends

stk segment stack
dw 128 dup (0)
stk ends

end begin; (44) конец текста программы




Хотела получить рядом расположенные квадратики..но как я предполагаю содержимое регистра СХ сбивается..
Как исправить - не пойму..

Сообщение отредактировано: 18192123 - 15.04.2008 17:19


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
xds
сообщение 20.04.2008 19:21
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Имеет смысл работать с квадратами, как со структурами (зачатки ООП). Текущий квадрат представляется в виде указателя на его структуру (в данном случае это регистр si):
BOX_SIZE	equ 20		;длина стороны квадрата
SCR_WIDTH equ 320 ;ширина экрана

locals

.model small

.stack 2048

.data

;----- структура-квадрат (описание типа) -----
box struc
x dw ?
y dw ?
color db ?
box ends

;----- список квадратов (переменные) -----
box1 box <20, 20, 1>
box2 box <0, 0, 2>

.code

;----- вывод квадрата с заданными координатами и цветом -----
draw_box:
;вичисление смещения в видеобуфере по заданным координатам x и y
;bx = y * SCR_WIDTH + x
mov ax,SCR_WIDTH
mul [si].y
add ax,[si].x
mov bx,ax
mov al,[si].color
;вывод верхней стороны
mov cx,BOX_SIZE-1
@@1:
xor es:[bx],al
inc bx
loop @@1
;вывод правой стороны
mov cx,BOX_SIZE-1
@@2:
xor es:[bx],al
add bx,SCR_WIDTH
loop @@2
;вывод нижней стороны
mov cx,BOX_SIZE-1
@@3:
xor es:[bx],al
dec bx
loop @@3
;вывод правой стороны
mov cx,BOX_SIZE-1
@@4:
xor es:[bx],al
sub bx,SCR_WIDTH
loop @@4
ret

;----- основная программа -----
entry:
;инициализация ds
mov ax,@data
mov ds,ax

;запомнить в стеке номер текущего видеорежима
mov ah,0Fh
int 10h
push ax
;установка видеорежима 320x200x256
mov ax,13h
int 10h

;es:0 -> видеобуфер
mov ax,0A000h
mov es,ax

;выбрать первый квадрат
lea si,box1
;вывести его
call draw_box

;выбрать второй квадрат
lea si,box2

redraw:
;вывести текущий квадрат
call draw_box

;ожидать нажатия клавиши
xor ax,ax
int 16h
;выход по ESC
cmp al,27
je exit

;стереть текущий квадрат
call draw_box

;вычислить новые координаты текущего
add [si].x,2
inc [si].y

jmp redraw

exit:
;восстановить видеорежим
pop ax
xor ah,ah
int 10h

;выход
mov ax,4C00h
int 21h

end entry


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 5.11.2024 23:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"