[Geloest] Assembler Function und Segfault

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

[Geloest] Assembler Function und Segfault

Beitrag von Eclipticon »

Hi,

ich vergleiche das Ergebnis der Funktion

Code: Alles auswählen

{$asmmode intel}
function CPUTypeInfo: longword; assembler;
  asm
           MOV     EAX,1
           DB      $0F,$A2
end;
mit einem longword in einem packed record; dabei wird ein Segfault ausgeloest. Wenn ich das Ergebnis der Funktion in eine lokale Variable packe und den Vergleich mit der anstelle, funktioniert's (aber nur, solange ich keine Compileroptimierung einstelle).

Es ist mir leider nicht gelungen, das ganze in einem Minimalbeispiel zu reproduzieren ... hat trotzdem jemand eine Ahnung, was hier schiefgehen koennt?

Vielen Dank!
Zuletzt geändert von Eclipticon am Mo 4. Feb 2013, 17:09, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Assembler Function und Segfault

Beitrag von Socke »

Eclipticon hat geschrieben:ich vergleiche das Ergebnis der Funktion
mit einem longword in einem packed record; dabei wird ein Segfault ausgeloest. Wenn ich das Ergebnis der Funktion in eine lokale Variable packe und den Vergleich mit der anstelle, funktioniert's (aber nur, solange ich keine Compileroptimierung einstelle).
Wird die Exception erst beim Vergleich oder schon in der Funktion aufgerufen? Darfst du den Assembler-Befehl DB überhaupt aufrufen? Ich könnte mir vorstellen, dass letzteres unter modernen Betriebssystemen zu einer Zugriffsverletzung führt, da nur das Betriebssystem auf die Speicherbereiche mit Programmcode schreiben darf. Alle Prozesse haben falls überhaupt nur Berechtigungen zum Lesen bzw. ausführen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Assembler Function und Segfault

Beitrag von indianer-frank »

Wahrscheinlich kommt der Crash deshalb, weil du EBX zerstörst. CPUID mit EAX=1 liefert "additional feature info" in EBX. EBX darf normalerweise nicht frei verwendet werden, insbesondere nicht in Funktionen (inline kann's manchmal funktionieren je nach Codeumgebung)! Versuch's mit

Code: Alles auswählen

  push   ebx
  mov    eax,1
  db     $0f,$a2          {cpuid}
  pop    ebx
  ...
 

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Assembler Function und Segfault

Beitrag von Eclipticon »

Danke fuer den Hinweis, dass ich mir EBX zerschossen habe ... jetzt geht's!

Antworten