Erweiterte oder besser einfache Befehle ?
-
Hallo,
ist es vorteilhaft erweiterte Befehle wie "loop", "stos", "lods", "cmovX", etc. zu verwenden?
Man könnte ja auch:
mov ecx, 123 _l1: ;... loop _l1 ;oder mov ecx, 123 _l1: dec ecx jnz _l1
oder
;lods mov eax, [address+rcx] inc rcx ;... looooop
Habe mal gehört bzw. gelesen, dass die erweiterten Befehle eher aus Kompatibilitätsgründen eingeführt worden sind.
Wie sieht das ganzen denn nun aus?Danke und schöne Grüße
-
__username schrieb:
mov ecx, 123 _l1: ;... loop _l1 ;oder mov ecx, 123 _l1: dec ecx jnz _l1
Du sparst dir 2 Bytes bei der loop-Variante.
Ich denke es ist durchaus vorteilhaft, diese zu verwenden, kann aber auch sein, dass bestimmte Befehle auf alten Rechnern nicht verfügbar sind.
-
Irgendwo dienen die Befehle wohl auch der Standardisierung und vielleicht der besseren Lesbarkeit und der Unterscheidung was vor sich geht, und sie sind oft auch handlicher, fast wie Hochsprachenelemente. Deswegen empfiehlt es sich, mal öfter gute, in Assembler programmierte Programme lesen, und nicht nur Disassemblerouts.
Es wäre gar nicht so schlecht gewesen, wenn es diese Art von Befehlen auch für die FPU/SSE - Einheit gäbe, dann wäre das handoptimieren vermutlich auch für Angst-vor-Assembler-Haber angenehmer, aber nicht nur für die, gerade für die Speicherzugriffe fragt man sich, ob es nicht hier und da ein einziger, standardisierter und geschwindigkeitsoptimierter Befehl täte.
-
Wenn cmovX von der CPU unterstützt wird, dann kann man dadurch bedingte Sprungbefehle vermeiden und damit Zeit einsparen.
Unsere modernen CPUs versuchen immer mehrere Opcodes paralell auszuführen und dabei werden mehr als nur ein Opcode in die Verarbeitungseinheiten geholt und in Micro-Ops zerlegt. Dabei können Befehlsfolgen mit einfachen Befehlen wie "dec cx" + "jnz Adresse" quasi eins zu eins in Micro-Ops gewandelt werden. Solche Opcodes können in den Verarbeitungseinheiten paralell ausgeführt werden.
Bei komplexeren Befehlen ist das dann nicht mehr so eins zu eins übertragbar.
Komplexere Befehle können nur gepaart mit einfachen Befehlen paralell ausgeführt werden. Sonst nur ein komplexer Befehl nach dem anderen.Ich vermute ein "dec cx" + "jnz Adresse" wird schneller ausgeführt als ein "loop Adresse". Habe ich aber noch nicht nachgemessen.
Stringbefehle wie stos, lods... werden sehr schnell ausgeführt im Vergleich zu anderen Befehlen die das selbe machen.
SIMD-Befehle MMX, SSE.. haben eine bessere Anbindung zum Speicher und sind im Vergleich zu den Integer-Befehlen und FPU-Befehlen in vielerlei Hinsicht leistungsfähiger.
Dirk
-
Verdammt, also stelle ich zum zeiten Mal heute fest, dass mein nächstes Buch von CPU-Architekturen handeln wird
Also ist es auf jeden fall so, dass "erweiterte" Befehle einen kürzeren Opcode (als zwei einfach Befehle) haben und somit schneller dekodiert werden?
Und über die Ausführungsgeschwindigkeit kann man gundsätzlich nichts sagen, das müsste man testen ?Danke schonmal !
-
LOOP&Co existieren nur aus Kompatibilitätsgründen - sie sind langsam und man sollte sie daher nicht mehr verwenden.
-
Wunderbar, genau das hatte ich mal gelesen gehabt!
Würde nun nur ganz gerne wissen, wer alles zu "Co" gehört...
-
__username schrieb:
Verdammt, also stelle ich zum zeiten Mal heute fest, dass mein nächstes Buch von CPU-Architekturen handeln wird
Also ist es auf jeden fall so, dass "erweiterte" Befehle einen kürzeren Opcode (als zwei einfach Befehle) haben und somit schneller dekodiert werden?
Und über die Ausführungsgeschwindigkeit kann man gundsätzlich nichts sagen, das müsste man testen ?Danke schonmal !
Die Ausführungsgeschwindigkeit ist abhängig von den Taktzyklen die ein Befehl braucht und auch abhängig von der jeweiligen CPU-Architektur.
So ein Testprogramm zwischen "mov/mov" vs "push/pop" hat Frank Kotler geschrieben und es könnte mit relativ geringem Aufwand auch zum Testen für andere Befehle modifiziert werden.
https://groups.google.com/group/alt.lang.asm/browse_thread/thread/3d4fefc9bcd80b87/de738e9275a9abc7?hl=de&lnk=gst&q=pushvsmov#de738e9275a9abc7Dirk