Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 19.06.2017, 13:16   #1
daria13
Новичок
 
Регистрация: 19.06.2017
Сообщений: 1
Репутация: 10
Сообщение Рисование линий

Здравствуйте! Есть программа, рисующая линии из центра "окна" в точку нажатия левой кнопкой мыши. Никак не могу понять как работает line... Кто знает и может помочь - объясните что это за смещение в стеке и вообще как тут реализован алгоритм Брезенхема.
Код:

.model tiny		;для компиляции COM файла
.486	;директива разрешает ассемблирование всех инструкций процессора i486 
.code			;начало сегмента кода
org 100h		;смещение адресации внутри на 100h байт
	
start:
	mov ax,13h	;включение графического видеорежима 320*200, 256 цветов
	int 10h
 
	xor ax,ax	;инициализация
	int 33h		;манипулятора мышь
	mov ax,1	;показать курсор
	int 33h		;мыши

	mov ax,12	;установка обработчика событий мыши
	mov cx,2	;нажатие левой кнопки
	mov dx,offset handler		;адрес обработчика
	int 33h	

	xor ax,ax	;прерывание клавиатуры. Задержка
	int 16h
	ret

	handler:
		mov  ax,2	
		int  33h	;прячем курсор
		push dx	;сохранение dx
		shr  cx,1	;сдвиг cx вправо на 1
		push cx	;сохранение cx
		push 100
		push 160
		call line
		mov  ax,1
		int 33h
	retf


	line:
		push bp
		mov  bp,sp	;запоминаем вершину стека
		imul di,ss:[bp+6],320
		add  di,ss:[bp+4]

		mov  ax,ss:[bp+8]
		sub  ax,ss:[bp+4]
		sbb  bx,bx		;обнуление bx
		mov  dx,ss:[bp+10]
		sub  dx,ss:[bp+6]
		sbb  cx,cx		;обнуление cx

		mov  si,ax
		or   si,dx		;сравнение битов si и dx
		je   quit		;если 0 или равно переход на quit

		xor  ax,bx		;неили
		sub  ax,bx
		xor  dx,cx
		sub  dx,cx

		or   bx,1
		mov  si,cx
		xor  cx,320
		sub  cx,si
	 
		cmp  ax,dx		;сравнение
		ja a			;если ax больше dx, то переход на a
			xchg ax,dx	;обмен
			xchg bx,cx
		a:

		push 0A000h
		pop  es			; начало видеопамяти в гр режиме

		mov  si,ax
		mov  bp,ax
		b:mov byte ptr es:[di],2
		sub si,dx
		jnl next		;если не меньше, то на метку next
			add si,ax
			add di,cx
			next:
			add di,bx
			dec bp		;вычитание 1
		jne b			;если не равны, то на метку b

		quit:
			mov byte ptr es:[di],2		;переопределение типа данных в di
			pop bp				;извлечение из вершины стека
		ret 8
end start

daria13 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование линий timcryt Assembler 3 03.05.2016 19:47
[C] рисование линий ZuBy Общие вопросы C/C++ 6 01.06.2015 13:18
Рисование "прямых" линий. Делфи Artsiom Помощь студентам 5 29.08.2013 23:17
рисование линий в Tchart V1rus015 Помощь студентам 0 16.04.2013 22:45
рисование линий (а в идеале стрелок) в javascript Rusl92 JavaScript, Ajax 2 21.01.2009 11:18




14:27.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru