ld

ld nebo LD je instrukce procesoru Z80. Název instrukce je odvozen od anglického slova load(Wikislovník).[1] Instrukce může naplnit hodnotu registru konstantou, přenášet hodnotu mezi dvěma registry a přenášet hodnotu mezi registrem a místem v paměti, přičemž může pracovat jak se samostatnými registry tak s dvojicemi registrů.

Varianty instrukce

Různé varianty instrukce ld se liší zápisem. Pokud instrukce pracuje s jednobytovým (osmibitovým) operandem, je tento operand označován jedním písmenem, pokud instrukce pracuje s dvojbytovým (šestnáctibitovým) operandem, je tento operand označován dvěma písmeny, pokud instrukce pracuje s paměťovým místem, jsou v zápisu instukce použita dvě písmena v závorkách. U instrukcí ld, které pracující s číselným operandem, je tento operand označován následujícím způsobem:

  • N - osmibitový bezznaménkový operand,
  • NN - šestnáctibitový bezznaménkový operand,
  • ±N - osmibitový znaménkový operand.

První operand instrukce označuje, kam se má hodnota přenést, druhý operand označuje, odkud se má hodnota přenést.

Operace s osmibitovými operandy

Naplnění registru konstantou

Naplnění registru konstantou
ld a,Nld b,Nld c,Nld d,Nld e,Nld h,Nld l,N

Instrukce slouží k naplnění registru konstantou. Délka instrukce je dva byty, druhý byte obsahuje hodnotu konstanty.

Kód instrukce
76543210
1. byte00cílový registr110
2. bytekonstanta

Obecně je možné tuto instrukci zapsat jako ld r,N, kde r je zástupný symbol pro některý z registrů procesoru A, B, C, D, E, H a L. Instrukce ke svému vykonání potřebuje 2 M-cykly a doba jejího vykonání trvá 7 T-cyklů.[2] Registr, se kterým instrukce pracuje, zakódován v třetím až pátém bitu operačního kódu instrukce. Tato trojice bitů je jednotlivým registrům přiřazena jako: 111 - registr A , 000 - registr B, 001 - registr C, 010 - registr D, 011 - registr E, 100 - registr H, 101 - registr L.[3] Kombinace bitů označujících registr může nabývat i hodnoty 110, v tomto případě se jedná o instrukci ld, která ale místo s registrem pracuje s paměťovým místem na adrese HL (viz níže), v případě jiných variant instrukce ld pro osmibitové přenosy může kombinace 110 znamenat, že se o instrukci ld nejedná.

Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce MVI.[4] Instrukce ld a MVI trvají stejný počet T-cyklů.[5]

Přesun hodnoty mezi dvěma registry

Přesun hodnoty mezi dvěma registry
ld a,ald b,ald c,ald d,ald e,ald h,ald l,a
ld a,bld b,bld c,bld d,bld e,bld h,bld l,b
ld a,cld b,cld c,cld d,cld e,cld h,cld l,c
ld a,dld b,dld c,dld d,dld e,dld h,dld l,d
ld a,eld b,eld c,eld d,eld e,eld h,eld l,e
ld a,hld b,hld c,hld d,hld e,hld h,hld l,h
ld a,lld b,lld c,lld d,lld e,lld h,lld l,l

Instrukci je možné obecně zapsat jako ld r1,r2, kde r1 a r2 jsou zástupné symboly pro některý z registrů procesoru A, B, C, D, E, H a L, a slouží k přesunu hodnoty mezi dvěma registry. Délka instrukce je jeden byte.

Kód instrukce
76543210
1. byte01cílový registrzdrojový registr

Instrukce ke svému vykonání potřebuje 1 M-cyklus a doba jejího vykonání trvá 4 T-cykly.[2] Zdrojový i cílový registr jsou v operačním kódu instrukce kódovány stejným způsobem, jak v případě instrukce pro naplnění registru konstantou ld r,N. Instrukce používající stejný stejný registr jako zdrojový i cílový nedělají žádnou smysluplnou akci, k jejich zařazení do instrukčního souboru vedly hardwarové důvody.[1]

