Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [ASM] Set-Ausdruck modifizieren (https://www.delphipraxis.net/152136-%5Basm%5D-set-ausdruck-modifizieren.html)

Neutral General 12. Jun 2010 11:54

[ASM] Set-Ausdruck modifizieren
 
Hallo,

Folgender Delphi-Code:

Delphi-Quellcode:
procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H'] do
    Inc(Run);
end;
Dazu wird folgender (von mir so gut wie möglich lesbar gemachter) Assemblercode generiert:

(Hier externe Version mit Highlighting: *klick*)
Code:
; Label   | Adresse |     Opcode    |   Mnemonic

; Initialisierung
           00475bac  55                 push ebp
           00475bad  8bec               mov ebp,esp
           00475baf  51                 push ecx
           00475bb0  8945 fc            mov dword ptr ss:[ebp-4],eax
           00475bb3  8b45 fc            mov eax,dword ptr ss:[ebp-4]

; inc(Run)
           00475bb6  ff80 70080000      inc dword ptr ds:[eax+870]
           00475bbc  8b45 fc            mov eax,dword ptr ss:[ebp-4]

; fTokenID := tkNumber;
           00475bbf  c680 80080000      mov byte ptr ds:[eax+880],4

           00475bc6  eb 09              jmp short 00475bd1                    ; ---> 1.Durchl
Schleife:  00475bc8  8b45 fc              / mov eax,dword ptr ss:[ebp-4]    

; inc(Run)
           00475bcb  ff80 70080000        | inc dword ptr ds:[eax+870]

; al := FLine[Run]
1.Durchl:  00475bd1  8b45 fc              | mov eax,dword ptr ss:[ebp-4]
           00475bd4  8b40 68              | mov eax,dword ptr ds:[eax+68]
           00475bd7  8b55 fc              | mov edx,dword ptr ss:[ebp-4]
           00475bda  8b92 70080000        | mov edx,dword ptr ds:[edx+870]
           00475be0  8a0410               | mov al,byte ptr ds:[eax+edx]

; al in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H'] ?
           00475be3  04 d8                | add al,0d8
           00475be5  3c 47                | cmp al,47
           00475be7  77 0a                | ja short 00475bf3                ; ---> Schl_end
           00475be9  83e0 7f              | and eax,7f
           00475bec  0fa305 f85b470>      | bt dword ptr ds:[475bf8],eax     ; **** Bitmaske
Schl_end:  00475bf3  72 d3                \ jb short 00475bc8                ; ---> Schleife

; Finalisierung
           00475bf5  59                 pop ecx
           00475bf6  5d                 pop ebp
           00475bf7  c3                 retn



; Daten
Bitmaske:  00475bf8  40ff037e           dd 7e03ff40                       
           00475bfc  01                 db 01
           00475bfd  00                 db 00
           00475bfe  00                 db 00
           00475bff  7e                 db 7e                                  
           00475c00  01                 db 01
           00475c01  00                 db 00
           00475c02  00                 db 00
           00475c03  00                 db 00
Das ist der Codes von dem SEG-Editor, der mir sehr gefällt, aber dessen (auf TSynEdit basierendes) Syntaxhighlighting gefällt mir leider nicht so, weswegen ich die exe gerade (bisher sehr erfolgreich) meinen Wünschen anpasse.

Mein Problem ist dass er keine Hexzahlen im Format 0xABCDEF erkennt, da er das "x" nicht als Bestandteil einer Zahl ansieht.

Ziel ist es jetzt den Assemblercode so umzugestalten (die Dateigröße darf natürlich nicht wachsen!), dass auch "x"-Zeichen akzeptiert werden.
Der Assemblercode soll dann äquivalent sein zu einer der folgenden Delphi-Codes:

A)
Delphi-Quellcode:
procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H','x','X'] do
    Inc(Run);
end;
B)
Delphi-Quellcode:
// auf das "H" kann ich persönlich verzichten
procedure TSynAsmSyn.NumberProc;
begin
  inc(Run);
  fTokenID := tkNumber;
  while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'x', 'A'..'F', 'X'] do
    Inc(Run);
end;
Kriege das allerdings bisher nicht hin. Gibts hier vielleicht irgendeinen Assembler-Freak der das hinbekommt? :mrgreen:

Gruß
Neutral General

idefix2 12. Jun 2010 12:36

AW: [ASM] Set-Ausdruck modifizieren
 
Wenn ich das richtig sehe, brauchst Du nur in der Bitmaske die Bits für x und X setzen, sowie in der Abfrage cmp al,47 die Zahl 0x47 - entspricht dem kleinen h durch 0x58 - sollte dem kleinen x entsprechen, wenn ich mich nicht irre.

Das Bit für das grosse X: 00475bfe 01 db 01
Das Bit für das kleine x: 00475c02 01 db 01

Neutral General 12. Jun 2010 12:40

AW: [ASM] Set-Ausdruck modifizieren
 
Erst zuende schreiben, dann auf "Antworten" klicken :mrgreen:

Also habe da an der Bitmaske schon was getüftelt aber leider nicht erfolgreich.

Christian Seehase 12. Jun 2010 13:25

AW: [ASM] Set-Ausdruck modifizieren
 
Moin Michael,

was soll die Methode NumberProc denn eigentlich machen?

Amateurprofi 12. Jun 2010 13:55

AW: [ASM] Set-Ausdruck modifizieren
 
Zitat:

