AGB  ·  Datenschutz  ·  Impressum  







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

Elemente in Mengen mit ASM zählen

Ein Thema von LucasL · begonnen am 16. Nov 2006 · letzter Beitrag vom 17. Nov 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 13:45
Code:
00001000 00000000 10000001 => Counter wird inkrementiert
00000100 00000000 01000000 => Counter bleibt gleich
...
00000000 00100000 00000010 => Counter bleibt gleich
00000000 00010000 00000001 => Counter wird inkrementiert
00001000 00001000 [color=#ff0000]00000000[/color] => Schleife beendet
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 14:00
Hi folks,

[0,255] wird durch die Bytes [01, 00, 00, 00, 00, 00, 00, 80] repräsentiert, wenn ich nicht irre. Die Anzahl der Bytes, die einen Set repräsentieren, kann man übrigens mit SizeOf() bestimmen.

@Manuel: alle wollen dir nur mitteilen, dass dein Code nur register sets (maximal 32 Elemente) verabeitet. Dabei kann unter gewissen Umständen (packed) auch ein zu großer Wert als Ergebnis ausgewiesen werden.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 14:19
Jetzt versteh ichs, ich hatte einen Denkfehler, ich dachte ein set of [0..255] ist 1 Byte groß...

Mein Code funktioniert natürlich nur bist zu 32 Elementen...
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 14:57
Manuel, deine Funktion erwartet Mengen mit mehr als 32 Elementen, sie verarbeitet dann aber nur die ersten 32 Elemente. Wenn du die erste Zeile entfernst, können Mengen mit bis zu 32 Elementen verarbeitet werden.

Zitat von LucasL:
Was mir noch aufgefallen ist: Für bis zu 4 Byte/32 Bit (dementsprechend bis zu 32 Elementen) wird eine Menge als Werte-, ab 33 Elementen als Referenzparameter übergeben.
Gruß Hawkeye
  Mit Zitat antworten Zitat
LucasL

Registriert seit: 20. Dez 2005
19 Beiträge
 
#15

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 15:22
Mit SizeOf klappts. Habs jetzt mal wie folgt gemacht und es scheint zu funktionieren, egal wieviel Platz die Menge benötigt (1 - 32 Byte).

Delphi-Quellcode:
function MySizeOf(var Menge: TMySet): Byte;
  function CountBits(C: Byte; P: Pointer): Byte;
  asm
    MOV CL, AL // Byteanzahl nach CL
    MOV EAX, 0 // Bitzähler EAX initialisieren
    @loop1:
      MOV EBX, [EDX] // Bits nach EBX laden
      MOV CH, 8 // Bitanzahl nach CH
      @loop2:
        ROR EBX, 1 // Niedrigstes Bit von EBX nach CF schieben
        JNC @nocarry
        ADD EAX, 1 // CF gesetzt? Dann EAX inkrementieren
        @nocarry:
        DEC CH
        JNZ @loop2
      ADD EDX, 1 // nächstes Bit adressieren
      DEC CL
      JNZ @loop1
  end;
begin
  MySizeOf := CountBits(SizeOf(Menge), @Menge);
end;
Gruß,
Lucas
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 18:31
@LucasL: kleine Optimierung: statt
Code:
JNC @nocarry
ADD EAX, 1     // CF gesetzt? Dann EAX inkrementieren
@nocarry:
kannst du auch einfach
Code:
ADC EAX, 0     // EAX um CF inkrementieren
schreiben.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
LucasL

Registriert seit: 20. Dez 2005
19 Beiträge
 
#17

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 22:03
Thx, und man sollte die Register, welche nicht sowieso von der Funktion als Parameter belegt werden, vorher noch mit Push bzw. am Ende mit Pop retten... So:

Delphi-Quellcode:
function Length(Menge: TMySet): Byte; overload;
    function CountBits(C: Byte; P: Pointer): Byte;
    asm
     PUSH EBX
     PUSH ECX
     MOV CL, AL // Byteanzahl nach CL
      MOV EAX, 0 // Bitzähler EAX initialisieren
      @loop1:
        MOV EBX, [EDX] // Bits nach EBX laden
        MOV CH, 8 // Bitanzahl nach CH
        @loop2:
          ROR EBX, 1 // Niedrigstes Bit von EBX nach CF schieben
          ADC EAX, 0 // CF zu EAX addieren
          DEC CH
          JNZ @loop2
        ADD EDX, 1 // nächstes Bit adressieren
        DEC CL
        JNZ @loop1
      POP ECX
      POP EBX
    end;
  begin
    Result := CountBits(SizeOf(Menge), @Menge);
  end;
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 22:13
Soweit ich das sehe, sind alle zu sichernden Register hier vom Caller zu retten. Bei ebx bin ich mir ned ganz sicher, aber die anderen iirc schon.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
LucasL

Registriert seit: 20. Dez 2005
19 Beiträge
 
#19

Re: Elemente in Mengen mit ASM zählen

  Alt 17. Nov 2006, 22:20
EAX (C) und EDX (P) werden automatisch gerettet, das stimmt. EBX und ECX müssen noch zusätzlich gesichert werden, zumindest schließe ich das aus den heftigen Nebenwirkungen, wenn ich sie nicht rette ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:05 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