Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 26.11.06 01:56 
user profile iconBenBE 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 26.11.06 02:11 
user profile icontommie-lie hat folgendes geschrieben:
user profile iconBenBE 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
asm
    OR      AX, $FFFF
    NOT     AX
end;


ausblenden Delphi-Quelltext
1:
2:
3:
asm
    AND     AX, 0
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
asm
@@DoNothingLoop:
    INC     AX
    JNZ     @@DoNothingLoop
end;


ausblenden 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 ...

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: So 26.11.06 03:03 
user profile iconBenBE 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 26.11.06 12:12 
user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: So 26.11.06 14:23 
ausblenden volle Höhe 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.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
BenBE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 26.11.06 16:12 
Ein paar kleine Nachfragen ;-)
ausblenden volle Höhe 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
    //Der läuft doch nicht nebeneffektfrei ... Speicherveränderung (auch wenn's nur auf'm Stack ist ;-))
    PUSH AX
    NOT AX
    AND AX, WORD PTR [ESP]
    ADD ESP, 2

    //für AX <  0 würde er doch das Sign-Flag füllen? --> AX=-1, oder täusch ich mich da?
    //SAR AX, 16

    //Nicht Nebeneffektfrei (Speicherveränderung)
    PUSH AX
    NEG AX
    ADD WORD PTR [ESP], AX
    POP AX

    //ACK ;-) An den habsch noch .NET gedacht
    //LEA AX, [$0]

    //Funzt nur unter Windows ... Woher eigentlich $C? Welcher Wert steht dort?
    //MOV AX, FS:[$C]

    //Funzt nur unter Windows. Was macht der eigentlich?
    MOV AX, CS
    SUB AX, $1B

    //Stimmt hier das Stack-Count? Außerdem Speichermanipulation ;-)
    PUSH $00
    POP AX
    POP AX
end;


user profile iconuall@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?
ausblenden 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.