PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linie zeichnen mit Assembler


hadez16
2007-04-16, 18:48:29
Hallo,

unser Lehrer in der Schule meinte heute, wer es selbsständig hinnkriegt in Assembler eine Linie auf den Bildschirm zu zeichnen, kriegt ne mündliche 1 eingetragen.

Da ich eigentlich sehr ambitioniert der programmierung gegenüberstehe, möchte ich das probieren.

Ich kenne mich nur mit höheren Programmiersprachen wie C++ etwas aus, über die Architektur von PCs bzw. dem groben Funktionsschema von Assembler-Sprache bin ich leicht informiert und denke dass ich das schnell lernen kann.

Kann mir jemand sagen, ohne extra ein Buch zu kaufen, wo ich am besten Informationen herbekomme um Grafiken in Assembler zu basteln? Habe mich schon ein wenig informiert über Grafikmodus etc. aber so eine Art Leitfaden fehlt mir noch.

Benutzen würde ich dann den NASM-Compiler.

1 Woche habe ich Zeit ;)

Grüße

Gast
2007-04-16, 19:08:48
nur eine linie ... ohne bewegung?


das wird als DOS_Programm ein 3 Zeiler mit

....
....
"int 21h"

wenn mich nicht alles täuscht.

Wenn er nichts gg C++ mit inline Assembler hat, kannst du auch sowas wie hier probiern.


int main(void)
{
char bla;
_asm
{
mov hx, [bla]
...
}

return 0;
} //würde unter VC05 compelliern

Trap
2007-04-16, 19:09:49
Das geht mit oder ohne Betriebssystem. Weißt du was gemeint ist?

DOS wäre noch eine dritte Kategorie ;)

Gast
2007-04-16, 19:24:44
Das geht mit oder ohne Betriebssystem. Weißt du was gemeint ist?

DOS wäre noch eine dritte Kategorie ;)

Naja ohne Betriebssystem kann man das keinem antun. Erstmal schoen selber nen CGA-Treiber bäh! Das ist in C++ schon hässlich! Vorallem da man ja niks zum Debuggen hat. Alle Ausgaben sind doch tot ohne die richtigen Treiber.


OnT: DOS ist sicherlich der simpleste Weg ne linie zu zeichnen. Für Schönheit gibs eh keine Zusatzpunkte.

Gast
2007-04-16, 19:51:43
Also ich hab jetzt nochmal nachgeschaut, das ist orginal nen 3 Zeiler, ich habs noch als Konsolenausgabe und als CGA Ausgabe (etwas komplexer).
Wenn du fertig bist, können wir ja mal vergleichen. :ucoffee:

Neomi
2007-04-16, 22:57:23
Wenn es um das "zeichnen" der Linie in Assembler geht, dann würde ich als Lehrer das "zeichnen lassen" per simplem Aufruf aus Assembler heraus schon als Fudelei betrachten. Also lieber per Hand, eine Woche ist auch dafür mehr als großzügig angelegt und lernen willst du ja auch was dabei.

Als Grafikmodus ist Mode 13h geeignet, da sehr simpel. Hier ist eine kurze Anleitung zur Initialisierung:
http://burks.brighton.ac.uk/burks/language/asm/asmtut/asm8.htm#mode13

Um die Linie zu zeichnen, ist der gute alte Bresenham anzuraten. Hier eine Anleitung dazu:
http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

Die einzelnen Pixel lassen sich dann immer noch bequem per BIOS-Funktion zeichnen. Wie das geht, ist auch hinter dem ersten Link beschrieben.

micki
2007-04-17, 00:29:00
ich wuerde an deiner stelle einfach den inlineassembler vom z.b. devstudio benutzen, dann ne linie in nen buffer zeichnen und mit ogl/d3d auf den screen blitten.

Coda
2007-04-17, 00:32:51
Sollte er mal genauer spezifizieren. Um direkt auf den Bildschirm zu zeichnen brauchst unter Windows eigentlich DirectDraw.

Ansonsten bleibt nur DOS übrig eigentlich.

