elomax

[ Techniek ] [ Shop ] [ Site map
Instructies ] Program counter PC ] Accumulatoren A en B ] Index IX en IY ] Stackpointer SP ] Condition code CCR ] [ Adressering ] Geheugenmap ] Instructieset ]

Terug
Omhoog

Adressering

Zoals besproken kennen instructies twee kenmerken:

  1. Wàt de CPU moet doen (de 'operator'.)

  2. Waarmée de CPU dit moet doen (de 'operand'.)

De operator is vastgelegd in de instructie. Om aan te geven welke operand(s) gebruikt moeten worden, kent de 68HC11 verschillende wijzen van adresseren. Adresseren wil zoveel zeggen als: 'aanwijzen waar de operand(s) staan'.

Inherent adresseren

Bij inherente adressering blijkt al uit de instructie waar de operand staat. Dit is het geval bij de instructies die rechtstreeks op een register werken (bijvoorbeeld op '0' zetten, of 1 verhogen.)

Notatie: <instructie>

Voorbeeld:

<adres> <instructie>
$B600    CLRA        Clear accumulator A.

Accumulator A wordt met 0 geladen.

Immediate adresseren

Bij immediate adresseren staat de operand onmiddellijk achter de instructie, dus in de programmacode.

Notatie: <instructie> #10

Voorbeeld:

<adres> <instructie>
$B600    LDAA #10    Load accumulator A.

Accumulator A wordt met 10 geladen.

Direct adresseren

Direct adresseren kan toegepast worden wanneer de operand zich in de eerste 256 bytes van de geheugenmap van de processor bevindt. Bij het adresseren van de operand kan dan volstaan worden met een adres van één byte. Deze wijze van adresseren spaart dus programmaruimte. Wanneer mogelijk, zal de assembler er automatisch voor zorgen dat deze compacte wijze van adresseren gebruikt wordt. De assembler wordt verderop besproken.

Notatie: <instructie> adres

Voorbeeld:

<adres> <instructie>
$B600    LDAA $0003  Load accumulator A.

Accumulator A wordt geladen met de inhoud van
adres $0003 in het datageheugen. Omdat dit adres
kleiner is dan $100 (en dus in één byte past),
kan 'direct' adressering worden gebruikt.

Extended adresseren

Wanneer de operand zich niet in de eerste 256 bytes van de geheugenmap bevindt, moet het volledige adres opgegeven worden. Dit adres neemt dus twee bytes in het programmageheugen in beslag.

Notatie: <instructie> adres

Voorbeeld:

<adres> <instructie>
$B600    LDAA $1023  Load accumulator A.

Accumulator A wordt geladen met de inhoud van
adres $1023. Dit adres mag elke waarde hebben.

Indexed adresseren

Bij indexed (geïndexeerd) adresseren wordt één van de indexregisters eerst geladen met een basis-adres. Vervolgens kan dan geadresseerd worden, relatief tov. dit basis-adres. De afstand van de gewenste lokatie tot dit adres wordt opgegeven in een 'offset', die maximaal 255 kan zijn. De offset past dus in één byte.

Notatie: <instructie> offset,register

Voorbeeld:

<adres> <instructie>
$B600    LDD 0,Y     Load accumulator D.

Accumulator D wordt geladen met de inhoud van het adres waar IY naartoe wijst. Omdat accumulator D de samenvoeging is van accumulator A en accumulator B, zal deze instructie twee databytes lezen. Het eerste byte
dat gelezen wordt (het byte waar IY naar wijst) zal in accumulator A gezet worden. Het volgende byte in het geheugen (het byte met adres IY+1), wordt in accumulator B gezet.

Of:

<adres> <instructie>
$B600    LDAA 3,X    Load accumulator A.

Accumulator A wordt geladen met de inhoud van het adres
dat 3 bytes hoger ligt dan waar IX naartoe wijst.

Relative adresseren

Relatieve adressering gebeurt bij sprong-opdrachten ('branches') die de program counter een bepaald aantal bytes verhogen of verlagen. Hiermee kan teruggesprongen worden, maar ook vooruit. De afstand waarmee gesprongen kan worden (de offset) is beperkt. Wanneer U in Uw programma een te grote sprong wilt maken, krijgt U van de assembler een foutmelding. De assembler wordt verderop besproken.

Notatie: <instructie> offset

Voorbeeld:

<adres> <instructie>
$B600    BNE 5       Branch not equal.

Als de Zero-vlag in het CCR niet gezet is, wordt offset (in dit geval 5) bij de program counter opgeteld. Indien de vlag wel gezet is, wordt de program counter niet veranderd.

De offset wordt opgeteld bij de waarde die de program counter heeft nàdat de 'branch' instructie gelezen werd. Alle branch-instructies bestaan uit twee bytes. In het bovenstaande voorbeeld zou de program counter dus de waarde $B607 krijgen ($B602 + 5.)

De offset mag ook een negatief getal zijn. Hierdoor kan worden teruggesprongen naar een plaats die eerder in het programma ligt.

Het grootste positieve getal dat in één byte past, is 127. Als de branch instructie op adres $B600 staat, kan dus niet verder gesprongen worden dan naar adres $B681 ($B602 + 127 = $B681.)

Het grootste negatieve getal dat in één byte past, is -128. Als de branch instructie op adres $B600 staat, kan dus niet verder teruggesprongen worden dan naar adres $B582 ($B602 - 128 = $B582.)

Vanaf het adres van de branch instructie kan de sprong niet groter zijn dan:

  • 126 bytes terug
  • 129 bytes verder

Wanneer U een programma schrijft, hoeft U uiteraard niet met de hand het aantal bytes voor een branch instructie uit te tellen. Deze berekeningen (en andere) worden allemaal voor U gedaan door de assembler. De assembler geeft ook een foutmelding wanneer U een programma meer dan het toegestane aantal bytes vooruit of terug wilt laten springen.

Vorige ] Volgende ]

© 2005...2008 Elomax [Voorwaarden ]