Home Статьи Программирование МК Рисование линий на ассемблере

Рисование линий на ассемблере

E-mail Печать PDF

В основу примера на ассемблере был взят рабочий пример реализации алгоритма Брезенхема прорисовки линии, написанный на языке Pascal. Код процедуры, написанный на языке паскаль, был переведен на язык Assembler, в результате чего получилась рабочая процедура для прорисовки линии на экран.


 

Исходный код процедуры на языке Паскаль:

Procedure TForm1.Line(x1,y1,x2,y2:integer);

var dx,dy,i,sx,sy,check,e,x,y:integer;

begin

dx:=abs(x1-x2);

dy:=abs(y1-y2);

sx:=Sign(x2-x1);

sy:=Sign(y2-y1);

x:=x1;

y:=y1;

check:=0;

if dy>dx then begin

dx:=dx+dy;

dy:=dx-dy;

dx:=dx-dy;

check:=1;

end;

e:= 2*dy - dx;

for i:=1 to dx do begin

image1.Canvas.Pixels[x,y]:=clBlack;

if e>=0 then begin

if check=1 then x:=x+sx else y:=y+sy;

e:=e-2*dx;

end;

if check=1 then y:=y+sy else x:=x+sx;

e:=e+2*dy;

end;

end;

Исходный код процедур на языке Ассемблер:

 

;----------------------------------------------

; sign sign return method

;---------------------------------------------

; Ввод:

; переменная аргумент в ax

; Вывод:

; ax = -1 | 1

; Регистры:

; ax

;---------------------------------------------

PROC sign

shl ax,1

jc negat

mov ax, 1

ret

negat:

mov ax, -1

ret

ENDP sign

 

;--------------------------------------------

; abs absolute value return method

;--------------------------------------------

; Ввод:

; переменная аргумент в ax

; Вывод:

; ax = abs(переменная y)

; Регистры:

; ax

;--------------------------------------------

PROC absolute

cmp ax,0

jnl aboveeq

neg ax

aboveeq:

ret

ENDP absolute

;-------------------------------------------

; line line drawing method

;-------------------------------------------

; Ввод:

; Координаты x1,y1,x2,y2 в

; регистрах ax,bx,cx,dx соответственно

; Вывод:

;

; Регистры:

;

;------------------------------------------

PROC line

jmp beg

x1 dw ?

x2 dw ?

y1 dw ?

y2 dw ?

_dx dw ?

_dy dw ?

i dw 0

sx dw ?

sy dw ?

check dw ?

e dw ?

x dw ?

y dw ?

beg:

mov [x1],ax

mov [y1],bx

mov [x2],cx

mov [y2],dx

mov ax, [x1] ;dx:=abs(x1-x2);

sub ax, [x2]

call absolute

mov [_dx], ax

mov ax, [y1] ;dy:=abs(y1-y2);

sub ax, [y2]

call absolute

mov [_dy], ax

mov ax, [x2] ;sx:=Sign(x2-x1);

sub ax, [x1]

call sign

mov [sx], ax

mov ax, [y2] ;sy:=Sign(y2-y1);

sub ax, [y1]

call sign

mov [sy], ax

push [x1] ;x:=x1;

pop [x]

push [y1] ;y:=y1;

pop [y]

push 0 ;check:=0;

pop [check]

mov ax,[_dy] ;if dy>dx then begin

cmp ax,[_dx]

jle next

mov ax, [_dy] ;dx:=dx+dy;

add [_dx],ax

mov ax, [_dx] ;dy:=dx-dy;

neg [_dy]

add [_dy],ax

mov ax, [_dy] ;dx:=dx-dy;

sub [_dx],ax

mov [check],1 ;check:=1;

next: ;end;

push [_dy] ;e:= 2*dy - dx;

pop [e]

sal [e],1

mov ax, [_dx]

sub [e], ax

mov cx,[_dx] ;for i:=1 to dx do begin

for:

mov al,2 ;image1.Canvas.Pixels[x,y]:=clBlack;

mov ah,0Ch

mov bh,0

push cx

mov cx, [x]

mov dx, [y]

int 10h

pop cx

cmp [e],0 ;if e>=0 then begin

jl next1

cmp [check],1 ;if check=1 then

jne _else

mov ax, [sx] ;x:=x+sx

add [x], ax

jmp next2

_else: ;else

mov ax, [sy] ;y:=y+sy;

add [y], ax

next2: ;endif

mov ax,[_dx] ;e:=e-2*dx;

sal ax,1

sub [e], ax

next1: ;end;

cmp [check],1 ;if check=1 then

jne _else1

mov ax, [sy] ;y:=y+sy

add [y], ax

jmp next3

_else1: ;else

mov ax, [sx] ;x:=x+sx;

add [x], ax

next3: ;endif

mov ax,[_dy] ;e:=e+2*dy;

sal ax,1

add [e], ax

loop for ;end;

endline:

ret

ENDP line

Для прорисовки линии достаточно вызвать процедуру line, указав в соответствующих регистрах координаты точек линии:

mov ax,0

mov bx,0

mov cx,20

mov dx,30

call line

 

Обновлено 02.05.2010 20:27  

Комментарии  

 
+1 #1 RE: Рисование линий на ассемблере 25.05.2010 18:03
Дякую!!!
Цитировать
 
 
0 #2 RE: Рисование линий на ассемблере 26.05.2010 10:52
Будь-ласка!!
Цитировать
 
 
+3 #3 RE: Рисование линий на ассемблере 02.06.2010 13:51
Каким компилятором компилить это дело? TASM отказывается, вываливая кучу ошибок
Цитировать
 
 
0 #4 Рисование линий на ассемблере 02.06.2010 16:48
Компилится тасмом без ошибок, тасм, на котором компилится данный пример можно скачать по ссылке:
http://homorobot.net/index.php?option=com_content&view=article&id=84:2010-03-15-18-14-25&catid=45:2010-02-05-23-24-12&Itemid=68
Цитировать
 
 
+1 #5 RE: Рисование линий на ассемблере 30.09.2010 18:27
ссылка уже не работает(
Цитировать
 
 
+1 #6 RE: Рисование линий на ассемблере 30.09.2010 21:02
Уже работает)
Цитировать
 
 
0 #7 Рухоме зображення 29.03.2011 10:14
Як на Assembler задати рух стріли по тангенсу? Поможіть будь-ласка!
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Файловый сейф

Вы можете делиться файлами с друзьями. Загрузите файл и получите ссылку для его скачивания.

Выберите файл:

Облако тегов




Powered by Dapmoed