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

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

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

> Построение и управление квадратиками
сообщение
Сообщение #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 -


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


N337
****

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

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


Клавиши "+" и "-" меняют цвет выбранного квадрата:
BOX_SIZE	equ 20		;длина стороны квадрата
SCR_WIDTH equ 320 ;ширина экрана

locals

.model small

.stack 2048

.data

;----- структура-квадрат (описание типа) -----
x equ word ptr [0]
y equ word ptr [2]
color equ byte ptr [4]

;----- список квадратов (переменные) -----
boxes dw 30
dw 30
db 1

dw 40
dw 40
db 2

dw 50
dw 50
db 3

dw 60
dw 60
db 4

dw 70
dw 70
db 5

dw 80
dw 80
db 6

dw 90
dw 90
db 7

dw 100
dw 100
db 8

dw 110
dw 110
db 9

.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,boxes
push si
mov cx,9
init_box:
push cx
call draw_box
add si,5
pop cx
loop init_box
pop si

get_key:
;ожидать нажатия клавиши
xor ax,ax
int 16h
;выход по ESC
cmp al,27
je exit
;"+" - выбрать следующий цвет для текущего квадрата
cmp al,'+'
je inc_color
;"-" - выбрать предыдущий цвет для текущего квадрата
cmp al,'-'
je dec_color
;нажата ли клавиша с цифрой?
cmp al,'1'
jb non_digit
cmp ah,'9'
jbe sel_square
non_digit:
;нажата ли клавиша со стрелкой?
cmp ax,4800h
je up
cmp ax,4B00h
je left
cmp ax,4D00h
je right
cmp ax,5000h
je down
jmp get_key

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

;выбор крадрата по нажатию клавиши с цифрой '1'-'9'
sel_square:
sub al,'1' ;si = (al - '1') * 5
mov ah,5
mul ah
lea si,boxes
add si,ax
jmp get_key

dec_color:
;стереть текущий квадрат
cmp [si].color,1
jbe redraw
call draw_box
dec [si].color
jmp redraw

inc_color:
;стереть текущий квадрат
cmp [si].color,15
jae redraw
call draw_box
inc [si].color
jmp redraw

up:
;стереть текущий квадрат
call draw_box
dec [si].y
jmp redraw

left:
;стереть текущий квадрат
call draw_box
dec [si].x
jmp redraw

right:
;стереть текущий квадрат
call draw_box
inc [si].x
jmp redraw

down:
;стереть текущий квадрат
call draw_box
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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






скажите а как этот код сделать рабочим для Pascal 7.1 со встроенным assembler?
 К началу страницы 
+ Ответить 

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


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

 





- Текстовая версия 29.03.2024 19:56
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name