Počítač Sprinter využívá ve svém hardwaru těchto „nic nedělajících“ instrukcí k ovládání hardwarového akcelerátoru.[6]

Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce MOV.[4] Instrukce ld je o jeden T-cyklus rychlejší, než instrukce MOV.[5]

Přesun hodnoty z/do speciálního registru
Speciální registry
ld a,ild a,r
ld i,ald i,r

Hodnoty z/do registru I a registru R lze předášet pouze do/z registru A. Délka instrukce k přenosu mezi registrem A a speciálním registrem je dva byty, první byte je prefix ED.

Kód instrukce
76543210
1. byte11101101
2. byte010SR111

Instrukce ke svému vykonání potřebuje 2 M-cykly a doba jejího vykonání trvá 9 T-cyklů.[2] Zdrojový a cílový registr jsou v instrukci kódovány pomocí dvou bitů, kdy bit S určuje směr přenosu (0 - z registru A, 1 - do registru A) a bit R určuje, se kterým registrem bude instrukce pracovat (0 - registr I, 1 - registr R). Instrukce které přenášejí obsah speciálních registrů do registru A navíc jako jediné dvě instrukce ld nastavují příznaky.[1] Po vykonání těchto dvou instrukcí je do příznaku P/V je přenesen stav klopného obvodu IFF, který určuje, zda je povolené či zakázané přerušení.[1]

Zápis konstanty na adresu v paměti

Zápis konstanty na adresu v paměti
ld (hl),N

Instrukce slouží k uložení uložení konstanty na určenou adresu v paměti. Adresa, na kterou se konstanta uloží je určena obsahem registru HL.

Kód instrukce
76543210
1. byte00110110
2. bytekonstanta

Instrukce ke svému vykonání potřebuje 3 M-cykly a doba jejího vykonání trvá 10 T-cyklů.[2] To, že hodnota neukládá do registru, ale na adresu v paměti registrem určenou, je naznačeno kulatýmizávorkami.[1]

Odpovídající instrukcí v instrukční sadě procesoru Intel 8080 je instrukce MVI.[4]

Zápis konstanty na adresu v paměti určenou indexovým registrem
Zápis konstanty na adresu v paměti určenou indexovým registrem
ld (ix±N),Nld (iy±N),N

Instrukce slouží k uložení uložení konstanty na určenou adresu v paměti. Adresa, na kterou se konstanta uloží je určena obsahem registru IX nebo registru IY a offsetem.

Kód instrukce
76543210
1. byte11X11101
2. byte00110110
3. byteoffset
4. bytekonstanta

Instrukce ke svému vykonání potřebuje 5 M-cyklů a doba jejího vykonání trvá 19 T-cyklů.[2] Bit X určuje, zda bude instrukce pracovat s registrem IX (X = 0, první byte je pak prefix IX) nebo registrem IY (X = 1, první byte je pak prefix IY).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 nejsou.[4]

Přesun hodnoty mezi registrem a místem v paměti

Adresa v paměti určená hodnotou registru
Přesun hodnoty mezi registrem a paměťovým místem určeným hodnotou dvojice registrů
ld (hl),ald (hl),bld (hl),cld (hl),dld (hl),eld (hl),hld (hl),lld (bc),ald (de),a
ld a,(hl)ld b,(hl)ld c,(hl)ld d,(hl)ld e,(hl)ld h,(hl)ld l,(hl)ld a,(bc)ld a,(de)

Instrukci je možné obecně zapsat jako ld (r1),r2, resp. ld r2,(r1), kde r1 je zástupný symbol pro některou z dvojic registrů procesoru BC, DE a HL a r2 je zástupný symbol pro některý z registrů procesoru A, B, C, D, E, H a L, a slouží k přesunu hodnoty mezi dvěma registry. Délka instrukce je jeden byte.