Zitat von Neutral General (Beitrag 1028347)
Erst zuende schreiben, dann auf "Antworten" klicken :mrgreen:

Also habe da an der Bitmaske schon was getüftelt aber leider nicht erfolgreich.

Du mußt nicht nur die Bitmaske ändern, sondern so wie idefix2 schrieb auch das cmp al,47 entsprechend anpassen. Meiner Meinung nach sollte der Vergleich cmp al,50 sein um auch das 'x' zu erfassen.

Amateurprofi 12. Jun 2010 13:59

AW: [ASM] Set-Ausdruck modifizieren
 
Zitat:

Zitat von Christian Seehase (Beitrag 1028353)
Moin Michael,

was soll die Methode NumberProc denn eigentlich machen?

Ich denke sie soll Run hinter die Zahl stellen.

Neutral General 12. Jun 2010 15:17

AW: [ASM] Set-Ausdruck modifizieren
 
Zitat:

Zitat von Christian Seehase (Beitrag 1028353)
Moin Michael,

was soll die Methode NumberProc denn eigentlich machen?

Damit parst der Assembler-Highlighter von Synedit Zahlen.

Zitat:

Zitat von Amateurprofi (Beitrag 1028356)
Zitat:

Zitat von Neutral General (Beitrag 1028347)
Erst zuende schreiben, dann auf "Antworten" klicken :mrgreen:

Also habe da an der Bitmaske schon was getüftelt aber leider nicht erfolgreich.

Du mußt nicht nur die Bitmaske ändern, sondern so wie idefix2 schrieb auch das cmp al,47 entsprechend anpassen. Meiner Meinung nach sollte der Vergleich cmp al,50 sein um auch das 'x' zu erfassen.

Ja auf die 50 bin ich auch schon mal gekommen allerdings würden nach meinem Verständnis einige ungewollte Zeichen in das Set gelangen.

Christian Seehase 12. Jun 2010 15:31

AW: [ASM] Set-Ausdruck modifizieren
 
Moin Michael,

Zitat:

Zitat von Neutral General (Beitrag 1028370)
Damit parst der Assembler-Highlighter von Synedit Zahlen.

Wird der so mitgeliefert, oder ist das von Dir, denn ich sehe darin zwei Probleme:
1. Wenn FLine nicht auf ein ungültiges Zeichen endet, läuft die Methode in eine AV
2. Es werden auch ungültige Zeichenkombinationen als Zahl erkannt.

idefix2 12. Jun 2010 18:16

AW: [ASM] Set-Ausdruck modifizieren
 
Zitat:

1. Wenn FLine nicht auf ein ungültiges Zeichen endet, läuft die Methode in eine AV
2. Es werden auch ungültige Zeichenkombinationen als Zahl erkannt.
zu 1.: wird sich die Routine wohl auf ein "eol" Zeichen, egal wie es aussieht, am Zeilenende verlassen

zu 2. Wäre bei einem Syntax Highlighter zumindest nicht sehr tragisch, weil in der Praxis in einem Programm nur sehr selten Nicht-Zahlen, die allen Bedingungen entsprechen, vorkommen werden. Es könnte aber sein, dass im Programm danach noch zusätzliche Checks gemacht werden, um ungültige Strings auszuschliessen, dann könnte auch die Änderung dieser Routine u.U. nichts helfen.

Zitat:

Erst zuende schreiben, dann auf "Antworten" klicken
Tut mir leid, bin vorzeitig am Antworten Knopf angekommen. Aber die drei Änderungen, die ich Dir vorgeschlagen habe, hast Du anscheinend noch nicht ausprobiert, weil zumindest diese Routine müsste dann funktionieren.

Zitat:

Meiner Meinung nach sollte der Vergleich cmp al,50 sein um auch das 'x' zu erfassen.
der Wert von 'x' ist um 16, also um 0x10 grösser als der wert von 'h'. Der Wert 47 steht für das h, also müsste 0x10 dazu gezählt werden, damit die Werte bis inklusive x nicht schon beim Bereichstest rausfliegen. Muss also mindesten 0x57 sein - ich habe mich bei meinem 1. Post also um 1 verzählt - ein etwas grösserer Wert schadet aber nicht, weil alle Werte, die nicht schon beim Vergleich als zu gross herausfallen, noch einmal über die Maske überprüft werden.


edit: Ihr habt Recht, es genügt doch 0h50 - 0x47 entspricht nicht dem 'h', sondern dem letzten Zeichen, das im Set im gleichen byte wie das h untergebracht ist, also dem 'o'.

Amateurprofi 12. Jun 2010 22:47

AW: [ASM] Set-Ausdruck modifizieren
 
Zitat:

Zitat von Neutral General;
Ja auf die 50 bin ich auch schon mal gekommen allerdings würden nach meinem Verständnis einige ungewollte Zeichen in das Set gelangen.

Die werden dann durch bt [bitmaske],eax gefolgt von jb schleife ausgefiltert.

Optimal ist der OriginalCode nicht, weil die Zeichen ()*+,- und die Zeichen ijklmno nicht durch das cmp al,xx ausgefiltert werden, sondern erst durch das teure bt [475bf8],eax als nicht zum Set gehörend erkannt werden.

Besser wäre, add al,d2 nebst cmp al,3a.
Das würde Zeichen < '.' bzw. > 'h' ausfiltern.
Allerdings müßte auch die Bitmaske entsprechend angepaßt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz