AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Alter Assembler Code

Ein Thema von freimatz · begonnen am 17. Feb 2025 · letzter Beitrag vom 18. Feb 2025
Antwort Antwort
Seite 1 von 2  1 2      
freimatz

Registriert seit: 20. Mai 2010
1.482 Beiträge
 
Delphi 11 Alexandria
 
#1

Alter Assembler Code

  Alt 17. Feb 2025, 07:09
In einer Fremdbibliothek (Turbopower SysTools) finde ich alten Code, den ich mal benutzt habe:
Delphi-Quellcode:
function LoCase(C: AnsiChar) : AnsiChar; assembler;
asm
  and eax, 0FFh
  push eax
  call CharLowerA
end;
In einer neueren Version fehlt diese Methode.
Womit kann ich diese ersetzen ohne den aufrufenden Code zu ändern?
(In den Aufrufkonventionen von Windows-Methoden bin ich nicht firm.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Alter Assembler Code

  Alt 17. Feb 2025, 07:52
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?

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:
// 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;
oder
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin
  Result := System.AnsiStrings.LowerCase(C)[1];
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Feb 2025 um 08:00 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.482 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Alter Assembler Code

  Alt 17. Feb 2025, 08:46
Das assembler-Schlüsselwort ist zwar seit Jahrzehnten nicht mehr nötig, aber egal,
und sonst funktioniert dieser Code eigentlich immernoch (Delphi 12).
Ja, aber nicht mit Win64
Was heißt fehlt?
Die Funktion selbst ist weg, also im Turbopower, nicht im Delphi, oder wie?
Ja genau. Die ist einfach nicht mehr drin.

Du hast sie ja noch, also warum nicht einfach kopieren und in eigene Unit?
Wegen Win64

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.
Ja, verwende ich auch häufig.

Durch die Variable wird der Code etwas aufgebläht, aber Hauptsache es geht.
Delphi-Quellcode:
// 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;
Danke. Das hilft.
Geschwindigkeit ist hier sicher kein Problem. Es muss nicht mehr mit 4.77Mhz laufen wie damals.

oder
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin
  Result := System.AnsiStrings.LowerCase(C)[1];
end;
Du meinst das ist identisch? Verwendet die auch CharLowerA? Wenn ich es richtig lese konvertiert System.AnsiStrings.LowerCase nur ASCII

Geändert von freimatz (17. Feb 2025 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Alter Assembler Code

  Alt 17. Feb 2025, 09:17
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;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.788 Beiträge
 
Delphi 12 Athens
 
#5

AW: Alter Assembler Code

  Alt 17. Feb 2025, 14:45
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;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.482 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Alter Assembler Code

  Alt 17. Feb 2025, 15:45
Delphi-Quellcode:
function LoCase(C: AnsiChar): AnsiChar;
begin
  Result := C;
  if Result in ['A'..'Z'] then
    Result := AnsiChar(Ord(Result) or $20);
end;
Nun ja, das betrifft nur ASCII. Was ist mit "Ä"?
Die obige Assembler-Funktion verwendet CharLowerA, welches wohl landesspzifische Dinge berücksichtigt.

@jaenicke: Auch die Methode arbeitet anders als die Assemblerfunktion - oder nicht?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Alter Assembler Code

  Alt 17. Feb 2025, 16:25
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.482 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Alter Assembler Code

  Alt 18. Feb 2025, 08:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.037 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Alter Assembler Code

  Alt 18. Feb 2025, 13:54
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.482 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Alter Assembler Code

  Alt 18. Feb 2025, 17:03
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:53 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