Du kan inte deklarera någon "variabel" som pekar på registerparet Y, men du kan använda de båda registren som kallas för Y som en 16-bitars variabel, och du kan namnge dessa två på ett lämpligt sätt.
Som registerpar kan du använda vilka register som helst, inte bara X, Y och Z.
Du kan skapa 16-bitars variabler i två register så här:
1) En variabel lagras i två register, t.ex r20 och r21
2) Du döper dessa register till t.ex. varL och varH
varL betyder de låga 8 bitarna i variabel "var" ( L = låg).
varH betyder de höga 8 bitarna i variablen (H = hög).
Kod: Markera allt
.DEF tmp = r16 ; temporärt register
.DEF varL = r20 ; 16-bitars varabeln "var"
.DEF varH = r21
.DEF annanL = r22 ; 16-bitars varaiblen "annan"
.DEF annanH = r23
Du kan nu göra 16-bitars operationer genom att kombinera 8-bitars operationer.
t.ex addera:
add varL,annanvarL
adc varH,annanvarH
först adderar du de 8 låga bitarna.
minnessiffran får du i "carry"
sedan adderar du de höga bitarna, men med adc istället för add.
adc tar med minnessiffran från föregående addition.
Alltså måste man alltid addera de låga först och de höga sedan.
att jämföra med ett annat tal:
Kod: Markera allt
.EQU KONSTANT = 1000
ldi tmp,high(KONSTANT)
cp valL,low(KONSTANT) ; compare
cpc valH,tmp ;compare med carry
brcs STORRE
MINDRE:
; val är mindre än annan
STORRE:
...
eller om du vill jämföra med exakt det talet:
Kod: Markera allt
.EQU KONSTANT = 1000
cpi varL,low(KONSTANT)
brne OLIKA
cpi varH,high(KONSTANT)
brne OLIKA
LIKA:
...
OLIKA:
...
och subtrahera:
Kod: Markera allt
subi varL,low(KONSTANT)
sbci varH,high(KONSTANT)
brcs NEGATIV ; hoppar om svaret är negativt - kan uteslutas förstås
Om du vill ha variabeln i Y byter du bara ut r20 och r21 mot r28,r29 och kanske byter namnen till YL och YH.
Som du ser i första exemplet använder jag ett temporärt 8-bitars register i instruktionen cpc. Det beror på att det inte finns någon instruktion "cpci KONSTANT", så man måste ladda värdet i tmp och sen köra cpc var,tmp.
För att förstå matematiken bakom detta ska man titta på talen i binärform eller kanske hexadecimalt format. Då förstår man vad som händer, om man förstår vad "carry"-flaggan gör. Det är vanlig binär matematik.
high(KONSTANT) och low(KONSTANT) är bara ett annat sätt att skriva 1000/256 och 1000 & 255, dvs 3 och 232. 3*256+232=1000