Flag nicht definiert



  • Hi.

    In vielen Befehlsübersichten steht unter den jeweiligen Assemblerbefehlen

    Beeinflussung der Flags:
    - FlagX (ergebnisabhängig) gesetzt oder gelöscht
    - FlagY unverändert
    - FlagZ nicht definiert

    Mit dem nicht definierten Zustand kann ich jetzt nichts anfangen. Was bedeutet das? Wird dann gewürfelt, ob gesetzt oder nicht? 🤡

    Flagge



  • Hi,

    es bedeutet für dich nur, dass dein Code nicht auf Grundlage dieses Flags irgendwelche Sachen tun darf.

    Die Entwerfer der Befehlssatzes bzw. des Prozessors haben den Inhalt dieses Flags aus Sicht des Programmieres vermutlich aus technischen Gründen undefiniert gelassen. Es wird vermutlich immer irgendeine Logik hinter diesen Flags stecken, nur könnte diese sehr stark mit den Interna der CPU zusammenhängen, die (zum Beispiel) für Außenstehende nicht brauchbar sind.

    Ein Szenario, mit dem ich mir das erklären würde: Vielleicht wurde ein Befehl X intern mit Hilfe der Logik eines anderen Befehls Y implementiert. Dies könnte zum Beispiel geschehen sein, um Transistoren zu sparen (und damit Arbeit, Tests, Debugging, Zeit und Geld). Der eigentliche Befehl X signalisiert nichts sinnvolles über diese Flags, der Befehl Y aber schon. Damit man nicht wieder Transistoren verwenden muss, um die Flags zu sichern und wiederherzustellen, definiert man einfach den Inhalt der Flags als undefiniert.

    Konkretes Beispiel: Der (fast nie benutzte) Befehl AAM auf x86-CPUs führt intern eine Division durch. Ich kann mir vorstellen, dass da intern einfach die ALU auf eine spezielle Weise mit Werten geladen wurde, und danach wie bei der DIV-Instruktion aufgefordert wurde zu dividieren. Die ALU verändert beim DIV die Flags, zum Beispiel bei einem Overflow. Allerdings wird bei AAM ein 8-Bit-Wert durch ein 8-Bit-Wert dividiert. Dabei kann nie ein Overflow auftreten, und das Flag ist immer 0.

    Der Hersteller hätte aber dadurch, dass er sagt, dass das Overflow Flag undefiniert ist, die Freiheit irgendwann mal AAM auf eine andere Art und Weise zu implementieren, und dabei müsste er nicht dafür sorgen, dass das Overflow Flag 0 ist. Dass dieses Vorgehen keine gute Idee ist, hat sich in der Vergangenheit unzählige Male gezeigt. Allerdings ist die x86-Architektur auch rund 30 Jahre alt. 😉



  • 💡 Danke, Schablone, für die ausführliche Erklärung.


Anmelden zum Antworten