AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign XE2 Stringfunktion + ASM code : function CountString(...)
Thema durchsuchen
Ansicht
Themen-Optionen

XE2 Stringfunktion + ASM code : function CountString(...)

Ein Thema von bernhard_LA · begonnen am 21. Sep 2011 · letzter Beitrag vom 21. Sep 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#1

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 10:56
Ein paar [delphi]-Tags wären nicht schlech.

Delphi-Quellcode:
begin
...
ASM
Geht unter 64 Bit garnicht mehr, da es dort kein Inline-Assemler mehr gibt (in Delphi).
Prozeduren müssen entweder in Pascal oder Assembler geschrieben sein. (gemischt ist nicht mehr ... je Prozedur)

also entweder
Delphi-Quellcode:
function CountString(Const substr, s: WideString): Word;
{$IFDEF CPUX86}
asm
...
end;
{$ENDIF CPUX86}
{$IFDEF CPUX64}
asm
...
end;
{$ENDIF CPUX64}
oder
Delphi-Quellcode:
function CountString(Const substr, s: WideString): Word;
asm
{$IFDEF CPUX86}
...
{$ENDIF CPUX86}
{$IFDEF CPUX64}
...
{$ENDIF CPUX64}
end;

Du könntest dir die WideString-Varianten nehmen und müßtest unter Win64 die Register anpassen.
Unter 32 Bit lagen die ersten Parameter in EAX, EDX, ECX, welche aber bei 64 Bit nun anders vereilt sind. Irgenwo wurde das hier, in der DP, vor Kurzem mal erwähnt.

Für den Anfang also einfach nur die entsprechenden 32-Bit-Register der 64-Bit-Architektur verwenden.


Wenn ich mal die Zeit finde, läßt sich dann bestimmt noch einiges Optimieren. (mit MMX, SSE und Co.)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Sep 2011 um 11:02 Uhr)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 12:06
Ein paar [delphi]-Tags wären nicht schlech.


Du könntest dir die WideString-Varianten nehmen und müßtest unter Win64 die Register anpassen.
Unter 32 Bit lagen die ersten Parameter in EAX, EDX, ECX, welche aber bei 64 Bit nun anders vereilt sind. Irgenwo wurde das hier, in der DP, vor Kurzem mal erwähnt.

Für den Anfang also einfach nur die entsprechenden 32-Bit-Register der 64-Bit-Architektur verwenden.


Wenn ich mal die Zeit finde, läßt sich dann bestimmt noch einiges Optimieren. (mit MMX, SSE und Co.)
ASM Parameter:

Zitat:
The first four parameters to inline assembler functions are passed via RCX, RDX, R8, and R9 respectively, except for floating-point arguments which use XMMO, XMM1, XMM2, XMM3. The math coprocessor is not normally used from x64 code. Registers used for function parameters can be modified freely.
Lars
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 12:30
Warum das ganze überhaupt in Assembler? Das (die Quelle) sieht mir so aus als ob da "Assembler ist immer schneller als Pascal Code" gedacht wurde. Und dann auch noch "repnz scasb", was zu 80386-er Zeiten "relativ" schnell war aber mittlerweile besser mit einer loop gemacht wird.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#4

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 13:00
Eine Nicht-Assmbler-Version könnte wohl so aussehn: (ungetestet)
Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 0;
  while True do begin
    i := PosEx(SubStr, S, i + 1);
    if i = 0 then Exit;
    Inc(Result);
  end;
end;
eventuell auch so:
(weiß grade nicht, wie genau gezählt wurde ... ist/war CountString('xxx', 'xxxxxx') = 2 oder 4? )
Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 1;
  while True do begin
    i := PosEx(SubStr, S, i);
    if i = 0 then Exit;
    Inc(i, Length(SubStr));
    Inc(Result);
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Sep 2011 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:12
Himiiii! "while true" und "Exit" - wo komms du denn her?

Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 0;
  repeat
    i := PosEx(SubStr, S, i + 1);
    if i > 0 then
      Inc(Result);
    // oder
    Inc(Result, IfThen(Result>0, 1, 0));
    // Könnte nur langsamer sein
  until i = 0;
end;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (21. Sep 2011 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#6

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:14
Müsste i nicht vor der Schleife mit 0 initialisiert werden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:19
Ups
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz