home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings / listing3a.s < prev    next >
Text File  |  1977-12-31  |  7KB  |  172 lines

  1.  
  2. ; Listing3a.s    - WIE MAN EINE ROUTINE DES BETRIEBSSYSTEMES AUSFÜHRT
  3.  
  4. Anfang:
  5.     move.l    $4.w,a6        ; Execbase in a6
  6.     jsr    -$78(a6)    ; Disable - stoppt das multitasking
  7. mouse:
  8.     move.w    $dff006,$dff180    ; gib VHPOSR in COLOR00 (Blinken!!)
  9.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  10.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  11.  
  12.     move.l    4.w,a6        ; Execbase in a6
  13.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  14.     rts
  15.  
  16.     END
  17.  
  18. Dieses Listing ist das erste, indem wir eine Routine des  Betriebssystemes
  19. aufrufen.  Und,  Ironie  des Schicksals, ist es genau die Routine, die das
  20. Betriebssystem selbst abschaltet! In der Tat werder ihr  feststellen,  daß
  21. nach ausführen des Programmes der Mauspointer blockiert ist, durch drücken
  22. der  rechten  Maustaste  erscheinen  keine  Menüs  und  die  Disk   Drives
  23. verstummen, kein Click ist mehr zu hören. Un aufgepaßt, auch der Debugger,
  24. "AD", der das Betriebssystem verwendet, wird damit  abgeschaltet,  er  ist
  25. somit  nur  begrenzt  einsetzbar. Probieren wir also ein "AD", und drücken
  26. die Pfeil-nach-rechts-Taste (Mit dieser Taste "steigt" man in die BSR  und
  27. JSR  ein,  während  man  mit  dem Pfeil-nach-unten den Debug diese Befehle
  28. überspringt). Nach dem ersten Befehl, dem MOVE 4.w,a6, wird in Register a6
  29. die  in  dem Long von Speicherzelle $4 enthaltene Adresse erscheinen (also
  30. der Inhalt von Speicherzelle $4, $5, $6 und $7 wird diese Adresse bilden).
  31. Drückt  ESC  und  überprüft  mit einem "M 4", gefolgt von vier Returns: es
  32. wird die gleiche Adresse sein. Diese Adresse wird vom Kickstart nach jedem
  33. Reset  oder Neustart des Amiga an diesen Punkt gelegt. Fahrt mit dem Debug
  34. fort,  geht  beim  MOVE  weiter  und  "steigt"  ins   JSR   -$78(a6)   ein
  35. (Pfeil-nach-rechts):  um  die  Subroutine zu verfolgen, müßt ihr die Zeile
  36. mit dem disassemblierten Code verfolgen (unten  am  Bildschirm),  und  ihr
  37. werdet ein JMP $fcxxxx oder $fcxxxx sehen, jenachdem, ob ihr Kickstart 1.3
  38. oder 2.0/3.0 besitzt. Ihr seid nun an der Adresse, die in $4 enthalten war
  39. minus  $78,  un  dihr befindet euch noch im RAM-Speicher des Amiga, wo ihr
  40. aber einem JMP begegnen werdet, das euch in die ROM führt.  Denn  die  ein
  41. oder  zwei Sekunden, die der Amiga nach einem Reset oder Neustart braucht,
  42. verbringt er damit, eine TABELLE der JMPs im  Ram-Speicher  zu  erstellen,
  43. dessen  letzte  Adresse in $4 landet. Jedes JMP springt zur Adresse dieses
  44. speziellen Kickstarts, wo sich die  Routine  befindet,  die  der  Position
  45. dieses  JMP  gegenüber  seinem  Ende  entspricht.  Z.B. wird mit einem JSR
  46. -$78(a6) das Multitasking außer Kraft gesetzt, sei es nun auf einem  Amiga
  47. mit  Kickstart  1.2,  1.3,  2.0  oder 3.0, genauso wie auf den zukünftigen
  48. Modellen. Wenn z.B. im Kick 1.3 die Routine im  ROM  auf  $fc12345  sitzen
  49. würde,  dann  würde das JMP, das sich $78 unter der Basisadresse befindet,
  50. ein JMP $fc12345 sein, während wenn sie beim Kick 2.0 auf $fc812345  wäre,
  51. dann würde das JMP ein LMP $fc812345. Dieses System erlaubt es auch, einen
  52. Kickstart in die RAM zu laden: es braucht dann nur  die  Tabelle  der  JMP
  53. erzeugt  werden  die  die Routinen anpeilt. Beendet den Debug, nachdem ihr
  54. euch gelangweilt habt, herauszufinden, auf welcher Adresse das JMP war, un
  55. versucht, ein "D diese Adresse" zu machen (Die Adresse der Instruktion ist
  56. die erste Zahl links unten am Bildschirm! Ihr findet sie auch in der Liste
  57. der Register ganz rechts, es ist das PC-Register, oder ProgramCounter, der
  58. die aktuelle Adresse, die sich in Abarbeitung befindet,  registriert,  ihr
  59. müßt  nur  noch ein $ vorne anfügen). Ihr werdet eine Reihe von JMP sehen;
  60. das ist ein Beispiel:
  61.  
  62.     JMP    $00F817EA    ; -$78(a6), also DISABLE
  63.     JMP    $00F833DC    ; -$72(a6) eine andere Routine
  64.     JMP    $00F83064    ; -$6c(a6) eine andere Routine...
  65.     JMP    $00F80F74    ; ....
  66.     JMP    $00F80F0C
  67.     JMP    $00F81B74
  68.     JMP    $00F81AEC
  69.     JMP    $00F8103A
  70.     JMP    $00F80F3C
  71.     JMP    $00F81444
  72.     JMP    $00F813A0
  73.     JMP    $00F814F8
  74.     JMP    $00F82842
  75.     JMP    $00F812F8
  76.     JMP    $00F812D6
  77.     JMP    $00F80B38
  78.     JMP    $00F82C24
  79.     JMP    $00F82C24
  80.     JMP    $00F82C20
  81.     JMP    $00F82C18
  82.  
  83. Um Teile des disassemblierten Codes einzufügen, habe ich den  Befehl  "ID"
  84. verwendet,  bei  dem  die Start- und die Endadresse des Bereichs anzugeben
  85. ist, die eingefügt werden soll:
  86.  
  87. BEG> hier wird die Adresse oder das Label  eingegeben,  probiert  mit  der
  88.      Adresse  des JMP 
  89.     
  90. END> Die Endadresse  eingeben, oder  $xxxxx+$80, mit $xxxxx  meine ich die 
  91.      Startadresse. In diesem Fall wird man das Disassemblierte von Adresse 
  92.      $xxxxx bis zur  Adresse $80 Bytes danach erhalten.
  93.  
  94. REMOVE UNUSED LABELS) (Y/N)    ; HIER EIN "Y" EINGEBEN. Wenn ihr nein sagt,
  95.                 ; wird ein Label  mit der  Adresse zu jeder
  96.                 ; Zeile beigefügt,  und nicht  nur dort, wo
  97.                 ; ein Label gebraucht wird. Probiert ein ID
  98.                 ; dieses  Listings zu machen  um den Unter-
  99.                 ; schied zu erfahren.
  100.  
  101. Beispiel: wenn die Adresse $32123 war
  102.  
  103. BEG> $31223
  104. END> $32123+$80    ; BEMERKUNG: um die alten Adressen wiederzubekommen,
  105.         ; drückt einige Male die Pfeil-nach-oben-Taste.
  106.         ; Dadurch erscheinen die Dinge, die ihr vorher getippt
  107.         ; habt, gleich wie bei der SHELL
  108.  
  109. Und es wird der disassemblierte Code ab dem Punkt  erscheinen,  indem  ihr
  110. zuletzt mit dem Cursor wart.
  111.  
  112. Nun  könnt  ihr  euch  vorstellen,  wieviele  JSR  und  JMP  der Prozessor
  113. ausführen muß, wenn ein Programm einige  solcher  Routinen  verlangt.  Und
  114. dieses  ganze  Gespringe  ist  ein  Zeitverlust,  deswegen  werden wir das
  115. Betriebssystem so wenig wie nur möglich benützen.
  116.  
  117. Wenn ihr mit dem Debug nach dem JMP weitermacht, werdet ihr  euch  in  der
  118. ROM  befinden,  also an der Adresse des JMP: Normalerweise ist das Disable
  119. so :
  120.  
  121.     MOVE.W    #$4000,$dff09a    ; INTERN - Stoppt die interrupt
  122.     ADDQ.B    #1,$126(a6)    ; Stoppt das Betriebssystem
  123.     RTS
  124.  
  125. Wenn ihr in die ROM "einsteigt", indem ihr die Pfeil-rechts Taste  drückt,
  126. werdet  ihr  die  Befehle  sehen,  aber  nicht  ausführen:  das  ist  eine
  127. Sicherheitsmaßnahme des Debug, wenn  er  außerhalb  des  Listings  landet,
  128. meistens  eben  in  der  ROM,  dann  werden die Befehle nur angezeigt. Ihr
  129. werdet euch im Loop der Maus befinden, aber trotzdem den  Pointer  bewegen
  130. und  das unverwechselbares CLICK der Laufwerke hören, ihr führt also diese
  131. beiden  Operationen  nicht  aus.  Ihr  könnt  auch  in  das  JSR  -$7e(a6)
  132. einsteigen und und dann wieder verlassen.
  133.  
  134. Probiert  aber  im  Debug  mit  der  Pfeil-nach-unten Taste am JSR -78(a6)
  135. vorbeizurauschen: Diesmal wird euch das Programm entwischen, da sie  jetzt
  136. ausgeführt  werden (ohne jedoch angezeigt zu werden). Ihr könnt aber immer
  137. noch mit der linken Taste aussteigen,  danach  ESC,  um  den  Debugger  zu
  138. verlassen.
  139.  
  140. Probiert diese Änderung:
  141.  
  142. 1) Assembliert, dann macht ein "D Anfang" und ihr werdet folgendes sehen:
  143.  
  144.     MOVE.L    $0004.w,A6
  145.  
  146. Probiert das .w nach dem 4 wegzulassen,  assembliert  und  wiederholt  den
  147. Schritt von vorher:
  148.  
  149. MOVE.L $00000004,A6
  150.  
  151. Wie ihr seht, werden in diesem Fall alle vier Bytes der Adresse verwendet,
  152. während  mit  dem .w zwei gespart wurden. Die Operation ".W" kann auf alle
  153. Adressen angewandt werden, die nur ein Word oder kürzer sind.
  154.  
  155. 2) Probiert die Zeile
  156.  
  157.     JSR    -$78(a6)
  158.  
  159. durch die folgende Zeile zu ersetzen:
  160.  
  161.     MOVE.W    #$4000,$dff09a    ; INTERN - Stoppt die Interrupt
  162.     ADDQ.B    #1,$126(a6)    ; Stoppt das Betriebssystem
  163.  
  164. Oder durch das, was ihr in der ROM nach dem JMP vorfindet  (Ohne  dem  RTS
  165. zum Schluß!).
  166.  
  167. Ihr werdet bemerken, daß das Resultat das gleiche ist.
  168.  
  169. Das gleiche gilt für JSR -$7e(a6).
  170.  
  171.  
  172.