Kód instrukce
pro přesun z registru do paměti
při adresování registrem HL
76543210
1. byte01110zdrojový registr
Kód instrukce
pro přesun z paměti do registru
při adresování registrem HL
76543210
1. byte01cílový registr110
Kód instrukce
pro přesun mezi registrem a pamětí
při adresování registrem BC nebo DE
76543210
1. byte000RS010

Není možné přenášet hodnotu mezi libovolným registrem a paměťovým místem pomocí adresovaného pomocí kterékoliv dvojice registrů. Obsah libovolného registru lze přenášet pouze pokud je pro adresi použita dvojice registrů HL, je-li k adresaci použit jiná dvojice registrů, je možné přenášet pouze obsah registru A.[1]

Instrukce používající k adresaci paměti registr HL ke svému vykonání potřebuje 2 M-cykly a doba jejího vykonání trvá 7 T-cyklů.[2] Zdrojový, resp. cílový registr je v operačním kódu instrukce kódován stejným způsobem, jako v případě instrukce pro naplnění registru konstantou ld r,N.

Instrukce používající k adresaci paměti registr BC nebo DE ke svému vykonání potřebuje také 2 M-cykly a doba jejího vykonání trvá 7 T-cyklů.[2] Zdrojový, resp. cílový registr je v instrukci kódovány pomocí bitu R (0 - registr BC, 1 - registr DE) a bit S určuje směr přenosu (0 - z registru do paměti, 1 - z paměti do registru).

Odpovídající instrukcemi v instrukční sadě procesoru Intel 8080 je instrukce MOV v případě instrukcí využívající k adresování paměti registr HL a instrukce LDAX a STAX v případě instrukcí využívající k adresování paměti registr BC nebo DE.[4]

Adresa v paměti určená konstantou
Přesun hodnoty mezi registrem
a paměťovým místem určeným konstantou
ld (NN),ald a,(NN)

Instrukce slouží k přesunu hodnoty mezi registrem A a paměťovým místem určeným konstantou.

Kód instrukce
76543210
1. byte0011S010
2. bytenižší byte adresy
3. bytevyšší byte adresy

Instrukce ke svému vykonání potřebuje 4 M-cykly a doba jejího vykonání trvá 13 T-cyklů.[2] Směr přenosu je určen bitem S (0 - z registru do paměti, 1 - z paměti do registru).

Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce LDA (odpovídá instrukci ld a,(NN)) a STA (odpovídá instrukci ld (NN),a).[4]

Adresa v paměti určená hodnotou indexového registru
Přesun hodnoty mezi registrem a paměťovým místem určeným hodnotou indexového registru
ld (ix±N),ald (ix±N),bld (ix±N),cld (ix±N),dld (ix±N),eld (ix±N),hld (ix±N),l
ld a,(ix±N)ld b,(ix±N)ld c,(ix±N)ld d,(ix±N)ld e,(ix±N)ld h,(ix±N)ld l,(ix±N)
ld (iy±N),ald (iy±N),bld (iy±N),cld (iy±N),dld (iy±N),eld (iy±N),hld (iy±N),l
ld a,(iy±N)ld b,(iy±N)ld c,(iy±N)ld d,(iy±N)ld e,(iy±N)ld h,(iy±N)ld l,(iy±N)

Instrukce slouží k přesunu hodnoty mezi některým registrem a paměťovým místem určeným hodnotou indexového registru a offsetem.

Kód instrukce
pro přesun z registru do paměti
76543210
1. byte11X11101
2. byte01110zdrojový registr
3. byteoffset
Kód instrukce
pro přesun z paměti do registru
76543210
1. byte11X11101
2. byte01cílový registr110
3. byteoffset

Instrukce ke svému vykonání potřebuje 5 M-cyklů a doba jejího vykonání trvá 19 T-cyklů.[2] Bit X určuje, zda bude instrukce pracovat s registrem IX (X = 0, první byte je pak prefix IX) nebo registrem IY (X = 1, první byte je pak prefix IY).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 nejsou.[4]

Operace s polovinami indexových registrů

Instrukce pro přesun hodnoty mezi registrem a polovinou indexového registru nejsou značeny jednotně, překladač assembleru Prometheus označuje poloviny indexových registrů jako hx, lx, hy a ly, překladač assembleru MRS je označuje jako xh, xl, yh a yl, některé překladače assembleru, např. Gens s instrukcemi používající poloviny indexových registrů neumí pracovat vůbec.[1]

Přesun hodnoty mezi registrem a polovinou indexového registru
ld lx,ald lx,bld lx,cld lx,dld lx,eld lx,hxld lx,lx
ld a,lxld b,lxld c,lxld d,lxld e,lxld hx,lxld lx,lx
ld hx,ald hx,bld hx,cld hx,dld hx,eld hx,hxld hx,lx
ld a,hxld b,hxld c,hxld d,hxld e,hxld hx,hxld lx,hx
ld ly,ald ly,bld ly,cld ly,dld ly,eld ly,hyld ly,ly
ld a,lyld b,lyld c,lyld d,lyld e,lyld hy,lyld ly,ly
ld hy,ald hy,bld hy,cld hy,dld hy,eld hy,hyld hy,ly
ld a,hyld b,hyld c,hyld d,hyld e,hyld hy,hyld ly,hy
Naplnění poloviny indexového registru konstantou
ld lx,Nld hx,N
ld ly,Nld hy,N

Operace s šestnáctibitovými operandy

Naplnění dvojice registrů konstantou

Naplnění dvojice registrů konstantou
ld bc,NNld de,NNld hl,NN
Nastavení ukazatele zásobníku
ld sp,NN

Instrukce slouží k naplnění dvojice registrů nebo ukazatele zásobníku konstantou. Délka instrukce je tři byty, druhý a třetí byte obsahují hodnotu konstanty.

Kód instrukce
76543210
1. byte00cílový registr0001
2. bytenižší byte konstanty
3. bytevyšší byte konstanty

Obecně je možné tuto instrukci zapsat jako ld rr,NN, kde rr je zástupný symbol pro některou z dvojic registrů procesoru BC, DE, HL, nebo ukazatel zásobníku SP. Instrukce ke svému vykonání potřebuje 3 M-cykly a doba jejího vykonání trvá 10 T-cyklů.[2] Registr, se kterým instrukce pracuje, zakódován ve čtvrtém a pátém bitu operačního kódu instrukce. Tato dvojice bitů je jednotlivým registrům přiřazena jako: 00 - dvojice registrů BC, 01 - dvojice registrů DE, 10 - dvojice registrů HL, 11 - ukazatel na zásobník SP.[3] Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce LXI.[4]

Naplnění indexového registru konstantou
Naplnění indexového registru konstantou
ld ix,NNld iy,NN

Instrukce slouží k naplnění indexového registru konstantou. Délka instrukce je čtyři byty, třetí a čtvrtý byte obsahují hodnotu konstanty.

Kód instrukce
76543210
1. byte11X11101
2. byte00100001
3. bytenižší byte konstanty
4. bytevyšší byte konstanty

Instrukce ke svému vykonání potřebuje 4 M-cyklů a doba jejího vykonání trvá 14 T-cyklů.[2] Bit X určuje, zda bude instrukce pracovat s registrem IX (X = 0, první byte je pak prefix IX) nebo registrem IY (X = 1, první byte je pak prefix IY).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 nejsou.[4]

Přesun hodnoty mezi dvojicí registrů a místem v paměti

Přesun hodnoty mezi dvojicí registrů
a paměťovým místem určeným konstantou
ld bc,(NN)ld de,(NN)ld hl,(NN)
ld (NN),bcld (NN),deld (NN),hl
Přesun hodnoty mezi ukazatelem zásobníku
a paměťovým místem určeným konstantou
ld sp,(NN)
ld (NN),sp

Instrukce slouží k přesunu hodnoty mezi dvojicí registrů nebo ukazatelem na zásobník a paměťovým místem určeným konstantou. Instrukce ld hl,(NN) a ld (NN),hl jsou v instrukčním souboru procesoru z hardwarových důvodů dvakrát.[1]

Kód instrukce
76543210
1. byte11101101
2. byte01cílový registrS011
3. bytenižší byte adresy
4. bytevyšší byte adresy
Kód duplicitní instrukce
(pouze pro dvojici registrů HL)
76543210
1. byte0010S010
2. bytenižší byte adresy
3. bytevyšší byte adresy

Instrukce ke svému vykonání potřebuje 6 M-cyklů a doba jejího vykonání trvá 20 T-cyklů.[2] duplicitní instrukce pracující pouze s registrem HL je o něco rychlejší, potřebuje ke svému vykonání pouze 5 M-cyklů a doba jejího vykonání trvá 16 T-cyklů.[2] Směr přenosu je v obou případech určen bitem S (0 - z registru do paměti, 1 - z paměti do registru).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 existují pouze pro duplicitní instrukce pracující s dvojicí registrů HL a jsou to instrukce LHLD (odpovídá instrukci ld HL,(NN)) a SHLD (odpovídá instrukci ld (NN),HL).[4]

Přesun hodnoty mezi indexovým registrem a místem v paměti
Přesun hodnoty mezi indexovým registrem
a paměťovým místem určeným konstantou
ld ix,(NN)ld iy,(NN)
ld (NN),ixld (NN),iy

Instrukce slouží k přesunu hodnoty mezi indexovým registrem a paměťovým místem určeným konstantou.

Kód instrukce
76543210
1. byte11X11101
2. byte0010S010
3. bytenižší byte adresy
4. bytevyšší byte adresy

Instrukce ke svému vykonání potřebuje 6 M-cyklů a doba jejího vykonání trvá 20 T-cyklů.[2] Směr přenosu je v obou případech určen bitem S (0 - z registru do paměti, 1 - z paměti do registru). Bit X určuje, zda bude instrukce pracovat s registrem IX (X = 0, první byte je pak prefix IX) nebo registrem IY (X = 1, první byte je pak prefix IY).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 nejsou.[4]

Přesun hodnoty z dvojice registrů do ukazatele zásobníku

Přesun hodnoty z dvojice registrů
do ukazatele zásobníku
ld sp,hl

Instrukce slouží k přesunu hodnoty z dvojice registrů do ukazatele zásobníku. Délka instrukce je jeden byte.

Kód instrukce
76543210
1. byte11111001

Instrukce ke svému vykonání potřebuje 1 M-cyklus a doba jejího vykonání trvá 6 T-cyklů.[2]

Odpovídající instrukcí v instrukční sadě procesoru Intel 8080 je instrukce SPHL.[4]

Přesun hodnoty z indexového registru do ukazatele zásobníku
Přesun hodnoty z indexového registru
do ukazatele zásobníku
ld sp,ixld sp,iy

Instrukce slouží k přesunu hodnoty z indexového registru do ukazatele zásobníku. Délka instrukce je dva byty.

Kód instrukce
76543210
1. byte11X11101
2. byte11111001

Instrukce ke svému vykonání potřebuje 2 M-cykly a doba jejího vykonání trvá 10 T-cyklů.[2] Bit X určuje, zda bude instrukce pracovat s registrem IX (X = 0, první byte je pak prefix IX) nebo registrem IY (X = 1, první byte je pak prefix IY).

Odpovídající instrukce v instrukční sadě procesoru Intel 8080 nejsou.[4]

Umístění instrukcí ld v souboru instrukcí

