![]() |
[ASM] Set-Ausdruck modifizieren
Hallo,
Folgender Delphi-Code:
Delphi-Quellcode:
Dazu wird folgender (von mir so gut wie möglich lesbar gemachter) Assemblercode generiert:
procedure TSynAsmSyn.NumberProc;
begin inc(Run); fTokenID := tkNumber; while FLine[Run] in ['0'..'9', '.', 'a'..'f', 'h', 'A'..'F', 'H'] do Inc(Run); end; (Hier externe Version mit Highlighting: ![]()
Code:
Das ist der Codes von dem
; 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 ![]() 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:
B)
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;
Delphi-Quellcode:
Kriege das allerdings bisher nicht hin. Gibts hier vielleicht irgendeinen Assembler-Freak der das hinbekommt? :mrgreen:
// 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; Gruß Neutral General |
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 |
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. |
AW: [ASM] Set-Ausdruck modifizieren
Moin Michael,
was soll die Methode NumberProc denn eigentlich machen? |
AW: [ASM] Set-Ausdruck modifizieren
Zitat:
|
AW: [ASM] Set-Ausdruck modifizieren
Zitat:
|
AW: [ASM] Set-Ausdruck modifizieren
Zitat:
Zitat:
|
AW: [ASM] Set-Ausdruck modifizieren
Moin Michael,
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. |
AW: [ASM] Set-Ausdruck modifizieren
Zitat:
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:
Zitat:
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'. |
AW: [ASM] Set-Ausdruck modifizieren
Zitat:
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 09: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-2025 by Thomas Breitkreuz