Winkelberechnung im Koordinatensystem für Kreisdrehung



  • Gibt es eigentlich einen bestimmten Gund, wieso du das unbedingt mit Assembler machen willst?



  • masm schrieb:

    Mein Freund Olly hat mit im Übrigen verraten, das du dich nicht an die WinABI hältst - dies ist der Grund warum es nicht richtig funktioniert (win7, x64). EBX, ESI und EDI müssen in callbacks vor Veränderung geschützt werden: sehr einfach geht das mit der USES-Direktive:

    WndProc proc uses ebx edi esi hWnd:HWND,...

    Alle FPU Anweisungen liegen in einer Prozedur (PROC). Vor dem Aufruf sichere
    ich alle Register mit pushad und danach hole ich alle mit popad zurück...

    Das Programm von mir funktioniert tadellos... es ist nur nicht gerade optimal 😉

    Gruß, Nicky



  • dot schrieb:

    Gibt es eigentlich einen bestimmten Gund, wieso du das unbedingt mit Assembler machen willst?

    Hallo dot,

    ja den gibt es... ich möchte das ganze auch für die (S)VGA Programmierung nutzen.
    Dies kann ich damit 1:1 umsetzen...

    Gruß, Nicky



  • Oh, d.h. du programmierst unter DOS oder gar an einem eigenen Betriebssystem?



  • dot schrieb:

    Oh, d.h. du programmierst unter DOS oder gar an einem eigenen Betriebssystem?

    Kein eigenes OS :p

    Unter DOS wenn ich auf die VGA Karte zugreifen möchte...

    Gruß, Nicky



  • Wie was? VGA?
    http://www.brackeen.com/vga/
    :p



  • dot schrieb:

    supernicky schrieb:

    Das er mir den Punkt an x=200 und y=200 einen Grad weiter bewegt...

    Dann mach es so wie von mir verlinked:

    \begin{align} x_{neu} &= x_{alt} \cdot \cos(1°) - y_{alt} \cdot \sin(1°) \\ y_{neu} &= x_{alt} \cdot \sin(1°) + y_{alt} \cdot \cos(1°) \end{align}

    Wobei du den Rotationsmittelpunkt zuerst von x und y abziehen, dann rotieren und dann wieder draufaddieren musst...

    Hallo dot,

    es klappt... habe nun die ganze Zeit daran gesessen die Formel auf die FPU umzuschreiben..

    sin1 habe ich vorberechnet = 0,017 und cos1 = 0,99
    Das Ergebnis von x musste ich einmal zwischenspeichern in tmpx, da der Originalwert
    ja noch gebraucht wird für die Berechnung von Y.

    fninit
        		fnclex
    
        		fld x
        		fsub mm_x
        		fstp x
    
        		fld y
        		fsub mm_y
        		fstp y
    
        		fld x
        		fld cos1
        		fmul
        		fld y
        		fld sin1
        		fmul
        		fsub
        		fadd mm_x
        		fstp tmpx
    
        		fld sin1
        		fld x
        		fmul
        		fld cos1
        		fld y
        		fmul
        		fadd
        		fadd mm_y
        		fstp y
    
        		fld tmpx
        		fstp x
    		fwait
    

    Danke schön 👍

    Nicky



  • freut mich 🙂



  • CJosef schrieb:

    Wie was? VGA?
    http://www.brackeen.com/vga/
    :p

    Jawohl, (S)VGA.. Habe zwei gute Bücher dazu 😃



  • Kleine Optimierung:

    fld x
    fld cos1
    fmul

    vorausgesetzt es wird mit REAL4/8 gearbeitet:

    fdl x
    fmul cos1
    

    Außerdem: [F]WAIT macht nur Sinn, wenn man unmaskierte Excpetions behandelt, was du aber durch das FINIT ausschließt. FNCLEX nach FINIT ist nutzlos.

    BTW: deine WndProc@WM_KEYDOWN ändert ESI, EDI und EBX, sichert dies aber nicht.



  • Guten Morgen masm,

    ja, ich arbeite nur mit REAL Zahlen (DWORD).
    In meinen beiden Referenzen steht nur das bei FWAIT die CPU auf die FPU wartet,
    mehr nicht...

    In der WindowProc werden die Zeiger ESI und EDI erst mit den Werten geladen.

    Zu den anderen Sachen komme ich noch im Forum für Assembler...
    Wo ich dich schonmal vorwarnen kann:
    In den beiden Referenzen sind erfreulicher Weise auch alle FPU Befehle und ihre
    Operanden aufgeführt. Es wird ausdrücklich darauf hingewiesen das ein Operand
    nur ein FPU Register oder eine Speicherstelle sein kann...

    Ein Hinweis das folgendes auch geht ist nirgends zu finden 😞

    dd x 2.5
    dd y 4.0
    
    mov ebx, offset x
    fld dword ptr [ebx]
    fmul y
    fistp dword ptr [ebx]
    

    Somit bin ich immer den Umweg über eine temporäre Speicherstelle gegangen,
    was natürlich nicht nötig ist.

    Wie schon gesagt, der Rest dann im Assembler Bereich...

    Eine angenehme Nacht noch...

    Nicky



  • hi,

    supernicky schrieb:

    ja, ich arbeite nur mit REAL Zahlen (DWORD).

    das sieht widersprüchlich aus: REAL meine ein Gleitkommawert, DWORD ist ein vorzeichenloser Ganszahltyp - vorzeichenlose Datentypen werden von der FPU grundsätzlich nicht Unterstützt. Um es deutlich zu machen, hier mal eine Auflistung welche Datentypen die FPU kennt: REAL4 (float), REAL8 (double), REAL10 (long double), SWORD (short), SDWORD (long), SQWORD (long long == int64).

    REAL10 und SQWORD könne nur mit F[i]LD und FSTP geladen und geschrieben werden. Alle andern Typen könne weitaus flexibler als Speicheroperanden benutz werden.

    supernicky schrieb:

    In meinen beiden Referenzen steht nur das bei FWAIT die CPU auf die FPU wartet,
    mehr nicht...

    Hoffnungslos veraltet Informationen: vor 20+ Jahren war die FPU ein externer IC - dieser Befehl hat FPU und CPU synchronisiert. Auf modernen Systemen hat der Befehl laut AMD und Intel nur noch eine Bedeutung für Systemcode, der FPU Exceptions mittels Interupt behandelt. Für ring3 Anwendungen sollte es überhaupt keine Konsequenzen haben, wenn man diesen Befehl weglässt. Zudem ist es die bevorzugte Art, sich das Ergebnis von FPU Berechnungen anzusehen um einen Fehler zu detektieren: NaN & co.

    supernicky schrieb:

    In der WindowProc werden die Zeiger ESI und EDI erst mit den Werten geladen.

    Es geht darum das du diese Register bei eintritt, bzw. vor der Benutzung, sichern musst, und beim Verlassen des WndProc (oder jeder andern API-callback) wieder herstellen musst - das machst du nicht.

    supernicky schrieb:

    Zu den anderen Sachen komme ich noch im Forum für Assembler...
    Wo ich dich schonmal vorwarnen kann:
    In den beiden Referenzen sind erfreulicher Weise auch alle FPU Befehle und ihre
    Operanden aufgeführt. Es wird ausdrücklich darauf hingewiesen das ein Operand
    nur ein FPU Register oder eine Speicherstelle sein kann...

    Du solltest dir angewöhne in der Primärliteratur zu lesen: AMD64 Architecture Programmer's Manual Volume 5: 64-Bit Media and x87 Floating-Point Instructions


Anmelden zum Antworten