Wieso gibt es eigentlich die Asm-Befehle jg und jl, obwohl der eine den anderen super ersetzen kann? Sind das wirklich beides normal verdrahtete Befehle oder dreht der Assembler das dann später noch zurecht, weil es dahinter nur einen Maschinenbefehl gibt? Und wenn das tatsächlich verschiedene Maschinenbefehle sind, wirkt sich verschiedene Benutzung der Befehle dann auf die Branch-Prediction aus?
Jacek G. schrieb: > Wieso gibt es eigentlich die Asm-Befehle jg und jl, obwohl der eine den > anderen super ersetzen kann? Nicht ganz. Der CMP Befehl ist nicht symmetrisch. > Sind das wirklich beides normal verdrahtete Befehle Ja. > oder dreht der Assembler das dann später noch zurecht, Was soll er da zurecht drehen? Der Sprungbefehl wertet einen Status aus, der von einem Befehl irgendwann vorher gesetzt wurde. > Und wenn das tatsächlich verschiedene Maschinenbefehle sind, wirkt sich > verschiedene Benutzung der Befehle dann auf die Branch-Prediction aus? Es gibt bei VIA Prozessoren eine Prediction, die von der Art der Sprungbedingung abhängt, wobei die aber keine Details verraten haben. Bei Intel und AMD gibt es das m.W. nicht.
> Nicht ganz. Der CMP Befehl ist nicht symmetrisch.
Mein Gedanke ist, dass man einen Code von Wegen:
cmp a, b
jg sprungmarke
einfach schreiben könnte als:
cmp b, a
jl sprungmarke
und sich dann die Verdrahtung eines Befehls hätte sparen können. Nun war
der Gedanke hinter der Frage der, dass ich erfahren wollte, ob man sich
dachte "Egal, wir implementieren beides, ist bequemer beim
Programmieren" oder "hm, wenn wir die Branch Predictions davon abhängig
machen, wie man brancht, dann kann der Programmierer das positiv
beeinflussen!" usw...
Jacek G. schrieb: >> Nicht ganz. Der CMP Befehl ist nicht symmetrisch. > > Mein Gedanke ist, dass man einen Code von Wegen: > > cmp a, b > jg sprungmarke > > einfach schreiben könnte als: > > cmp b, a > jl sprungmarke Probier das mal, wenn "a" ein Register ist und "b" eine Konstante (oder Speicher). Ausserdem kann der Assembler nicht wissen, ob nicht ein kreativer Hacker direkt auf den Sprung springt, weiss also nicht, was er umdrehen müsste. > und sich dann die Verdrahtung eines Befehls hätte sparen können. Ist in Einzelfällen gemacht worden, z.B. bei TI990. > machen, wie man brancht, dann kann der Programmierer das positiv > beeinflussen!" usw... Branch prediction hatte Intel damals totsicher nicht auf dem Radar.
A. K. schrieb: > Ausserdem kann der Assembler nicht wissen, ob nicht ein kreativer Hacker > direkt auf den Sprung springt, weiss also nicht, was er umdrehen müsste. Allerdings gibt es durchaus Fälle, in denen unterschiedlicher Assemblercode denselben Maschinencode ergibt. Ein Beispiel ist "nop" vs. "xchg eax, eax", beides ergibt 0x90 als Opcode. Oder, besser passend zur Eingangsfrage, "jg" vs. "jnle". Andreas
Wie so oft: Ein Blick ins Handbuch schafft Klarheit. Hier zum Runterladen: http://www.intel.com/Assets/PDF/manual/253666.pdf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.