Я взялся переделывать алгоритмы, находящиеся на сайте faceH0r, написанные на С++, на ассемблер. Вопросы и всякие
реплики можете спокойно посылать на jnz@yandex.ru. Будьте уверены, без ответа не останетесь.
В данном коде есть условные переходы, обращающеиеся на метки @F или @B. @F(Forward) означает, что обращение
происходит к ближайшей метке @@ после вызова, а @B(Back) - к ближайшей @@ до вызова.
Вывод точки на экран
DrawPixel proc x,y,color:dword
mov eax,[y]
mov edx,[p_Buffer]
imul eax,[scr_Width]
add eax,[x]
mov ecx,[color]
mov [edx+eax*4],ecx
ret
DrawPixel endp
|
Рисование горизонтальной линии
DrawHorLine proc x1,x2,y,color:dword
mov eax,[y]
mov edx,[p_Buffer]
mov ecx,[x2]
mov ebx,[x1]
imul eax,[scr_Width]
add eax,ebx
sub ecx,ebx
jns @F
neg ecx
std
@@:
inc ecx
lea edi,[edx+eax*4]
mov eax,[color]
rep stosd
cld
ret
DrawHorLine endp
|
Рисование вертикальной линии
DrawVerLine proc y1,y2,x,color:dword
mov ebx,[scr_Width]
mov edx,[p_Buffer]
mov eax,[y1]
imul eax,ebx
shl ebx,2
mov ecx,[y2]
sub ecx,[y1]
jns @F
neg ecx
neg ebx
@@:
inc ecx
add eax,[x]
shl eax,2
add edx,eax
mov eax,[color]
@@:
mov [edx],eax
add edx,ebx
dec ecx
jnz @B
ret
DrawVerLine endp
|
Рисование залитого прямоугольника
DrawFillRect proc x1,y1,x2,y2,color:dword
mov ebx,[scr_Width]
mov ecx,[y2]
mov edx,[y1]
mov eax,ecx
sub eax,edx
jns @F
neg eax
xchg ecx,edx
@@:
inc eax
push eax
mov eax,edx
imul eax,ebx
mov ecx,[x2]
mov edx,[x1]
mov edi,ecx
sub edi,edx
jns @F
neg edi
xchg ecx,edx
@@:
inc edi
mov esi,edi
sub ebx,edi
shl ebx,2
add eax,edx
mov edx,[p_Buffer]
lea edi,[edx+eax*4]
mov eax,[color]
pop edx
@@:
mov ecx,esi
rep stosd
add edi,ebx
dec edx
jnz @B
ret
DrawFillRect endp
|
Если в этом коде существуют непонятные вам обозначения, либо возникли другие проблемы, связанные с кодом, то
необходимо прочитать оригинальную статью Основы графики.
|