Ich mache gerade eine Zuweisung, die die Leistung verschiedener x86-64-Befehle misst (bei & t-Syntax).x86-64 Relative JMP-Leistung
Der Befehl, den ich etwas verwirrt bin, ist der Befehl "unconditional jmp". Dies ist, wie ich es implementiert habe:
.global uncond
uncond:
.rept 10000
jmp . + 2
.endr
mov $10000, %rax
ret
Es ist ziemlich einfach. Der Code erstellt eine Funktion namens "Uncond", die die Direktive .rept verwendet, um den jmp-Befehl 10000 Mal aufzurufen, und setzt den Rückgabewert auf die Häufigkeit, mit der Sie den Befehl jmp aufgerufen haben.
"." in & t Syntax bedeutet die aktuelle Adresse, die ich um 2 Bytes zu erhöhen, um die JMP-Anweisung selbst zu berücksichtigen (so Jmp. + 2 sollte einfach auf die nächste Anweisung verschieben).
Code, den ich nicht gezeigt habe, berechne die Anzahl der Zyklen, die benötigt werden, um die 10000 Befehle zu verarbeiten.
Meine Ergebnisse sagen JMP ist ziemlich langsam (dauert 10 Zyklen, um eine einzige JMP-Anweisung zu verarbeiten) - aber was ich über Pipelining verstehe, sollten unbedingte Sprünge sehr schnell sein (keine Verzweigung Vorhersagefehler).
Fehle ich etwas? Ist mein Code falsch?
Mögliches Duplikat von [Slow jmp-instruction] (http://stackoverflow.com/questions/38811901/slow-jmp-instruction).Diese ausführlichere Frage hat eine viel bessere und detailliertere Antwort. –