Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Erklärung der Flags und CMP instruction in Assembler (https://www.delphipraxis.net/195972-erklaerung-der-flags-und-cmp-instruction-assembler.html)

milos 12. Apr 2018 01:47


Erklärung der Flags und CMP instruction in Assembler
 
Hi,

der Titel ist leider nicht so glücklich gewählt, dafür entschuldige ich mich...

Ich arbeite gerade an einer kleinen VM mit eigenem instruction set und bin eigentlich so gut wie fertig... Ich habe fast alle move-, arithmetic-, stack- und control-flow-instructions implementiert und benötige nur noch conditional jumps. In assembler werden ja bei eine CMP befehl die Flags gesetzt welche dann bei einem conditional jump abgefragt werden um zu entscheiden ob gesprungen werden soll oder nicht. Die Liste die mit den vorausgesetzten Flags findet man hier in der "Flags" splate: http://unixwiz.net/techtips/x86-jumps.html

Nun möchte ich dieses Verhalten nachprogrammieren, jedoch verstehe ich leider die Beschreibung der Flags, bzw das genaue verhalten der CMP instruction nicht... Zu den Flags habe ich im Developer Manual von Intel im Kapitel "3.4.3.1 Status Flags" Beschreibungen gefunden, aber ganz habe ich das nun auch nicht verstanden... Vorallem wird der CMP befehl gar nicht erwähnt.

Gibts irgendwo eine genauere Beschreibung was genau passiert wenn ein CMP befehl zwei Werte vergleicht? Wie werden die Flags genau gesetzt? Gibts irgendwo vielleicht Pseudo- oder echten Code den ich mir ansehen könnte und nicht allzu kompliziert ist?

Freundliche Grüsse

Whookie 12. Apr 2018 06:25

AW: Erklärung der Flags und CMP instruction in Assembler
 
Es wird eine Subtraktion durchgeführt.

milos 12. Apr 2018 07:11

AW: Erklärung der Flags und CMP instruction in Assembler
 
Hi Whookie,

Zitat:

Zitat von Whookie (Beitrag 1398875)
Es wird eine Subtraktion durchgeführt.

Das ist mir auch Klar...

Zitat:

Im Gegensatz zum Subtraktionsbefehl wird das Ergebnis jedoch nicht gespeichert, sondern es werden nur die Prozessor-Flags entsprechend dem Ergebnis gesetzt.
Meine Frage ist eher wie genau die Flags gesetzt werden und was die Bedingungen der einzelnen Flags sind.

Z.b. folgendem Code:

Code:
  mov eax, 10
  mov ebx, 12
  cmp eax, ebx ; vergleiche eax, ebx
CMP führt eine Subtraktion durch, aber auf was werden die Flags dann gesetzt?

Freundliche Grüsse

Whookie 12. Apr 2018 07:37

AW: Erklärung der Flags und CMP instruction in Assembler
 
SUB Befehl: OF, SF, ZF, AF, PF, CF

Overflow flag
Sign flag
Zero flag
Auxillary (carry) flag
Parity flag
Carry flag

Die Funktion der Flags findest du hier

Neutral General 12. Apr 2018 08:14

AW: Erklärung der Flags und CMP instruction in Assembler
 
Bei sowas solltest du zumindest zusätzlich zu deinen anderen Quellen das offizielle Manual von Intel nehmen:

https://software.intel.com/sites/def...abcd-3abcd.pdf

Es klingt nämlich so als hättest du mit Flags bisher noch gar nichts gemacht. Und die schlechte Nachricht ist dass nicht nur "cmp" die Flags verändert,
sondern noch ein ganzer Haufen anderer Instruktionen.
Und welche Instruktion in welchen Fällen welches Flag setzt steht genau da in diesem PDF.

Zacherl 12. Apr 2018 11:27

AW: Erklärung der Flags und CMP instruction in Assembler
 
Falls du ein einfach zu parsendes Dokument suchst, kannst du gerne mal hier vorbeischauen:
https://github.com/zyantific/zydis-d...tructions.json

Die Datenbasis ist anhand der Intel Dokumentation, den Datafiles von Intel XED, den Tabellen von LLVM und der Website "sandpile.org" zusammengestellt und sollte - bis auf die ganz neuen Instructions aus der "Tremont" Microarchitektur (Edit: Jetzt auch vorhanden, im Future Branch) - sämtliche momentan verfügbaren ISA-Extensions beinhalten. Das JSON-File dient als Input für einen Generator, der dann die Decoder Tabellen für unseren Zydis Disassembler erzeugt; wird von uns also auch regelmäßig auf den neusten Stand gebracht.

Edit:
Dass CMP eine Subtraktion durchführt, wurde ja schon erwähnt. Dadurch impliziert werden die Flags CF, OF, SF, ZF, AF und PF entsprechend der Regeln für Subtraktion gesetzt. Also CF, wenn es einen Übertrag gab; OF, wenn ein Overflow stattgefunden hat, etc. Im Intel SDM gibt es unter dem Stichwort "Jcc — Jump if Condition Is Met" eine Seite mit allen konditionalen Sprüngen. Hier steht an der Seite auch immer dabei, welches Flag auf welche Bedingung geprüft wird. Z.B. im Falle von JNE wäre das "Jump short if not equal (ZF=0)" (Ergebnis der Subtraktion über CMP ergab nicht 0 -> also waren die verglichenen nicht Werte identisch -> zero-flag wurde nicht gesetzt (=0)).


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