hadez16
2007-04-17, 07:34:49
Wenn es um das "zeichnen" der Linie in Assembler geht, dann würde ich als Lehrer das "zeichnen lassen" per simplem Aufruf aus Assembler heraus schon als Fudelei betrachten. Also lieber per Hand, eine Woche ist auch dafür mehr als großzügig angelegt und lernen willst du ja auch was dabei.

Als Grafikmodus ist Mode 13h geeignet, da sehr simpel. Hier ist eine kurze Anleitung zur Initialisierung:
http://burks.brighton.ac.uk/burks/language/asm/asmtut/asm8.htm#mode13

Um die Linie zu zeichnen, ist der gute alte Bresenham anzuraten. Hier eine Anleitung dazu:
http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

Die einzelnen Pixel lassen sich dann immer noch bequem per BIOS-Funktion zeichnen. Wie das geht, ist auch hinter dem ersten Link beschrieben.

ja so ist das schon eher gemeint...ich werd mich versuchen einzulesen dort, danke schonmal

noch jemand links zu solchen dokumentationen?

@ oben

wie sollen die 3 Zeilen denn aussehen?

KhanRKerensky
2007-04-17, 09:28:17
mov ax, 092dh
int 10h

Das ist zudem auch ein BIOS Interrupt. Da brauchts dann noch nicht mal DOS. Ein Kreis ist auch nicht viel schwerer. SCNR

Arokh
2007-04-17, 12:24:37
mov ax, 092dh
int 10hmüßte da nicht an irgendeiner Stelle stehen, zwischen welchen Pixeln die Linie verlaufen soll?

Thomas(:
2007-04-17, 14:42:51
unser Lehrer in der Schule meinte heute, wer es selbsständig hinnkriegt in Assembler eine Linie auf den Bildschirm zu zeichnen, kriegt ne mündliche 1 eingetragen.

Schon verloren.

hadez16
2007-04-17, 15:00:46
ich habs jetzt mit einzelnen Pixeln gemacht, das muss dem Lehrer reichen ;)

hab gleich den Namen unsrer Klasse genommen...


mov ax,13
int 10h

mov ah,0Ch
mov al,7
mov cx,50
mov dx,100
int 10h



mov ebx,40

Schleife:
dec dx
int 10h
dec ebx
cmp ebx,0
jne Schleife

mov cx,90
mov dx,100

mov ebx,40

Schleife2:
dec dx
int 10h
dec ebx
cmp ebx,0
jne Schleife2


mov cx,103
mov dx,60

mov ebx,26

Schleife3:
dec cx
int 10h
dec ebx
cmp ebx,0
jne Schleife3


mov cx,150
mov dx,100
mov ebx,40

Schleife4:
dec dx
int 10h
dec ebx
cmp ebx,0
jne Schleife4

mov cx,150
mov dx,60
mov ebx,30

Schleife5:
inc cx
int 10h
dec ebx
cmp ebx,0
jne Schleife5

mov cx,180
mov dx,60
mov ebx,40

Schleife6:
inc dx
int 10h
dec ebx
cmp ebx,0
jne Schleife6


mov cx,180
mov dx,100
mov ebx,30

Schleife7:
dec cx
int 10h
dec ebx
cmp ebx,0
jne Schleife7

mov cx,200
mov dx,60
mov ebx,25

Schleife8:
inc cx
int 10h
dec ebx
cmp ebx,0
jne Schleife8

mov cx,201
mov dx,60
mov ebx,40

Schleife9:
inc dx
int 10h
dec ebx
cmp ebx,0
jne Schleife9

mov cx,201
mov dx,100
mov ebx,25

Schleife10:
inc cx
int 10h
dec ebx
cmp ebx,0
jne Schleife10

mov cx,226
mov dx,100
mov ebx,20

Schleife11:
dec dx
int 10h
dec ebx
cmp ebx,0
jne Schleife11

mov cx,226
mov dx,80
mov ebx,25

Schleife12:
dec cx
int 10h
dec ebx
cmp ebx,0
jne Schleife12