Rozmístění instrukcí ld v instrukčním souboru procesoru Z80
##.0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F
0. ld bc,NNld (bc),a   ld b,N   ld a,(bc)   ld c,N 
1. ld de,NNld (de),a   ld d,N   ld a,(de)   ld e,N 
2. ld hl,NNld (NN),hl   ld h,N   ld hl,(NN)   ld l,N 
3. ld sp,NNld (NN),a   ld (hl),N   ld a,(NN)   ld a,N 
4.ld b,bld b,cld b,dld b,eld b,hld b,lld b,(hl)ld b,ald c,bld c,cld c,dld c,eld c,hld c,lld c,(hl)ld c,a
5.ld d,bld d,cld d,dld d,eld d,hld d,lld d,(hl)ld d,ald e,bld e,cld e,dld e,eld e,hld e,lld e,(hl)ld e,a
6.ld h,bld h,cld h,dld h,eld h,hld h,lld h,(hl)ld h,ald l,bld l,cld l,dld l,eld l,hld l,lld l,(hl)ld l,a
7.ld (hl),bld (hl),cld (hl),dld (hl),eld (hl),hld (hl),l ld (hl),ald a,bld a,cld a,dld a,eld a,hld a,lld a,(hl)ld a,a
F.         ld sp,hl      
Po prefixu ED
4.   ld (NN),bc   ld i,a   ld bc,(NN)   ld r,a
5.   ld (NN),de   ld a,i   ld de,(NN)   ld a,r
6.   ld (NN),hl       ld hl,(NN)    
7.   ld (NN),sp       ld sp,(NN)    
S indexovým registrem IX
2. ld ix,NNld (NN),ix   ld hx,N   ld ix,(NN)   ld lx,N 
3.      ld (ix±N),N         
4.    ld b,hxld b,lxld b,(ix±N)     ld c,hxld c,lxld c,(ix±N) 
5.    ld d,hxld d,lxld d,(ix±N)     ld e,hxld e,lxld e,(ix±N) 
6.ld hx,bld hx,cld hx,dld hx,eld hx,hld hx,lld h,(ix±N)ld hx,ald lx,bld lx,cld lx,dld lx,eld lx,hld lx,lld l,(ix±N)ld lx,a
7.ld (ix±N),bld (ix±N),cld (ix±N),dld (ix±N),eld (ix±N),hld (ix±N),l ld (ix±N),a    ld a,hxld a,lxld a,(ix±N) 
F.         ld sp,ix      

Reference

  1. a b c d e f g h VILÍM, Tomáš. Assembler a ZX Spectrum, 1. díl. Ústí nad Labem: Proxima - Software, 1992. 
  2. a b c d e f g h i j k l m n o p ZAKS, Rodnay. Programming the Z80. [s.l.]: Sybex, 1981. 624 s. (Third edition). Dostupné online. ISBN 0-89588-094-6. S. 291–347. ((anglicky))  Poznámka: Odkazovaný soubor má desky z jiného vydání knihy, které navíc vyšlo i pod jiným názvem a s jiným ISBN
  3. a b 8ビット CPU Z80命令セット [online]. Rev. 2015-08-23 [cit. 2015-12-31]. Dostupné online. ((japonsky)) 
  4. a b c d e f g h i j k l m DURDA, Frank. 8080/Z80 Instruction Set [online]. [cit. 2016-01-08]. Dostupné v archivu pořízeném dne 2016-02-11. ((anglicky)) 
  5. a b SAPI.CZ - web věnovaný československým osmibitům, zejména počítačům SAPI-1 [online]. [cit. 2017-04-21]. Kapitola Drobnosti / Porovnání instrukcí I8080A, I8085 a Z80. Dostupné online. ((česky)) 
  6. +Gama. Ruské plečky. ZX Magazín. 1999, čís. 3–4, s. 24–27. 

Literatura

  • Príručka strojového kódu pre ZX Spectrum. [s.l.]: Ultrasoft, 1993. 

Související články

Externí odkazy