Frage

Ich nehme eine Montage natürlich jetzt, und der Typ, der unsere Hausaufgaben überprüft ist eine sehr pedantisch Altschule Optimierung Freak. Zum Beispiel zieht er 10%, wenn er sieht:

mov ax, 0

statt:

xor ax,ax

auch wenn es nur benutzt, um einmal.

Ich bin kein Anfänger in der Montage Programmierung, aber ich bin kein Experte Optimierung, so dass ich Ihre Hilfe brauche etwas (vielleicht eine sehr dumme Frage, aber ich werde fragen sowieso): wenn ich brauche einen Registerwert auf 1 zu setzen oder (-1) ist es besser, zu verwenden:

mov ax, 1

oder so etwas wie:

xor ax,ax
inc ax

Ich brauche wirklich eine gute Note, so versuche ich, es zu bekommen so weit wie möglich optimiert. (Ich brauche Zeit und Codegröße zu optimieren)

War es hilfreich?

Lösung

Eine schnelle Google für 8086 instructions timings size aufgedreht http://8086.tk/ die alle die Zeiten zu haben scheint und Größen für 8086 (und mehr) Befehlssätze.

Kein Zweifel, Sie offizielle Intel doco im Web mit ähnlichen Informationen finden konnten.

Für Ihre spezielle Frage:

xor ax,ax
inc ax

dauert 3 + 3 = 6 Taktzyklen und 2 + 1 = 3-Bytes während

mov ax,1

4 Taktzyklen dauert und 3 Bytes.

So letzteres ist besser in diesem Fall.


Aber Sie müssen Ihre Bildungseinrichtung über diesen Kerl zu reden. 10% für eine einfache Sache wie die Bettler Glauben.

Sie sollten fragen, was in dem Fall getan werden sollte, in dem Sie zwei Möglichkeiten haben, eine schnellere und eine kürzere.

Dann, sobald sie zugelassen haben, dass es verschiedene Möglichkeiten, um Code je nachdem, was Sie versuchen, sie zu erreichen, sagen, dass, was Sie versuchen zu erreichen Lesbarkeit und Wartbarkeit und ernsthaft nicht einen fliegenden Sprung geben könnte über einen verschwendeten Zyklus oder Byte hier oder dort * a .

ist Optimierung etwas, das man im Allgemeinen tun, ob und wann Sie ein Leistungsproblem haben, nachdem ein Stück Code in einem nahezu vollständigen Zustand ist - es ist fast immer vergebliche Mühe, wenn der Code ist immer noch Gegenstand eine nicht unerhebliche Wahrscheinlichkeit einer Veränderung .

Es lohnt sich, was sub ax,ax erscheint in Bezug auf die Taktzyklen und Bytes mit xor ax,ax gleichauf zu sein, vielleicht Sie, dass in die Mischung beim nächsten Mal werfen könnte ihm etwas mehr Arbeit zu führen.

* a) Nein, nicht wirklich, aber es macht Spaß zu entlüften gelegentlich: -)

Andere Tipps

Du bist besser dran mit

mov AX, 1

auf der 8086. Wenn Sie Tracking-Registerinhalte, können Sie möglicherweise besser, wenn Sie wissen, dass zum Beispiel BX hat bereits eine 1 in es:

mov AX, BX

oder, wenn Sie wissen, dass AH 0:

mov AL, 1

etc.

Je nach Ihren persönlichen Umständen können Sie in der Lage zu entkommen mit ...

 sbb ax, ax

Das Ergebnis wird entweder 0 sein, wenn der Carry-Flag nicht gesetzt ist oder -1, wenn der Carry-Flag gesetzt ist.

Wenn jedoch das obige Beispiel nicht für Ihre Situation ist, würde ich die

empfehlen
xor  ax, ax
inc  ax

Methode. Es soll Ihren Professor für Größe erfüllen. Allerdings, wenn Ihr Prozessor jedes Rohr-Futter beschäftigt, würde ich es erwarte einige Kupplungsartige Verzögerung zwischen den beiden Anweisungen zu sein (ich sehr gut falsch sein könnte auf dem). Wenn eine solche Kopplung existiert, könnte die Geschwindigkeit leicht verbessert werden, indem Sie Ihre Anweisungen Neuordnungs etwas anderen Befehl zwischen ihnen haben (eine, die nicht Axt nicht verwendet).

Hope, das hilft.

würde ich mov [e]ax, 1 unter keinen Umständen verwenden. Seine Codierung ist nicht mehr als die hackier xor Sequenz, und ich bin mir ziemlich sicher schneller, es ist so gut wie überall. 8086 ist einfach seltsam genug, um die Ausnahme zu sein, und wie die Sache so langsam ist, eine Mikro-Optimierung wie diese würde die meisten Unterschiede machen. Aber wo sonst: Ausführung 2 „easy“ Anweisungen werden immer langsamer als 1 ausgeführt wird, vor allem, wenn Sie Daten Gefahren und lange Pipelines betrachten. Sie versuchen, ein Register in der nächsten Anweisung zu lesen, nachdem Sie es ändern, so dass, wenn Ihre CPU können Bypass das Ergebnis von Stufe N der Pipeline (wo die xor ausgeführt wird) bis zur Stufe N-1 (wobei das inc versuchen, Last das Register, egal 1, um seinen Wert hinzufügen), wirst du Stände haben.

Andere Dinge zu beachten: Befehlsabruf Bandbreite (strittig für 16-Bit-Code, beide sind 3 Bytes); mov vermeidet Flags (eher als nützlich als zwingen, sie alle zu Null) zu ändern; je nachdem, was andere Register-Werte halten könnten, könnten Sie vielleicht lea ax,[bx+1] (auch 3 Bytes, auch in 32-Bit-Code, keine Auswirkungen auf die Fahnen) tun; wie andere gesagt haben, könnte sbb ax,ax unter Umständen arbeiten -. es ist auch kürzer bei 2 Bytes

Wenn Sie mit dieser Art von Mikro-Optimierungen konfrontiert sollten Sie wirklich Maßnahme die Alternativen, anstatt blind sogar auf Prozessor-Handbuch angewiesen zu sein.

P. S. Neue Hausaufgaben: ist xor bx,bx schneller als xor bx,cx (auf einem beliebigen Prozessor)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top