mov cx,250
mov dx,100
mov bl,13

Schleife13:
dec dx
inc cx
int 10h
dec dx
int 10h
dec dx
int 10h
dec ebx
cmp bl,0
jne Schleife13


mov cx,275
mov dx,100
mov bl,13

Schleife14:
dec dx
dec cx
int 10h
dec dx
int 10h
dec dx
int 10h
dec ebx
cmp bl,0
jne Schleife14

mov cx,270
mov dx,85
mov bl,14

Schleife15:
dec cx
int 10h
dec ebx
cmp bl,0
jne Schleife15


mov ah,0
int 16h

mov ax,3
int 10h

mov ax,4C00h
int 21h


kompiliert mit NASM

TheGamer
2007-04-17, 15:32:00
ich habs jetzt mit einzelnen Pixeln gemacht, das muss dem Lehrer reichen ;)

hab gleich den Namen unsrer Klasse genommen...



Wundersame Klassennamen :D

IT 06A

hadez16
2007-04-17, 15:38:35
ich habe noch meine Probleme den Bresenham-Algorithmus in Assembler zu realisieren

TheGamer
2007-04-17, 15:48:37
Schon verloren.

Hat er ja gemacht.

Lern du mal finnisch aber bitte selbstständig.

Ohne irgendeine Hilfe wirst du da scheitern. Meinst du Leute die Englischbücher lesen, lassen sich die Sprache beibringe oder bringen es sich selbst bei.

hadez16
2007-04-17, 17:48:58
Wundersame Klassennamen :D

IT 06A

IT = IT/EDV/Fachinformatik

06 = "Einschulungsjahr"

A = Klassenteil.....aufgeteilt in A und B

:D

KhanRKerensky
2007-04-18, 20:41:10
müßte da nicht an irgendeiner Stelle stehen, zwischen welchen Pixeln die Linie verlaufen soll?

Es erscheint ein "-" an der aktuellen (schätz ich zumindest) Cursorposition. Die Linie ist gezeichnet und damit die Aufgabe erfüllt. Bei einer so ungenauen Aufgabenstellung...

Arokh
2007-04-19, 16:42:11
Es erscheint ein "-" an der aktuellen (schätz ich zumindest) Cursorposition. Die Linie ist gezeichnet und damit die Aufgabe erfüllt. LOOOOOOOOOOOOOOOL ;D
Erinnert mich an einen Anekdote von Charles Petzold aus seinem Win32-Handbuch, wie er im Jahr 1985 in einem Wettbewerb den 2. Platz (nach Bill Gates) erreicht hat, indem er die Aufgabe, kleine und große Kreise zu malen, mit kleinen und großen o's realisiert hat.

Als TheGamer's hadez16's Lehrer würde ich so eine Lösung nicht akzeptieren, mit der Begründung, daß nach dem heutigen Stand der Computergrafik - im Jahr 1985 mag das noch anders gewesen sein - die Aufgabenstellung, eine Linie auf dem Bildschirm zu zeichnen, eindeutig genug als Forderung nach einer grafischen, pixelorientierten Lösung zu verstehen ist.

BTW: wo in TheGamer'c hadez16's Code steht denn IT 06A?

TheGamer
2007-04-20, 13:22:42
LOOOOOOOOOOOOOOOL ;D
Erinnert mich an einen Anekdote von Charles Petzold aus seinem Win32-Handbuch, wie er im Jahr 1985 in einem Wettbewerb den 2. Platz (nach Bill Gates) erreicht hat, indem er die Aufgabe, kleine und große Kreise zu malen, mit kleinen und großen o's realisiert hat.

Als TheGamer's Lehrer würde ich so eine Lösung nicht akzeptieren, mit der Begründung, daß nach dem heutigen Stand der Computergrafik - im Jahr 1985 mag das noch anders gewesen sein - die Aufgabenstellung, eine Linie auf dem Bildschirm zu zeichnen, eindeutig genug als Forderung nach einer grafischen, pixelorientierten Lösung zu verstehen ist.

BTW: wo in TheGamer'c Code steht denn IT 06A?

Ich hab doch gar kein Code ;)

Das ist der andere User, nicht ich. Mir sagt schon lange kein Lehrer was ich zu tun habe und was nicht ;)

EDIT: Hab den Code lediglich kompiliert um mir anzuschauen was es ausspuckt. Hadez16 hat die Aufgabe von seinem Lehrer bekommen nicht ich. Ich würde die LÖsung auch nicht akzeptieren.

hadez16
2007-04-20, 16:31:02
Ich hab doch gar kein Code ;)

Das ist der andere User, nicht ich. Mir sagt schon lange kein Lehrer was ich zu tun habe und was nicht ;)

EDIT: Hab den Code lediglich kompiliert um mir anzuschauen was es ausspuckt. Hadez16 hat die Aufgabe von seinem Lehrer bekommen nicht ich. Ich würde die LÖsung auch nicht akzeptieren.

welche lösung nicht akzeptieren? Mein IT06A?

oder die sache mit dem "-" (Strich)?

rotalever
2007-04-20, 17:50:30
Wenn man z.B. einen Algorithmus nicht in assembler schreiben kann, kann man es doch einfach in C machen und dann im Compiler den Assemblercode abgreifen. Ein paar edits, und die Sache ist fertig... Sollte man natürlich nicht machen, wenn es einen wirklichen Grund hat (Optimierungen), dass man Assembler benutzt, aber auch hier sollte man aufpassen, da Compiler oft besser optimieren, als wenn man das ganze in Assembler schreibt, außer natürlich man bringt die entsprechende Erfahrung mit.

Arokh
2007-04-20, 18:07:23
Wenn man z.B. einen Algorithmus nicht in assembler schreiben kann, kann man es doch einfach in C machen und dann im Compiler den Assemblercode abgreifen. das Problem werden wohl die Grafikroutinen sein. Unter C greift man dafür i.d.R. auf Bibliotheksfunktionen zurück, sei es Win32, SDL, OpenGL oder sonst was. Die Disassemblierung enthält dann natürlich nur Calls dieser Funktionen.

Malabolge
2007-04-20, 18:30:52
ich wuerde an deiner stelle einfach den inlineassembler vom z.b. devstudio benutzen, dann ne linie in nen buffer zeichnen und mit ogl/d3d auf den screen blitten.

Sicher , das ganze aber vorher noch von Truecolor auf 8 bit konvertieren und mit HDR rendern ! , gelle ;) ;)


Oder ganz einfach :
Zwar PASCAL syntax aber man wirds begreifen :



procedure setmode(wert:word); assembler;
asm
mov ax,wert (13 = 320*200)
int 10h
end;

procedure putpixel(x,y:integer; col:byte;wohin:word); assembler;
asm
mov ax,wohin
mov es,ax
mov bx,x
mov cx,y
mov di,cx
shl cx,8
shl di,6
add di,cx
add di,bx (y*200 schneller als mul)
mov al,col
stosb
end;

(hint1: Das stosb für horinzontale Linien Loopen !) Er hat nie gesagt in welche richtung die Linien gehen sollen !!
(hint2: bei mode 13 wohin =&HA000 )



Procedure Hline(x,x1,y2:integer; col:byte; wohin:word);
begin
mx:=abs(x1-x);
asm
mov ax,wohin
mov es,ax
mov bx,x
mov cx,y2
xor di,di
mov di,cx
shl cx,8
shl di,6
add di,cx
add di,bx
mov al,col
mov cx,mx
rep stosb
end;
end;

Procedure Vline(x,y,y1:integer; Col:byte; wohin:word);
begin
my:=abs(y1-y);
asm
mov ax,wohin
mov es,ax
mov bx,x
mov cx,y2
xor di,di
mov di,cx
shl cx,8
shl di,6
add di,cx
add di,bx
mov al,col
mov cx,my
@lop1: mov [es:di],al
add di,320
dec cx
jne @lop1
end;
end;



Habe mir erlaubt das ganze auch mal für horizontale und vertikale Linien anzufügen