Entwickler-Ecke

Off Topic - ASM-Code kann mir das mal einer erläutern?


Neidhard von Reuental - Fr 12.12.03 16:59
Titel: ASM-Code kann mir das mal einer erläutern?
:?:

hi ich habe hier einen beispielcode für einen trainer vor mir liegen aber blicke irgendwie nicht richtig durch.
kann mir mal jemand erklären was der code genau macht?


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:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
    .586p
GetBase    macro  Reg
    call  $+5
    pop  Reg
    sub  Reg,$-1
    endm

Code    segment  use32
    org  0

    dd  offset End_of_file
    dw  1    ; Version
    dd  End_of_header   ; Size of header
    dd  offset  Selections
    dd  offset  Selections_Text
    dd  offset  ID_List
    dd  offset  Entry
    dd  0 ; res1
    dd  0 ; res2
    db  0 ; Master Enable

End_of_header  equ  $




Entry:

    ;
    ; this code will be called after the game is loaded but before
    ; it is launched , it should be able to check for Pal/NTSC version
    ; and if multi xbe files is used in the game.
    ;

          mov     edi,010114h     ; xbe Time and Date  
          cmp     dword ptr [edi],03DBF9447h
          jne     Exit


    ;
    ; Get base of this start module location
    ;

;    GetBase  ebp    ; no need, ebp point to this start module location

    cld
  
    ;
    ; is credit trainer enabled
    ;
    
    cmp  [Sel_Credits+ebp],0
    je  Exit
    
    mov  al,0ebh
    mov  edi,0105fb1h  ; jmp

    stosb  

Exit:

    ret


ID_List    label   dword
    dd  04b4e0013h ; Frogger Beyond id
    dd  0


Selections  label   byte

Sel_Credits  db  0
Sel_Noreload  db  0


Selections_Text  label  word
    dd  offset  Text_Menu
    dd  offset  Text_Info

    dd  offset  text_credits
;    dd  offset  text_noload

    dd  0


Text_Menu  db  'Frogger Beyond +1',0
Text_Info  db  'Trainer By EvoX Team :-)',0
    db  0 ; End of info

text_credits  db  'Unlimited Lives',0
;text_noload  db  'No reload',0

End_of_file  equ  $

Code    ends



    end


das für mich wichtigste ist was ab "entry" geschieht. der code davor bleibt immer der gleiche.


Chatfix - Fr 12.12.03 17:43

Welche Sprache ist das?


Anonymous - Fr 12.12.03 17:49

@chatfix: Assembler


Raphael O. - Fr 12.12.03 17:49

wie schon im Titel steht ist das Assembler...
und falls du die Kommentare meinst: die sind Englisch :P :mrgreen:

oder meinst du was ganz andres??


CenBells - Fr 12.12.03 18:49

hallo


ich probier es mal

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
           
mov     edi,010114h     // hier schreibt er den wert von edi an adresse 010114h  
cmp     dword ptr [edi],03DBF9447h // jetzt vergleicht er, ob die adresse auf die der inhalt von edi zeigt gleich 03dbf9947h ist ich vermute, [edi] bedeutet der tatsächliche inhalt
jne     Exit  // wenn es nicht gleich ist (jump not equal) springt er zum label exit
      cld // keine ahnung, clear irgendwas
cmp   [Sel_Credits+ebp],0 // hier vergleicht der code den inhalt von SEL_Credits + ebp mit 0
je   Exit // ist der inhalt gleich null, so springe zum exit
       
mov   al,0ebh  //schreibe den inhalt von al an adresse 0ebh
mov   edi,0105fb1h   ; jmp //schreibe den inhalt von edi an 0105fb1h

stosb    // keine ahnung, könnte sein store irgendwas

Exit:   // label exit; wie ein prozedur name ein sprungpunkt
      ret // return: das springt wieder in den code zurück, der zum label entry gesprungen ist


Gruß
Ken


Chatfix - Fr 12.12.03 18:58

aso, sah ohne die delphitags bzw generell so komisch aus...
ich wusste nicht das ASM die abk. für assambler ist, man lernt ja nie aus...


Neidhard von Reuental - Sa 13.12.03 10:03

hat mir schon stück weitergeholfen
"stosb" ist irgend wie nen lückenfüller

mega thx :)


AndyB - Sa 13.12.03 13:53

Neidhard von Reuental hat folgendes geschrieben:
"stosb" ist irgend wie nen lückenfüller

Ich würde es eher als Store String Byte, wobei das String hier nicht als Zeichenkette zu verstehen ist, sondern als Array of Byte/Char.

stosb schreibt den in al stehenden Wert an die Speicheradresse ds:[edi] und erhöht danach edi


Zitat:
[edi] bedeutet der tatsächliche inhalt

[edi] liefert dir den Wert, der an der Speicheradresse edi liegt.
[edi] in Pascalschreibweise wäre: edi^


cld setzt dir Richtung für die stosX Befehle. Ist das direction-Flag gelöscht (cld = clear direction flag), wird edi durch stosX erhöht, sonst (std = set direction flag) dekrementiert. Man sollte nach einem Aufruf von std die Richtung wieder mit cld herstellen, da viel Code sich darauf verlässt.


Zitat:
cmp [Sel_Credits+ebp],0 // hier vergleicht der code den inhalt von SEL_Credits + ebp mit 0

Der Satz ist zweideutig. Hier wird der Inhalt der Speicheradresse, die durch Sel_Credits+EBP Adressiert wird mit 0 verglichen.

Zitat:
mov edi,010114h // hier schreibt er den wert von edi an adresse 010114h
mov al,0ebh //schreibe den inhalt von al an adresse 0ebh
mov edi,0105fb1h ; jmp //schreibe den inhalt von edi an 0105fb1h

Beides ist falsch. MOV kopiert den Wert rechts in das Register links.
Man merke: Unter MASM/TASM werden Speicherstellen immer mit [ ] angesprochen. Das [ ] entspricht also dem Dereferenzieren mit ^ unter Pascal.


CenBells - Sa 13.12.03 15:16

AndyB hat folgendes geschrieben:

Beides ist falsch. MOV kopiert den Wert rechts in das Register links.


Ja ja, alter besserwisser *G* :wink: Ich habe nur mein beschränktes Assemblerwissen hervorgekramt. Beim MC68000 ist es allerdings so, wie ich geschrieben hab. Da wird der links nach rechts kopiert. Hab ich extra gerade nochmal nachgeschlagen. :wink:

Gruß
Ken


AndyB - Sa 13.12.03 17:09

Beim NASM wird auch links nach rechts kopiert aber eben nicht beim Microsoft Macro Assembler (MASM) und Borland Turbo Assembler (TASM).


Neidhard von Reuental - Sa 13.12.03 19:21

hab geschaft was ich machen wollte. danke für eure hilfe.
mein asm-wissen beruht nur auf bruchstücke meiner c64-zeit :roll: