![]() |
Alter Assembler Code
In einer Fremdbibliothek (Turbopower SysTools) finde ich alten Code, den ich mal benutzt habe:
Delphi-Quellcode:
In einer neueren Version fehlt diese Methode.
function LoCase(C: AnsiChar) : AnsiChar; assembler;
asm and eax, 0FFh push eax call CharLowerA end; Womit kann ich diese ersetzen ohne den aufrufenden Code zu ändern? (In den Aufrufkonventionen von Windows-Methoden bin ich nicht firm.) |
AW: Alter Assembler Code
Das assembler-Schlüsselwort ist zwar seit Jahrzehnten nicht mehr nötig, aber egal,
und sonst funktioniert dieser Code eigentlich immernoch (Delphi 12). Du weißt, dass man Fehlermeldungen auch kopieren kann, wenn man selbst nicht in der Lage ist den Fehler zu benennen? Strg+C Was heißt fehlt? Die Funktion selbst ist weg, also im Turbopower, nicht im Delphi, oder wie? Du hast sie ja noch, also warum nicht einfach kopieren und in eigene Unit? :stupid: Seit vielen Jahren gibt es die Unit AnsiStrings, bzw. inzwischen System.AnsiStrings, in welcher sich seit 2009 die ANSI-Versionen vieler Funktionen aus z.B. SysUtils verstecken. Durch die Variable wird der Code etwas aufgebläht, aber Hauptsache es geht.
Delphi-Quellcode:
oder
// würde auch mit Win64 funktionieren
function LoCase(C: AnsiChar): AnsiChar; var P: array[0..1] of AnsiChar; begin P[0] := C; // PWideChar(@P)^ := WideChar(C {and #$00FF}); P[1] := #0; Result := CharLowerA(@P)[0]; // Result := Winapi.Windows.CharLowerA(@P)[0]; end;
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin Result := System.AnsiStrings.LowerCase(C)[1]; end; |
AW: Alter Assembler Code
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Geschwindigkeit ist hier sicher kein Problem. Es muss nicht mehr mit 4.77Mhz laufen wie damals. Zitat:
|
AW: Alter Assembler Code
Nja, bei Letzterem wird erstmal der Char in einen String konvertiert und raus kommt wieder ein String, von dem nur das erste Zeichen genommen wird,
aber dennoch wird da viel unnötig mit dem Speichermanagement rumgeackert. entsprechend der uralten LowerCase, nur halt für 1 Char:
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin Result := C; if Result in ['A'..'Z'] then Result := AnsiChar(Ord(Result) or $20); end; |
AW: Alter Assembler Code
Wie wäre es einfach damit? Das funktioniert auch auf allen Plattformen:
Delphi-Quellcode:
uses
System.Character; function LoCase(C: AnsiChar): AnsiChar; begin Result := AnsiChar(Char(C).ToLower); end; |
AW: Alter Assembler Code
Zitat:
Die obige Assembler-Funktion verwendet CharLowerA, welches wohl landesspzifische Dinge berücksichtigt. @jaenicke: Auch die Methode arbeitet anders als die Assemblerfunktion - oder nicht? |
AW: Alter Assembler Code
Der Code ist so in etwa im alten LowerCase (D7) enthalten.
Ja, das beachtet nur A-Z, was auch so gewollt war, denn wo und ob ein Ä in der aktuellen CodePage drin steckt, dass weiß man ja nicht unbedingt. Drum machte es einen Unterschied, ob man ein ANSI-Programm (D7) z.B. in einem deutschen Windows startet, oder einem Englischen, Russischen oder Japanischen. Vor allem der Mist, welcher teilweise 2009 veranstaltet wurde, machte es oft nicht einfach(er). * LowerCase behandelte nur A-Z * AnsiLowerCase behandelt es der aktuellen Codepage entsprechend * AnsiLowerCase gibt es aber auch als Unicode-Version (obwohl es ANSI heißt), sowie ebenfalls nochmals als WideLowerCase |
AW: Alter Assembler Code
Danke. Mir ist bekannt dass es da vieles gibt, das Du als "Mist" bezeichnet hast. Aber den Überblick habe ich da nicht.
Da der alte Code bei mir schon seit ca. 30 Jahren so drin ist, soweit funktioniert und ich nicht sicher beurteilem kann was die genauen Anforderungen möchte ich, dass der ausgetauschte Code nicht "in etwa" sondern genau identisch funktioniert. Daher nehme ich von Dir den ersten der beiden Vorschläge von #2. :-D |
AW: Alter Assembler Code
Man könnte das auch einfach direkt so schreiben, denn es gibt in Winapi.Windows bereits eine explizite kleine clevere Routine, die sich um das korrekte Übergeben eines einzelnen AnsiChars an die Winapi kümmert:
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin Result := CharLowerA(C); end; |
AW: Alter Assembler Code
Danke. Ich weiss nicht ob ich Dich richtig verstanden habe. In die Liste der uses habe ich "Winapi.Windows" eingefügt. Trotzdem erscheint [dcc32 Error] ...: E2003 Undeclared identifier: 'locase'.
In der unit Winapi.Windows finde ich auch diese von Dir erwähnte function LoCase nicht. |
AW: Alter Assembler Code
Stevie meint, du sollst deine LoCase Funktion so schreiben wie er das gezeigt hat. Das CharLowerA kümmert sich um die Interna.
|
AW: Alter Assembler Code
Boar eh
Zitat:
Zitat:
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin Result := AnsiChar(Pointer(CharLowerA(PAnsiChar(Pointer(C))))); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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-2025 by Thomas Breitkreuz