www.mikrocontroller.net

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


Autor: Jacek G. (tfc)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jacek G. (tfc)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie so oft: Ein Blick ins Handbuch schafft Klarheit.

Hier zum Runterladen:
http://www.intel.com/Assets/PDF/manual/253666.pdf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.