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

  1.  
  2. ; Listing2i.s
  3.  
  4. Anfang:
  5.     lea    $dff000,a0    ; Gib $dff000 in a0
  6. Waitmouse:
  7.     move.w    6(a0),$180(a0)    ; Gib den .W-Wert von $dff006 in COLOR0
  8.                 ; 6(a0)=$dff000+6, $180(a0)=$dff000+$180
  9.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  10.     bne.s    Waitmouse    ; wenn nicht, zurück zu Waitmouse
  11.     rts            ; Ende
  12.  
  13.     END
  14.  
  15. In   dieser  Variante  des  ersten  Listings  sind  Adressierungsdistanzen
  16. eingefügt: in a0 kommt die Adresse $dff000, und dann werden die  Distanzen
  17. angegeben.  Ich  habe  $dff000 gewählt, weil es eine "gerade" Adresse ist,
  18. denn um $dff180 (COLOR0) zu erreichen, brauche ich eine Distanz  von  $180
  19. ($180(a0)), und so ist sofort eindeutig, was für eine Adresse gemeint ist.
  20. Hätte ich hingegen $dff013 in a0 geschrieben hätte, dann wäre $16d(a0) die
  21. richtige  Distanz  gewesen  ($dff013 + $16d = $dff180). Wäre aber nicht so
  22. klar. Zu Beachten ist, daß das Register a0 nie verändert wird, es  bleibt,
  23. wie es ist, $dff000, bei jedem Aufruf zählt der Prozessor die Distanz dazu
  24. und errechnet somit die neue Adresse. In fast allen  Programmen,  die  mit
  25. Grafik  arbeiten,  wird die Adresse $dff000 in irgend ein Register gegeben
  26. und dann  werden  die  Adressierungen  auf  die  gerade  beschriebene  Art
  27. durchgeführt,  auch  OFFSET  genannt.  Somit kann man alle CUSTOM-REGISTER
  28. erreichen, sie gehen von $dff000 bis $dff1fe.  Man  kann  einen  maximalen
  29. Offset von -32768 bis +32767 erreichen, also von -$8000 bis $7FFF.
  30.  
  31. Bemerkung:  Achtet  auf den Unterschied, der zwischen dem LEA und dem MOVE
  32. besteht, wenn eine Adressierungsdistanz verwendet wird:
  33.  
  34.     MOVE.L    $100(a0),a1
  35.  
  36. Kopiert das Longword, das an Adresse a0 plus $100 Bytes ENTHALTEN ist, ins
  37. Register a1. Also: MACHE DIE SUMME VON ADRESSE IN A0 UND OFFSET (DIE ZAHL
  38. VOR DER KLAMMER); DAS RESULTAT DAVON IST DIE ADRESSE, DEREN INHALT IN A1
  39. KOPIERT WIRD.
  40.  
  41. Während:
  42.  
  43.     LEA    $100(a0),a1
  44.  
  45. Gibt in a1 die Adresse a0+$100 selbst, nicht deren Inhalt, denn LEA kann
  46. ausschließlich ADRESSEN laden, KEINE INHALTE.
  47.  
  48. Machen  wir  ein Beispiel, das alles noch ein bißchen klarer macht: Stellt
  49. euch den Speicher wie  eine  lange,  einsame  Straße  mit  vielen  kleinen
  50. Häuschen vor, alle in Reih und Glied, und jedes mit einer Hausnummer. Wenn
  51. wir in a0 die Adresse 0 geben, also die Adresse des  ersten  Hauses,  dann
  52. wird  der  Befehl  MOVE.L  $100(a0),a1  nichts anderes tun, als zu Adresse
  53. a0+$100 = $100 zu gehen, und Teppich, Möbel, Betten usw. in a1  zu  geben.
  54. Es  wurde  also  der  INHALT  des Hauses in $100(a0) kopiert, im Falle des
  55. MOVE.L ein Longword ab der angegebenen Adresse. Mit  dem  LEA  $100(a0),a1
  56. hingegen  wandert  nur die Adresse des Hauses in a1, also $100 + a0 = $100
  57. (im Beispiel),  wir  treten  ins  Haus  nicht  ein.  Der  Unterschied  ist
  58. letztendlich  eben  der, daß wir mit einem MOVE in a1 die Möbel des Hauses
  59. kopiert haben, mit dem LEA nur die Adresse. Für INHALT meine ich das,  was
  60. in der Adresse enthalten ist, denn in jeder Adresse (jedem Haus) ist etwas
  61. enthalten: es können Zahlen sein (die Möbel) oder es kann leer sein  (wenn
  62. das Haus verlassen ist), dafür können wir aber immer NULL ($00) nehmen.
  63.  
  64. Z.B. ist der Befehl:
  65.  
  66.     LEA    $100(a1),a1
  67.  
  68. identisch mit dem Befehl:
  69.  
  70.     ADD.W    #$100,a1
  71.  
  72. In a1 wird eben die Adresse a1+$100 gegeben.
  73.  
  74. Bemerkung:  Die  Adressierungsdistanzen (Offset) könnt ihr in Dezimal oder
  75. in Hexadezimal (mit dem $-Symbol) schreiben, ganz wie´s euch gefällt,  ihr
  76. könnt auch Multiplikationen, Divisionen usw. einfließen lassen:
  77.  
  78.     LEA    $10+3(a1),a2    ; es wird als LEA $30(a1),a2 assembliert
  79.                 ; werden, denn das * steht für 
  80.                 ; MULTIPLIZIERE
  81.  
  82.  
  83.