| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: Assembler Tricks im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo Gemeinde! sorry falls sowas schonmal diskutiert wurde, aber ich wusste nicht genau was ich in die Suchmaske eingeben ...
![]() |
| | #1 (permalink) |
| Registriert seit: 07.07.08 ![]() Likes: 0 | Anzeige Hallo Gemeinde! sorry falls sowas schonmal diskutiert wurde, aber ich wusste nicht genau was ich in die Suchmaske eingeben könnte, um dementsprechende Beiträge zu finden. Nun zu meiner Frage: Mich würde speziell interessieren, warum man bei der Assemblerprogrammierung den folgenden Trick anwendet: xor ax, ax um das ax Register zu löschen. Könnte man nicht einfach schreiben: mov ax, 0 Beschäftige mich erst seit einer Woche mit der Assembler-programmierung, um die Zusammenhänge der Hochsprache C++ besser zu verstehen. Es wäre schön, wenn mir jemand diesen Trick genauer erklären könnte. Grüße Sp4nkie. |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Registriert seit: 26.06.05 ![]() Likes: 0 | Soweit ich weiss spart man sich da auch 1-2 Byte ein. Und wenn man nur geringen Speicher zur Verfügung hat, ist sowas halt eine Menge. |
| | |
| | #4 (permalink) | ||
| Member of Honour ![]() | Zitat:
XOR braucht definitiv nur 1 Takt... wobei ich der Meinung bin, dass MOV auch nur einen Takt brauchen sollte... (rein von dem, was da im Prozessor vor sich geht...) hab jetzt eine Weile gegoogelt und noch immer keine Tabelle gefunden, wo hinter den Instruktionen auch mal die Taktzahl steht (irgendwo hier im Raum muss noch meine gute alte x86-Assembler-Instr.-Liste sein, wo das drauf stand... finde mich aber gerade nicht durch mein Chaos) aber einen Vorteil von XOR gegenüber MOV hab ich noch gefunden XOR braucht weniger Speicherplatz Zitat:
| ||
| | |
| | #5 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Früher war dies tatsächlich schneller (wir reden über 386/486). Dann haben sich die CPU Hersteller an die üblichen Codegenerierungsmuster angepasst, so dass doch recht viele Tricks nicht mehr wirklich schneller sind (z.B das "INC Register" ist bei mir langsamer, als ADD Register,1). Bei den "gewöhnlichen" CPUs werkeln ja im inneren auch noch Microprogramme (Stichwort Microcode ) - die dann entsprechend angepasst werden http://agner.org/optimize/ Edit: jep, kann mich auch ganz genau an eine Tabelle mit 286,386 und 586 + clock Angaben erinnern - aber diese lässt sich nicht mehr auffinden
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #6 (permalink) |
| Moderator ![]() Registriert seit: 30.03.04 ![]() Likes: 14 | Hallo, dieses sieht man oft wenn man Shellcodes schreiben will. Dort sind 0-Bytes (\x00) nicht erlaubt, da das Zielprogramm aufhören würde weiterzuarbeiten. Möchte man dann aber in seinem Shellcode ein Register auf 0 setzen, funktioniert mov ax, 0 nicht, da dort \x00 auftaucht, weswegen man dann z.B. auf xor ax, ax zurückgreifen muss. |
| | |
| | #7 (permalink) |
| Registriert seit: 25.11.05 ![]() Likes: 0 | cdw: woher weisst du, dass inc langsamer ist? Tests oder Spezifikation? |
| | |
| | #8 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Einerseits steht es irgendwo in der Doku, anderseits: kann es jeder selber testen Ist nur als Beispiel wie man es andwenden kann - die TIMERS.INC hänge ich mal an - sonst lässt es sich mit MASM und Code: \masm32\bin\ml /c /coff /nologo test.asm \masm32\bin\Link /SUBSYSTEM:CONSOLE /MERGE:.rdata=.text test.obj > nul Wobei ich hier auf einem Coure2Duo wieder andere Werte herausbekomme, als auf dem P4 (beide sind gleichschnell bzw der Unterschied ist +-2ms). Zugegebenermaßen habe ich es irgendwann mal aufgegeben, auf großartige Handoptimierungen zu achten und die aktuelle Entwicklung mitzuverfolgen - weil es einfach viel zu Aufwändig wird und im Verhältniss gar nicht so viel bring. Allerdings (imho) lohnt es sich trotzdem noch, etwas in diese Richtung zu machen, weil man dann auch in höheren Sprachen praktisch automatisch andere Entwurfsmuster anwendet oder zumindest bestimmte Details anders implementiert: Beispielsweise sieht man dann den großen Unterschied hier: Code: myarray[][]=new int[1000][1000];
for (i=0;i<1000;i++)
for (j=0;j<1000;j++)
myarray[j][i]=1;
versus:
for (i=0;i<1000;i++)
for (j=0;j<1000;j++)
myarray[i][j]=1;
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #9 (permalink) |
| Registriert seit: 17.04.06 ![]() Likes: 3 | Zählschleifen kann man auch so optimieren... Aber wer macht sowas schon? Code: for (j=999;j--;)
do_sometihing();
__________________ http://chm0815.blogspot.com |
| | |
| | #10 (permalink) | |
| Senior Member | Zitat:
Der Prä-Inkrement- (und auch der Prä-dekrement-)operator ist nämlich immer schneller: Code: Type operator++(int) { // implementierung des postinkrement
Type tmp = *this;
increment_this();
return tmp;
}
Type& operator++() { // implementierung des präinkrement
increment_this();
return *this;
} Inwieweit der Compiler das optimiert, ist mir allerdings nicht bekannt, ich bin mir ziemlich sicher, dass er es bei eingebauten datentypen wie "int" wegoptimiert, aber bei iteratoren über stl-container oder eigene typen sieht es bestimmt schon anders aus. | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Video] A Normal Day Tricks | ivegotmail | Fun Section | 2 | 03.07.07 11:28 |
| Pen Tricks | LaNdRiX | Fun Section | 4 | 07.10.06 14:35 |
| funny billard tricks | SUID:root | Fun Section | 9 | 17.07.06 18:47 |
| 9Live - Die Tricks! | olli | Off topic-Zone | 4 | 29.09.04 23:17 |