Entwickler-Ecke
Algorithmen, Optimierung und Assembler - MOV AX, 0000h
BenBE - So 26.11.06 01:13
Titel: MOV AX, 0000h
Welche Möglichkeiten gibt es, das AX-Regfister auf 0000h zu setzen, unter folgenden Regeln?
1. Nebeneffektfreiheit (nur AX und Flags dürfen verändert werden)
2. Opcodegrößenbegrenzung (maximal 16 Byte)
3. so einfach wie möglich
4. Kein Self-Modifying Code (Reproduzierbarkeit in Schleifen)
Also solche Dinge, wie halt der Klassiker:
Delphi-Quelltext
1: 2: 3:
| asm XOR AX, AX end; |
tommie-lie - So 26.11.06 01:56
Titel: Re: MOV AX, 0000h
BenBE hat folgendes geschrieben: |
3. so einfach wie möglich |
Was gefällt dir dann an
mov AX, $0000 nicht? ;-)
BenBE - So 26.11.06 02:11
Titel: Re: MOV AX, 0000h
tommie-lie hat folgendes geschrieben: |
BenBE hat folgendes geschrieben: | 3. so einfach wie möglich | Was gefällt dir dann an mov AX, $0000 nicht? ;-) |
Unser Prof. in einer Stunde: |
MOV AX, 0 nutzt doch kein ernsthafter ASM-Programmierer ... |
Fünf Minuten später schreibt er so nen Source an der Tafel ... MOV AX, 0 ...
Ne, mich würde einfach mal interessieren, welche Varianten es da für diesen Befehl gibt.
Mal so paar weitere Beispiele:
Delphi-Quelltext
1: 2: 3: 4:
| asm OR AX, $FFFF NOT AX end; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm @@DoNothingLoop: INC AX JNZ @@DoNothingLoop end; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm @@DoNothingLoop: DEC AX JNZ @@DoNothingLoop end; |
Ich will aber nicht die Kreativität hemmen (mir fallen grad noch 5 weitere ein ;-) Wäre halt mal interessant, welche ASM-Instruktions sich für diesen Zweck missbrauchen lassen ...
Und zu 3. "So einfach wie möglich": Soll Varianten unterbinden, die der Meinung sind, 5 OR Befehle ausführen zu müssen ...
Reinhard Kern - So 26.11.06 03:03
Titel: Re: MOV AX, 0000h
BenBE hat folgendes geschrieben: |
Welche Möglichkeiten gibt es, das AX-Regfister auf 0000h zu setzen, unter folgenden Regeln?
1. Nebeneffektfreiheit (nur AX und Flags dürfen verändert werden)
2. Opcodegrößenbegrenzung (maximal 16 Byte)
3. so einfach wie möglich
4. Kein Self-Modifying Code (Reproduzierbarkeit in Schleifen)
Also solche Dinge, wie halt der Klassiker:
Delphi-Quelltext 1: 2: 3:
| asm XOR AX, AX end; | |
Hallo,
1. MOV AX,0 ist der korrekte Befehl, jeder kann sehen, was beabsichtigt ist.
2. XOR AX,AX hat als einzige Existenzberechtigung die Tatsache, dass es kürzer ist - bei heutigen Programmgrössen > 1 MByte nicht sehr wichtig, hat sich aber eingebürgert, als Speicher noch knapp war.
3. Alles andere ist hirnrissig und muss mit 6 benotet werden - Zweck des Programmierens darf es niemals sein, den Programmablauf zu verschleiern. Programme müssen auch von anderen gewartet werden können. Dazu gibt es eine Anzahl noch weitergehender Regeln, z.B: Eintritt und Austritt eines Unterprogramms an nur je einer einzigen Stelle.
Rein theoretisch könnte man die Null ja auch von einem Server im Internet abrufen...
Gruss Reinhard
tommie-lie - So 26.11.06 12:12
Titel: Re: MOV AX, 0000h
BenBE hat folgendes geschrieben: |
Unser Prof. in einer Stunde: | MOV AX, 0 nutzt doch kein ernsthafter ASM-Programmierer ... |
|
Hm, mich würde die Begründung mal interessieren. Wie Reinhard schon sagte, daß ist die "by design" korrekte Lösung, um eine 0 in das Register AX zu bekommen, dafür ist mov da. xor sieht man nur, weil der Opcode kürzer ist (und man weniger Platz auf der Lochkarte braucht ;-)). Alles andere kann nicht im Sinne des Erfinders sein, zumal
mov AX, $0000 und
xor AX, AX die schnellsten Lösungen sein dürften. Besonders deine Schleifenlösungen sind von der Komplexität her ja schon grausam ;-)
uall@ogc - So 26.11.06 14:23
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| {XOR AH, AH XOR AL, AL}
{OR AX, $FFFF INC AX}
{OR AX, $FFFF NOT AX}
// AND AX, $0000
{PUSH AX NOT AX AND AX, WORD PTR [ESP] ADD ESP, 2}
//SAR AX, 16
{PUSH AX NEG AX ADD WORD PTR [ESP], AX POP AX}
// LEA AX, [$0]
//MOV AX, FS:[$C]
{MOV AX, CS SUB AX, $1B}
//SHR AX, 16
//SUB AX, AX
//IMUL AX,0
//XOR AX, AX
{PUSH $00 POP AX POP AX}
//MOV AX, $0000 |
und alles in möglichen Kombinationen
Wobei statt XOR AX, AX und MOV AX, 0 auch noch SUB AX, AX sinnvoll ist.
BenBE - So 26.11.06 16:12
Ein paar kleine Nachfragen ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| asm PUSH AX NOT AX AND AX, WORD PTR [ESP] ADD ESP, 2
PUSH AX NEG AX ADD WORD PTR [ESP], AX POP AX
MOV AX, CS SUB AX, $1B
PUSH $00 POP AX POP AX end; |
uall@ogc hat folgendes geschrieben: |
Wobei statt XOR AX, AX und MOV AX, 0 auch noch SUB AX, AX sinnvoll ist. |
Gut, Für EXE-Crypter sind alle sinnvoll. ;-)
@Reinhard und tommie-lie: Bei der Aufgabenstellung ging es ja auch weniger um berufliches ASM-Coden, sondern um den Spaß am Programmieren. Und statt die Aufgabenstellung in Frage zu stellen, hättet ihr ja wenigstens mal kurz euch gedanken machen können ...
Ach BTW: Hatten wir den hier schon?
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| asm @@L: ROL AX, 1 INC AX JNZ @@L end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!