FPU Befehle. Mein erster Versuch schlägt fehl.
-
Ich lerne seit etwa 2 Wochen assembler, bin also noch sehr unerfahren. Als compiler benutze ich NASM 0.98. Mein eigentliches Ziel ist es so richtig geile demos mit assembler zu basteln. Ich wollte die FPU befehle benutzen um ein bisserl zu malen, der source code sieht so aus:
org 100h ;Ich verwende NASM 0.98 als compiler. ;Mein einziges Hilfsmittel war die NASM docu, deshalb klappts wohl nicht so ganz. ;Eigentlich sollte dieses prog, unter Benutzung der FPU, eine diagonale, bunte Linie ueber den ;Bildschirm malen. Rein logisch gedaxht haette eine Diagonale von der oberen linken Ecke quer ;ueber den Bildschirm verlaufen muessen (naja an den Enden wuerde warscheinlich wieder auf der ;anderen Seite angefangen) allerdingst passiert etwas sehr seltsames: die punkte werden fast ;elipsenfoermig auf angeordnet. mov ax, 13h int 10h ;Modus wechseln. push word 0A000h pop es ;VGA Speicher coords: inc word [XCD] ;x-Koordinate erhoehen inc word [YCD] ;y-Koordinate erhoehen adc al, 1 ;Farbe (AL = AL + 1 + CF) fninit ;setzt die FPU flags auf "leer" ;so stelle ich mir den Inhalt des FPU stacks vor: fld dword [YFAC] ;320 fld dword [XCD] ;x 320 fld dword [YCD] ;y x 320 fmul st2 ;320*y x fadd st1 ;320*y+x fist word [fs:bx] ;[FS:BX] = 320*y+x ;(ich hab anstelle FS:0, FS:BX genommen, weil das schneller ist, sollte aber ;nichts am Problem aendern) mov di, word [fs:bx] ;DI = 320*y+x stosb ;Punkt setzen. jmp coords ;Zurueck zum Anfang. YFAC dw 320 ;eine Zeile ist 320 pixel breit YCD dw 0 XCD dw 0
Tja warscheinlich hab ich das noch nicht ganz durchschaut und deshalb falsche Befehle an falschen Stellen benutzt.
Ihr könnt das ja mal Kompilieren und sehen was passiert.
Eigentlich sollte eine schräge Linie entstehen.Das Semikolon in [fs:bx] ([fs:;bx]) sollte dort nicht sein, das wurde vom forum hinzugefügt.
-
hi,
hab deinen code nicht ausprobiert, jedoch ein paar fehler beim durchgucken gefunden. denn wenn du integer mit der FPU laden willst, dann musst du auch den befehl FILD benutzen. dabei musst du auch ein word und nicht dword laden, wenn deine integer nur worte sind.
guck dir auch solche befehle wie FIMUL mal an. dann brauchst du nicht die zahlen vorher in die register zu laden. FIMUL WORD [Y] würde z.b st0 mit Y multiplizieren. FIADD WORD X würde X zu st0 addieren.
-
vielleicht hilft dir das hier weiter...