![]() |
Re: Findfirst/Findnext in Assembler
Ein Bsp. kann ich nicht bringen.
Schaut man sich aber den Source von den Delphi Units an so wurde sehr oft Assembler durch Pascal ersetzt. |
Re: Findfirst/Findnext in Assembler
Delphi-Quellcode:
function SwapBytes(Value: Cardinal): Cardinal;
asm BSWAP EAX end; function SwapBytes(Value: Cardinal): Cardinal; begin Result := (Value shr 24) or (Value shr 8) and $0000FF00 or (Value shl 8) and $00FF0000 or (Value shl 24) end; function CountBits(Value: Cardinal): Integer; begin Result := 0; while Value <> 0 do begin if Odd(Value) then Inc(Result); Value := Value shr 1; end; end; function CountBits(Value: Cardinal): Integer; asm MOV EDX,EAX SHR EDX,1 AND EDX,055555555h SUB EAX,EDX MOV EDX,EAX AND EAX,033333333h SHR EDX,2 AND EDX,033333333h ADD EAX,EDX MOV EDX,EAX SHR EDX,4 ADD EAX,EDX AND EAX,00F0F0F0Fh MOV EDX,EAX SHR EDX,8 ADD EAX,EDX MOV EDX,EAX SHR EDX,16 ADD EAX,EDX AND EAX,0FFh end; |
Re: Findfirst/Findnext in Assembler
Zitat:
|
Re: Findfirst/Findnext in Assembler
Zitat:
Gruß Hagen |
Re: Findfirst/Findnext in Assembler
Aus Classes.pas
Delphi-Quellcode:
procedure BinToHex(Buffer, Text: PChar; BufSize: Integer); assembler;
const Convert: array[0..15] of Char = '0123456789ABCDEF'; var I: Integer; begin for I := 0 to BufSize - 1 do begin Text[0] := Convert[Byte(Buffer[I]) shr 4]; Text[1] := Convert[Byte(Buffer[I]) and $F]; Inc(Text, 2); end; end; {asm PUSH ESI PUSH EDI MOV ESI,EAX MOV EDI,EDX MOV EDX,0 JMP @@1 @@0: DB '0123456789ABCDEF' @@1: LODSB MOV DL,AL AND DL,0FH MOV AH,@@0.Byte[EDX] MOV DL,AL SHR DL,4 MOV AL,@@0.Byte[EDX] STOSW DEC ECX JNE @@1 POP EDI POP ESI end;} function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer; assembler; const Convert: array['0'..'f'] of SmallInt = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15); var I: Integer; begin I := BufSize; while I > 0 do begin if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break; Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]); Inc(Buffer); Inc(Text, 2); Dec(I); end; Result := BufSize - I; end; {asm PUSH ESI PUSH EDI PUSH EBX MOV ESI,EAX MOV EDI,EDX MOV EBX,EDX MOV EDX,0 JMP @@1 @@0: DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 DB -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 DB -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 DB -1,10,11,12,13,14,15 @@1: LODSW CMP AL,'0' JB @@2 CMP AL,'f' JA @@2 MOV DL,AL MOV AL,@@0.Byte[EDX-'0'] CMP AL,-1 JE @@2 SHL AL,4 CMP AH,'0' JB @@2 CMP AH,'f' JA @@2 MOV DL,AH MOV AH,@@0.Byte[EDX-'0'] CMP AH,-1 JE @@2 OR AL,AH STOSB DEC ECX JNE @@1 @@2: MOV EAX,EDI SUB EAX,EBX POP EBX POP EDI POP ESI end;} |
Re: Findfirst/Findnext in Assembler
Zitat:
|
Re: Findfirst/Findnext in Assembler
Tja, falsch gedacht. Das Problem bei Kylix ist das Register EBX. Auf Windows Maschinen ist dieses Register "unbenutzt" d.h. man kann es frei verwenden. Delphis Compiler hat per Definition EAX,EDX,ECX als vollständig freie Register defeiniert und EBX,ESI,EDI als teilfreie Register deren Inhalt in ASM gesichert werden muß. Register EBP ist bei ASM Sourcen der Basepointer auf eventuelle Paramter oder lokale Daten. Man kann dieses Register aber ebenfalls benutzen wenn man die Regeln beachtet.
Nun, in Kylix enthält das Register EBX die GOT = Global Object Table. Diese Tabelle ist sowas ähnliches wie das Datensegement. ALLE globalen Daten werden immer über Register EBX referenziert ! D.h. das Betriebssystem kann die Daten einer Anwendung dynamsich und zu jeder Zeit durch Änderung der GOT in EBX im Speicher veschieben. Dadurch soll das Speichermanagement des OS verbessert werden. Nun, dies stimmt auch bringt aber nicht so viel. Da nun beim Überschreiben von EBX der Zeiger auf die GOT zerstört wird wird das Program abstürtzen. Denn, auf meine Anfragen bei Borland, wie sich das Exceptionhandling von Kylix verhält wenn EBX überschriben wurde, warte ich noch heute. Da aber der Exceptionhandler selber auf die GOT in EBX angewiesen ist, würde eine Überschreiben von EBX eine Exception auslösen (im spärteren Programteilen) und der Excpetionhandler ebenfalls eine Exception auslösen usw. usw. Somit darf EBX NIEMALS überschriben werden in Kylix. Um dies zu verhindern entschlossen sich die Borland-Programmierer das der Compiler darauf zu achten hat das EBX unverändert bleibt. Somit musste jeder Assemblersource erstmal als PASCAL vorliegen. Denn nur dann hat auch der Compiler die Gewalt darüber. Es ist also aus Zeitgründen einfacher alle Assemblerparts in PASCAL Source zu ändern. Dann kann durch Änderungen am Compiler selber das korrekte Verhalten mit der GOT besser kontroliert werden. All diese Änderungen bewirken das in großen Teilen bestehender und guter Assembler ersetzt wurde. Da der Compiler selber auch noch schlchter wurde, ist es klar das die Gesamtperformance der Compilate darunter zu leiden hatte. Ich will hier NICHT auf die Kylix Gemeinde schimpfen o.ä. die können am wenigsten dafür. Aber es dürfte nun klarer werden was Kylix für die Windows-Gemeinde für Auswirkungen hatte. Gruß Hagen |
Re: Findfirst/Findnext in Assembler
haha, da machen die einem ja schön vor, wie mans nicht machen sollte. Und da ich mich schon immer an die eisernen Regeln gehalten habe, niemals Hardware/betriebssystemnah zu coden, laufen sogar noch meine alten DOS Programme unter XP problemlos. Ich schimpfe auch nicht auf Kylix, aber da haben die sich was schönes eingebrockt. Das da ist nicht der einzige Grund. Mich ärgert alleine schon, daß in der OH alles doppelt kommt und CLX immer oben steht. :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 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