Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 XProfan X4 Inline-Assembler
Autor: Arndt Lindner (80.150.206.---)
Datum:   31.01.22 20:24

Ich möchte an dieser Stelle eine Lanze für den Inline-Assembler von XProfanX4 brechen. Er ist hinreichend eingeschränkt, so dass man keine großen Projekte damit angeht aber gleichzeitig hinreichend mächtig, um bestimmte Routinen zu beschleunigen. Das gilt insbesondere, wenn man Schleifen als Assemblerroutinen programmiert.
Ein kleines Beispiel möge das zeigten.
Eine Multiplikation quadratischer Matrizen in Profan
 Proc QMatMul_Profan
 Parameters double k1[], k2[]
 var longint m = sqrt(sizeof(k1[]))
 declare double x[m-1,m-1]
 Declare longint i, j, k, double w
   dec m
   for k, 0, m
     for j, 0,  m
       w = 0.0
       for i, 0, m
         w = w + k1[k,i]*k2[i,j]
       endfor
       x[k,j] = w
     endfor
   endfor
   return x[]
 EndProc
 

wird durch eine Assemblerimplementierung
 Proc QMatMul
 Parameters double k1[], k2[]
 var longint m  = sqrt(sizeof(k1[]))
 declare double x[m-1,m-1]
   aQMatMul(m,addr(x[0,0]),addr(k1[0,0]),addr(k2[0,0]))
   return x[]
 EndProc
 
 ASM "aQMatMul",4
   FINIT
   MOV   ESI,par1           'Dimension der Matrizen
   MOV   EAX,8
   MUL   ESI
   MOV   EDI,EAX            'Anzahl Byte pro Spalte
   MOV   EAX,par2           'Adresse Ergebnismatrix
   MOV   EDX,par3           'Adresse Matrix k1[]
   MOV   EBX,par4           'Adresse Matrix k2[]
   MOV   ECX,ESI
 sch2:
   PUSH  ECX
   PUSH  EBX
   PUSH  EDX
   PUSH  EAX
   MOV   ECX,ESI
 sch1:
   PUSH  ECX
   PUSH  EBX
   PUSH  EDX
   MOV   ECX,ESI
   FLDZ
 sch:
   FLD   QWORD PTR [EDX]
   FLD   QWORD PTR [EBX]
   ADD   EDX,EDI
   ADD   EBX,8
   FMUL
   FADD
   LOOP  sch
   FSTP  QWORD PTR [EAX]
   ADD   EAX,EDI
   POP   EDX
   POP   EBX
   ADD   EBX,EDI
   POP   ECX
   LOOP  sch1
   POP   EAX
   ADD   EAX,8
   POP   EDX
   ADD   EDX,8
   POP   EBX
   POP   ECX
   LOOP  sch2
 ENDASM
 

um einen Faktor von ca. 9000 beschleunigt. Matrizen mit einer Dimension größer als 50 lassen sich erst damit sinnvoll multiplizieren (OK man kann auch externe dlls einbinden).
Der abgespeckte Befehlsumfang des Inline-Assemblers ist aber sehr gut für den Einstieg in die Assemblerprogrammierung geeignet. Mir hat es richtig Spaß gemacht mal wieder etwas in Assembler zu programmieren. In den 1980iger Jahren habe viel Assembler für den Z80 und den PRS 4000 geschrieben. Seit 1990 aber nichts mehr. Es war also fast ein Neueinstieg.

Gruß
Arndt



Beitrag beantworten
 
 Re: XProfan X4 Inline-Assembler
Autor: p. specht (---.nat.highway.telekom.at)
Datum:   01.02.22 00:05

Gute Implementation! Ich hatte zu Alpha-Versionszeiten mal ein "Merkblatt Inline-Assembler" als pdf erzeugt. Als Einstiegshilfe noch bedingt tauglich:

https://xprofan.net/intl/de/asm/merkblatt-xprofan-x4-inlineassembler-aka-xasm/

Beitrag beantworten
 
 Re: XProfan X4 Inline-Assembler
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   01.02.22 07:40

Für mich wäre der Inline-Assembler für Stringoperationen
interessant. Oftmals sind (X)Profans Stringbefehle einfach
zu langsam. Das ist oft bei großen Datenmengen von Strings.
Oder halt auch dort, wo es auf Geschwindigkeit ankommt.
Das ist auch vielfach durch die String - Units von Delphi
geschuldet.

Da ich mich aber sehr wenig bis gar nicht in ASM auskenne,
schaue ich immer mal wieder in Paules Forum, um dort was
neues zu erhaschen.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: XProfan X4 Inline-Assembler
Autor: Arndt Lindner (80.150.206.---)
Datum:   01.02.22 13:33

Ich habe mir einmal die INSTR-Funktion vorgenommen. Meine Assemblervariante ist z.Z. noch auf ein einzelnes Suchzeichen beschränkt und die Startposition der Suche muss zwingend als positive Zahl angegeben werden.
 asm "a_instr1",3
   mov  edi,par1
   mov  edx,[edi]
   and  edx,$ff
   mov  ebx,par2
   mov  esi,ebx
   mov  ecx,[esi-4]
   mov  eax,par3
   cmp  eax,ecx
   ja   ende
   dec  eax
   cmp  eax,0
   jb   weiter
   add  esi,eax
   sub  ecx,eax
 weiter:  
   cld
 sch:  
   lodsb
   and  eax,$ff
   cmp  eax,edx
   jz   ende1
   loop sch
 ende:  
   mov  eax,0
   jmp  ende2
 ende1: 
   mov  eax,esi
   sub  eax,ebx
 ende2:  
 endasm  
 
 Aufruf:  position = a_instr1(addr(suchzeichen),addr(durchsuchter_String),startpos)
 

Man kann die Parameter der Assembler-Funktion auch ohne die addr()-Funktionen verwenden, da geht aber ein Großteil des Geschwindigkeitsgewinns verloren. Der Grund ist mir schleierhaft.
Der Geschwindigkeitsgewinn hängt natürlich von der Länge des zu durchsuchenden Strings ab. Bei Strings der Länge 1000 und gesuchtes Zeichen am Ende beträgt der Gewinn im Interpretermodus ca. Faktor 2 und als exe ca. 3,5.
Aufbauend auf dieser Funktion, gegbenenfalls mit Suchtrings statt Suchzeichen, könnte man dann weitere Stringfunktionen imlementieren.
Die Assembler-Funktion ist bisher nur rudimentär getestet und deshalb nur mit Vorsicht anzuwenden.

Gruß
Arndt



Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org