![]() |
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: ![]() 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 ![]() 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 |
AW: Erklärung der Flags und CMP instruction in Assembler
Es wird eine
![]() |
AW: Erklärung der Flags und CMP instruction in Assembler
Hi Whookie,
Zitat:
Zitat:
Z.b. folgendem Code:
Code:
CMP führt eine Subtraktion durch, aber auf was werden die Flags dann gesetzt?
mov eax, 10
mov ebx, 12 cmp eax, ebx ; vergleiche eax, ebx Freundliche Grüsse |
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 ![]() |
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:
![]() 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. |
AW: Erklärung der Flags und CMP instruction in Assembler
Falls du ein einfach zu parsendes Dokument suchst, kannst du gerne mal hier vorbeischauen:
![]() 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 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz