Autor |
Beitrag |
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 26.11.06 01:13
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; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 26.11.06 01:56
BenBE hat folgendes geschrieben: | 3. so einfach wie möglich |
Was gefällt dir dann an mov AX, $0000 nicht? 
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 26.11.06 02:11
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 26.11.06 03:03
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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 26.11.06 12:12
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 
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: So 26.11.06 14:23
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.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
BenBE 
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 26.11.06 16:12
Ein paar kleine Nachfragen
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; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|