Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi AV bei Assemblercode (https://www.delphipraxis.net/74545-av-bei-assemblercode.html)

3_of_8 4. Aug 2006 23:33


AV bei Assemblercode
 
Morgen.

Ich habe mir gerade folgende Funktion geschrieben, um zwei Records zu vergleichen:
Delphi-Quellcode:
function cmpinfoboxcontentelements
  (const e1, e2: TChemInfoBoxContentElement): Integer;
  asm
              mov eax, dword ptr e1.shown
              mov edx, eax
              xor eax, dword ptr e2.shown
              jz @cmporder                //Überprüfe ob die shown-Werte unterschiedlich sind
              and eax, eax                //Wenn ja, dann überprüfe ob bei e1 shown=true oder bei e2
              jz @putn1
              mov eax, 1                   //Wenn bei e1 shown=true, dann ist Ergebnis 1
              jmp @exit
  @putn1:    mov eax, -1                  //Wenn bei e2, dann -1
              jmp @exit
  @cmporder: mov eax, e1.order           //Überprüfe die Reihenfolgen - und hier knallts auch
              mov edx, e2.order
              sub eax, edx                //Ziehe e2.order von e1.order ab
              js @islower                 //Wenn negativ, springe zu islower und Ergebnis=-1
              jnz @isgreater              //Wenn nicht 0 (d.h. wenn größer 0) dann Ergebnis=1
              mov eax, 0                   //Ansonsten Ergebnis=0
              jmp @exit
  @islower:  mov eax, -1
              jmp @exit
  @isgreater: mov eax, 1
  @exit:
  end;
An dem mov eax, e1.order knallts - Zugriffsverletzung. Warum? Mein record sieht so aus:
Delphi-Quellcode:
  TChemInfoBoxContentElement=record
    Title: String[20];
    FormatStr: String[10];  
    TypeKind: TTypeKind;
    ByteOffset, Size: Integer;
    Order, HeightNeeded: Integer;
    Shown: Boolean;
  end;

Muetze1 5. Aug 2006 00:35

Re: AV bei Assemblercode
 
Andere Frage: warum nutzt du dafür nicht einfach die CompareMem() Funktion?

3_of_8 5. Aug 2006 01:40

Re: AV bei Assemblercode
 
Weil ich nur die relevanten Daten vergleichen möchte - Shown und Order. Es geht um eine Vergleichsfunktion, die in einem QuickSort angewandt wird.

Flocke 5. Aug 2006 09:44

Re: AV bei Assemblercode
 
Zitat:

Zitat von 3_of_8
An dem mov eax, e1.order knallts - Zugriffsverletzung.

Weil wegen der Aufrufkonvention (register) die beiden Parameter in EAX und EDX übergeben werden, und die hast du dir in den ersten drei Operationen schon überschrieben.

DP-Maintenance 5. Aug 2006 09:49

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Object-Pascal / Delphi-Language" nach "Programmieren allgemein" verschoben.
Ist ja eigentlich keine Frage zu Delphi/Pascal

3_of_8 5. Aug 2006 10:39

Re: AV bei Assemblercode
 
Das hab ich gestern noch selber gemerkt.

Ich hab meinen Code dann komplett umgeschrieben, war aber viel zu müde, um das noch zu posten.

Ich habe die Assemblerfunktion jetzt komplett rausgenommen und vergleiche nur noch nach order, was auch ohne Funktion geht.

Trotzdem Danke @all.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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