AGB  ·  Datenschutz  ·  Impressum  







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

Findfirst/Findnext in Assembler

Ein Thema von Dannyboy · begonnen am 15. Sep 2003 · letzter Beitrag vom 16. Sep 2003
Antwort Antwort
Seite 3 von 3     123   
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#21

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:22
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#22

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:27
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;
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#23

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:28
Zitat von neolithos:
Schaut man sich aber den Source von den Delphi Units an so wurde sehr oft Assembler durch Pascal ersetzt.
Hast Du Dich da nur verschrieben, oder ist das wirklich so ? Denn das würde ja bedeuten, daß selbst bei Borland keine Notwendigkeit für Assembler gesehen wird
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#24

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:29
Zitat:
Schaut man sich aber den Source von den Delphi Units an so wurde sehr oft Assembler durch Pascal ersetzt
Korrekt. Dies liegt aber nicht daran das der ursprüngliche Assemblerteil schlecht oder langsam wäre, sondern an der Unterstützung von Kylix. Nicht umsonst darf man bei D7 keine Performanceanalysen veröffentlichen !

Gruß Hagen
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#25

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:33
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;}
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#26

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 12:41
Zitat von negaH:
..., sondern an der Unterstützung von Kylix. Nicht umsonst darf man bei D7 keine Performanceanalysen veröffentlichen !
Wie, was ? Habe ich da was verpaßt ? Das wird ja immer toller. Ich nix mehr kapito. 8) Sehe gerade: in Delphi6 sind die ASM - Teile bereits auskommentiert! Wurde damit nicht CLX eingeführt ? Gerade wegen der Linux Geschichten hätte ich eher vermutet, daß es mehr Assembler gibt, als weniger.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#27

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 13:12
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#28

Re: Findfirst/Findnext in Assembler

  Alt 16. Sep 2003, 13:24
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 07:54 Uhr.
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