ankhmorpork
Goto Top

Assembler-Routine portieren: x86 auf x64

Hallo in die Runde,

ich habe eine Verständnisfrage. Habe folgende Assembler-Routine erstellt:
   ASM
                   {x:=SQR(x)-SQR(y)+r:}
                   FLD x            {x laden}
                   FST xalt         {entspr. x:=xalt}
                   FMUL ST,ST       {SQR(x) bilden}
                   FLD y            {y laden}
                   FMUL ST,ST       {SQR(y) bilden}
                   FSUBP ST(1),ST   {SQR(x)-SQR(y) bilden, Stack poppen}
                   FLD r            {r laden}
                   FADDP ST(1),ST   {SQR(x)-SQR(y)+r bilden, Stack poppen}
                   FSTP x           {x speichern}

                   //y:=2*xalt*y+i:
                   FLD Mult          {Mult laden}
                   FLD y             {y laden}
                   FLD xalt          {xalt laden}
                   FMULP ST(2),ST    {Mult*xalt bilden, Stack poppen}
                   FMULP ST(1),ST    {Mult*xalt*y bilden, Stack poppen}
                   FLD i             {i laden}
                   FADDP ST(1),ST    {Mult*y*xalt+i bilden, Stack poppen}
                   FSTP y            {y speichern}

                   INC v            {entspr. dem Pascal-Befehl INC(v) }
                   FLD x             {x laden}
                   FMUL ST,ST        {SQR(x) bilden}
                   FLD y             {y laden}
                   FMUL ST,ST        {SQR(y) bilden}
                   MOV AL,IsBMode    {IsBMode in AL laden}
                   OR AL,AL          {ODER-Verknüfung mit sich selbst, verändert den Wert nicht, setzt aber Flags!}
                   {Die beiden letzten Zeilen stellen einen logischen Vergleich folgender Art dar:}
                   {MOV AL,1 --> entspr. TRUE}
                   {TEST IsBMode,AL}
                   {Die ODER-Verknüfung ist jedoch schneller und benötigt weniger Code!}
                   JNZ  @SetBMode    {bedingter Sprung: "Jump if no zero flag set", d.h. wenn IsBMode=TRUE, d.h.: 1 UND 1 = 1 in TEST}  
                   FADDP ST(1),ST    {SQR(x)+SQR(y) bilden, Stack poppen}
                   JMP @StoreLimit   {unbedingter Sprung, überspringen der nächsten Zeile}
                   @SetBMode:
                   FMULP ST(1),ST  {SQR(x)*SQR(y) bilden, Stack poppen}
                   @StoreLimit:
                   FSTP Limit      {ST(0) in Limit speichern, Stack poppen}

                END;

Programmier-Umgebung:
Lazarus-Pascal 1.2.4. mit fpc 2.6.4

Ist Teil einer Iterationsschleife zur Berechnung der Mandelbrot-Menge. Das habe ich auf einem 32-bit Windows 7 laufen und das funkt. klasse.

Ich möchte das Ganze nun auf ein 64-bit Windows 7 System bringen.

Frage: Macht es Sinn, das Modul entspr. anzupassen? Und wenn ja, was müsste ich ändern?
In Sachen Assembler bin ich leider absolute Niete - für das Ding hier habe ich Wochen gebraucht ...

Gruß

ANKH

Content-ID: 246696

Url: https://administrator.de/contentid/246696

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

Lochkartenstanzer
Lösung Lochkartenstanzer 17.08.2014 aktualisiert um 15:23:13 Uhr
Goto Top
Moin,

Warum meinst Du, daß es nötig wäre da etwas anzupassen?

x86-Maschinencode its ein Subset der 64-Bit-prozessoren. Du mußt die x64-erweiterungen nicht nutzen, außer Du benötigst entsprechend große Datenstrukturen oder Adressraum.

hast Du es einfach mal probiert, ob das so auch in Deinem 64-bit-Windows funktioniert? Oder willst Du "doppelt genau" rechnen?

lks
AnkhMorpork
AnkhMorpork 17.08.2014 um 13:37:34 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

Moin,

Warum meinst Du, daß es nötig wäre da etwas anzupassen?

x86-Maschinencode its ein Subset der 64-Bit-prozessoren. Du mußt die x64-erweiterungen nicht nutzen, außer Du
benötigst entsprechend große Datenstrukturen oder Adressraum.

hast Du es einfach mal probiert, ob das so auch in Deinem 64-bit-Windows funktioniert? Oder willst Du "doppelt genau"
rechnen?

lks

Hallo lks,

danke für die Reaktion.

Das ist nur eine Frage zum Verständnis. Ich möchte begreifen, was ich da mache. Eben, ob eine Anpassung notwendig/sinnvoll ist. Dass x86 Subset von x64 ist, war mir klar. Andersherum wärs nicht machbar ...

Das läuft optimal unter 64-bit, keine Frage. Möchte einfach nur was dazulernen.

Gruß

ANKH
Lochkartenstanzer
Lochkartenstanzer 17.08.2014 um 13:55:20 Uhr
Goto Top
Zitat von @AnkhMorpork:


Das läuft optimal unter 64-bit, keine Frage. Möchte einfach nur was dazulernen.


Dann probier doch einafch die doppelt genauen Berechnungen aus. udn miß mal, wie sich das auf das ergebnis udn die berechnungszeien auswirkt. face-smile

lks
AnkhMorpork
AnkhMorpork 17.08.2014 aktualisiert um 15:25:56 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

> Zitat von @AnkhMorpork:
>
>
> Das läuft optimal unter 64-bit, keine Frage. Möchte einfach nur was dazulernen.
>

Dann probier doch einafch die doppelt genauen Berechnungen aus. udn miß mal, wie sich das auf das ergebnis udn die
berechnungszeien auswirkt. face-smile

lks

Werde ich tun. Das wird vermutlich pari auslaufen ... auf einem Bildschirm-Canvas von vielleicht 200x100 Pixeln. Aber auf einem Drucker-Canvas von 2000x1000 Pixeln oder mehr wird das - naja - etwas länger dauern.

Mir ging es eigendlich nur um den Geschwindigkeitsfaktor: Kann ich das tunen?
Tja - schnell gepostet und zu langsam gedacht, was ich da poste. MEA CULPA!

Danke nochmal!

ANKH

P.S. Tue das hier mal auf "gelöst" - lks hat das wohl hinreichend geklärt.