Forum: PC-Programmierung x86-asm: Unterschied zwischen jg und jl


von Jacek G. (tfc)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

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.

von Jacek G. (tfc)


Lesenswert?

> 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...

von (prx) A. K. (prx)


Lesenswert?

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.

von Andreas F. (aferber)


Lesenswert?

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

von Xenu (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.