Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2010, 21:27   #1
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
Вопрос Нарисовать квадрат!

Надо нарисовать квадратик через режим 0A000H функцию 13h
Допустим, нам нужен квадрат 100х100. Регистр al отвечает за цвет, регистр bx за смещение.

Код:
mov al,40
mov bx,50
mov cx,10000
kvadrat:
mov es:[bx],al ;
inc bx


k:
loop kvadrat
То есть то что надо сделать, увеличивать на 100 значение в bx, а потом сместить ещё на 320 и так 100 раз. Можно это делать через cmp, проверяя какое текущее смещение и смещаться, но это просто гемор жуткий, так придётся 100 раз делать что-ли?

Явно есть какой-то способ всё сделать это в лучшем виде
SwiP вне форума Ответить с цитированием
Старый 04.10.2010, 21:58   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

лучше подойдет команда stosb
Код:
mov al,40
mov di,50
mov dx,100
m1: mov cx,100
rep movsb
add di,220
dec dx
jnz m1
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 04.10.2010, 22:07   #3
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

эмм, а пояснить? откуда здесь di взялся и dx, что даёт stosb
SwiP вне форума Ответить с цитированием
Старый 05.10.2010, 04:01   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от SwiP
То есть то что надо сделать, увеличивать на 100 значение в bx, а потом сместить ещё на 320 и так 100 раз. Можно это делать через cmp, проверяя какое текущее смещение и смещаться, но это просто гемор жуткий, так придётся 100 раз делать что-ли?
Явно есть какой-то способ всё сделать это в лучшем виде
Лучшего способа нет так как в видеопамяти линейная адресация, а экран для человека это матрица из столбцов и строк
Код:
; masm dos com #
.286
.model tiny
.code
start:	mov ax,13h; устанавливаю режим 320х160 256 цветов
    	int 10h
	push 0A000h; позиционирую ES на область графического видеоадаптера
	pop es
	mov al,0Fh; цвет точки
	mov di,50; координата верхнего левого угла квадрата
	mov cx,100
@@:	push cx
	mov cx,100
	rep stosb; вывожу линию из 100 точек
	add di,220; сдвигаюсь на 220 точек (=320-100)
	pop cx
	loop @b; вывожу 100 линий
	mov ax,0
	int 16h; любуемся на дела рук своих пока не нажмут на любую клавишу
	mov ax,3
    	int 10h; устанавливаем текстовый режим
	retn; выходим из программы
end start

Последний раз редактировалось Mikl___; 05.10.2010 в 05:13.
Mikl___ вне форума Ответить с цитированием
Старый 05.10.2010, 20:38   #5
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

Cпасибо, только что же всё таки делает rep stosb (поконкретнее)?
SwiP вне форума Ответить с цитированием
Старый 05.10.2010, 23:41   #6
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Что делает rep stosb?
stosb выгружает al по адресу es : di. После этого меняет значение di в зависимости от флага направления и размера операнда. В данном случае на di+1.
rep - префикс повторения. Повторяет команду и уменьшает содержимое cx, пока он не станет равным 0. CX тут типа счетчика цикла.

Как же вы программируете без справочника команд?
Vergo вне форума Ответить с цитированием
Старый 07.10.2010, 20:16   #7
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

Вот ещё вопросик задам, чтобы тему новую не начинать.
0A000h - это что за режим? Просто поточечно выводит через функции? Тогда 0B800h это прямое использование видеобуфера, и является более предпочтительным?
SwiP вне форума Ответить с цитированием
Старый 07.10.2010, 21:49   #8
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Цитата:
0A000h - это что за режим?
Это не режим, а начальный адрес страницы видеопамяти в режиме 13H.
В других режимах он может быть, как вы написали, 0B800H.
Можете почитать про видеорежимы и видеофункции подробнее:
http://www.xserver.ru/computer/computer/video/2/
Vergo вне форума Ответить с цитированием
Старый 08.10.2010, 04:45   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

SwiP
Программу тебе написали, по-моему, самое время сесть за учебник и самостоятельно узнать как это всё работает
Mikl___ вне форума Ответить с цитированием
Старый 15.10.2010, 00:39   #10
SwiP
Форумчанин
 
Регистрация: 18.03.2009
Сообщений: 101
По умолчанию

А почему не хочет работать с режимом 12h? (640x480x16). Просто тупо какие-то белые точки, или там по другому надо всё делать?
SwiP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Латинский квадрат innaa639 Помощь студентам 1 22.11.2009 22:40
ХИ квадрат Vito89 Помощь студентам 3 25.10.2009 16:35
Черный квадрат Дініс Свободное общение 9 07.09.2009 21:43
нарисовать квадрат с длиной стороны 100 пикселей, используя процедуру linerel(x,y:integer) Кася_ Помощь студентам 6 23.02.2009 19:13
Магический квадрат Anarx Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2008 13:07