Die documentation for imul lautet:Wie wird das Vorzeichen-Flag mit dem Imul-Befehl berechnet?
SF nach dem höchstwertigen Bit des Ergebnisoperanden-size-trunkierten im Ziel aktualisiert wird.
Für einen 64-Bit-Betrieb, dann, mein Verständnis ist, dass SF = (a * b) >> 63
, oder einfacher, wenn a
und b
sind unterzeichnet, SF = a * b < 0
.
Aber ich bin immer ein unerwartetes Ergebnis Multiplikation zweier großer Zahl:
mov rax, 0x9090909090909095
mov rdx, 0x4040404040404043
imul rax, rdx
Das Ergebnis 0x9090909090909095 * 0x4040404040404043
ist 0xefcba7835f3b16ff
. Es hat das Vorzeichen-Bit gesetzt, jedoch wird das SF-Flag nach der imul
-Anweisung gelöscht. Was ist los?
Dies war cross-posted to the Intel forums vor einiger Zeit.
Ich sehe einen Fehler in dieser Dokumentation: 'SF ← TMP_XP [32];', sollte offensichtlich '31' sein. Was hat Intel zu dieser Anweisung übrigens zu sagen? – usr2564301
@Jongware, das ist wahr. Ich überprüfe, ob das aktuellste Volume 2A das noch hat. Diese Dokumentation wurde automatisch aus der September 2014-Version extrahiert, also hatte Intel zu diesem Zeitpunkt darüber zu berichten. – zneak
@Jongware, die aktuellste Version von Volume 2A hat immer noch diesen Fehler. – zneak