Keresés

Címkék

2025-04-06

Adatátvitel regiszterek között (MOV, MOVC, MOVX, SETB, CLR)

A MOV instrukció segítségével lehet értékeket másolgatni mindenfele. Fontos tudnivaló, hogy nem lehetséges tetszőleges regiszterek közt ezt megtenni. Az "A" az egyetlen, ami képes bármilyen másik tárolóval adatokat átvinni. Viszont még így is ez a legsokoldalúbb instrukció, mert nagyon sokféle bemenetet fogad el.

A következő programok mindegyike a 47-es számot tölti be az "A"-ba:
    mov a,#47
    mov a,#2fh
    mov a,#101111b
    A mov jelöli a műveletet, az a a célpontot, a # utáni szám pedig a betöltendő konstanst.

Az előző példában előre megírt számot töltöttünk be, nem kellett a memóriában keresgélni. Mi a teendő, ha a memóriából hívnánk elő számot?
Legyen a memória kezdőfelállása a következő:
00    3f 12 46 ee 03 dc 87 31    07
08    62 08 a7 20 25 f7 af 42    0f
Innen keresnénk ki a "0bh" címben található számot. A memóriából való olvasás hasonlít a program által megadott állandó szám beírásának módszeréhez, annyi a különbség, hogy itt nem kell #-et kirakni.
    mov a,0bh        (assembly-memóriacím sosem kezdődhet betűvel, ezért raktam elé 0-t)
    mov a,11
    mov a,1011b
Ez a program nem bh-t, vagyis 11-et tölt be az a-ba, hanem a memória b helyén található számot, ami itt 25.

Lehetőség van továbbá két regiszter között is számokat közölni. Itt az operandusok nyilvánvalóan nem egy regiszterből, és egy számból, hanem két regiszterből tevődnek össze.
    mov r0,a
Ez az R0 regiszterbe másolja az a tatalmát, akármi is legyen az.
Regiszterközi számátvitel esetén az egyiknek a-nak kell lennie, a másiknak meg valamilyen Rx-nek!

A DPTR nevű adatmutató regiszterbe kizárólag konstans értéket lehet betölteni, mivel rajta kívül más nem tud 2 bájtos számot tárolni. Csak ez az egyetlen mód, hogy DPTR értékét megmásítsuk.
    mov dptr,#4321h

Megoldható számok átvitele regiszterek érintése nélkül, ezzel órajeleket lehet megtakarítani. Hasznos, ha kritikus az időzítés.
    mov 50h,6fh
Mivel a sárgával jelölt rész a forrás, avagy hogy mit másolunk, ezért ez az instrukció a 6fh memóriapozícióból visz át számot az 50h-ba.
    mov 0a7h,#90h
    mov 10100111b,#10010000b
Ezekkel pedig számot lehet valamilyen memóriacímbe beírni.

Indirekt címezéssel is lehet számokat másolni. Indirekt címezésre viszont csak az R0 és R1 regiszter képes.
Hasonlít arra, amikor memóriacímet választunk ki, csak itt a címet nem a program, hanem az R0 vagy R1 diktálja. Például nézzen ki így a memória (nem véletlenül kezdődik 50-nél, erről is szó lesz, de nem itt):
50    37 b2 be af 99 7b 6d be    57
58    b2 a8 3f ae a1 0e c1 38     5f
R053h    R15ah
    mov a,@r0
Ez az instrukció az R0 által mutatott memóriacímben (53h) megtalálható számot fogja az a-ba írni, vagyis 0afh-et.
    mov a,@r1
Ez ugyanazt csinálja, mint az előző, csak az R1-et vizsgálja (5ah). Ezután a 3fh-et fog tartalmazni.

Nagy csavar jön itt, mert nem csak bájtokat, hanem biteket is lehet megcímezni. Ez a MOV-nál annyira viszont nem jelentős. Kizárólag a CARRY zászlót lehet igénybevenni, vagyis azt lehet máshova másolni, vagy abBA lehet valamilyen bitcímet másolni. Konstans bit beírására más instrukcióval van lehetőség (SETB és CLR).
    mov c,30h

Továbbá a MOV-nak két más, bitszintű társa is van: CLR és SETB.

SETB
A megjelölt címen található bitet, vagy a CARRY tárolót állítja be 1-re.
setb 2ah
setb c

CLR
A megjelölt címen található bitet, vagy a CARRY zászlót, vagy pedig az a regiszter értékét állítja 0-ra.
clr a
clr c
clr 2ah

A MOV-val eddig csak a processzoron belül mozgathattunk számokat. Viszont van módunk a programmemóriából, és külső RAM-ból számokat utaztatni: MOVC és MOVX.

MOVC
Evvel az instrukcióval a programtárolóból szedhetünk ki adatot, kvázi a programot olvassuk be. A cím meghatározásához az a és az átalunk választott regiszter (dptr vagy prog. számláló) által tárolt szám összegződnek, és ezt az eredményt keresi ki a processzor. Az a-ba kerül a szám.
movc a,@a+dptr
movc a,@a+pc

MOVX
Evvel pedig a külső memóriából/memóriába szedhetünk ki/tehetünk be számot. Az egyik operandus
a, a másik pedig dptr/R0-R1 által mutatott cím.
movx @dptr,a
movx @r0,a
movx @r1,a
movx a,@dptr
movx a,@r0
movx a,@r1

Nincsenek megjegyzések:

Megjegyzés küldése

Mit gondolsz?