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

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

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

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

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

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

Здравствуйте! Есть программа, рисующая линии из центра "окна" в точку нажатия левой кнопкой мыши. Никак не могу понять как работает 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 вне форума Ответить с цитированием
Ответ


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

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

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


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