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
Gast
#1708534
Wie so oft: Ein Blick ins Handbuch schafft Klarheit. Hier zum Runterladen: http://www.intel.com/Assets/PDF/manual/253666.pdf
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.