Ld
Author
Albert Floresld nebo LD je instrukce procesoru Z80. Název instrukce je odvozen od anglického slova load(Wikislovník). 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. +more 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,N | ld b,N | ld c,N | ld d,N | ld e,N | ld h,N | ld l,N |
Instrukce slouží k naplnění registru konstantou. Délka instrukce je dva byty, druhý byte obsahuje hodnotu konstanty. +more
. Kód instrukce 7 6 5 4 3 2 1 0 1. byte 0 0 cílový registr cílový registr cílový registr 1 1 0 2. byte konstanta konstanta konstanta konstanta konstanta konstanta konstanta konstanta
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ů. +more 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. 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. Instrukce ld a MVI trvají stejný počet T-cyklů.
Přesun hodnoty mezi dvěma registry
Přesun hodnoty mezi dvěma registry | ||||||
---|---|---|---|---|---|---|
ld a,a | ld b,a | ld c,a | ld d,a | ld e,a | ld h,a | ld l,a |
ld a,b | ld b,b | ld c,b | ld d,b | ld e,b | ld h,b | ld l,b |
ld a,c | ld b,c | ld c,c | ld d,c | ld e,c | ld h,c | ld l,c |
ld a,d | ld b,d | ld c,d | ld d,d | ld e,d | ld h,d | ld l,d |
ld a,e | ld b,e | ld c,e | ld d,e | ld e,e | ld h,e | ld l,e |
ld a,h | ld b,h | ld c,h | ld d,h | ld e,h | ld h,h | ld l,h |
ld a,l | ld b,l | ld c,l | ld d,l | ld e,l | ld h,l | ld 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 | ||||||||
---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
1. byte | 0 | 1 | cílový registr | cílový registr | cílový registr | zdrojový registr | zdrojový registr | zdrojový registr |
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.
Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce MOV. Instrukce ld je o jeden T-cyklus rychlejší, než instrukce MOV.
Zápis konstanty na adresu v paměti
Zápis konstanty na adresu v paměti |
---|
ld (hl),N |
Odpovídající instrukcí v instrukční sadě procesoru Intel 8080 je instrukce MVI.
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. +more
. Přesun hodnoty mezi registrem a polovinou indexového registru ld lx,a ld lx,b ld lx,c ld lx,d ld lx,e ld lx,hx ld lx,lx ld a,lx ld b,lx ld c,lx ld d,lx ld e,lx ld hx,lx ld lx,lx ld hx,a ld hx,b ld hx,c ld hx,d ld hx,e ld hx,hx ld hx,lx ld a,hx ld b,hx ld c,hx ld d,hx ld e,hx ld hx,hx ld lx,hx ld ly,a ld ly,b ld ly,c ld ly,d ld ly,e ld ly,hy ld ly,ly ld a,ly ld b,ly ld c,ly ld d,ly ld e,ly ld hy,ly ld ly,ly ld hy,a ld hy,b ld hy,c ld hy,d ld hy,e ld hy,hy ld hy,ly ld a,hy ld b,hy ld c,hy ld d,hy ld e,hy ld hy,hy ld ly,hy
Naplnění poloviny indexového registru konstantou | |
---|---|
ld lx,N | ld hx,N |
ld ly,N | ld hy,N |
Operace s šestnáctibitovými operandy
Naplnění dvojice registrů konstantou
Naplnění dvojice registrů konstantou | ||
---|---|---|
ld bc,NN | ld de,NN | ld hl,NN |
Nastavení ukazatele zásobníku | Nastavení ukazatele zásobníku | Nastavení ukazatele zásobníku |
ld sp,NN | ld sp,NN | 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. +more
. Kód instrukce 7 6 5 4 3 2 1 0 1. byte 0 0 cílový registr cílový registr 0 0 0 1 2. byte nižší byte konstanty nižší byte konstanty nižší byte konstanty nižší byte konstanty nižší byte konstanty nižší byte konstanty nižší byte konstanty nižší byte konstanty 3. byte vyšší byte konstanty vyšší byte konstanty vyšší byte konstanty vyšší byte konstanty vyšší byte konstanty vyšší byte konstanty vyšší byte konstanty vyšší 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ů. +more 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. Odpovídajícími instrukcemi v instrukční sadě procesoru Intel 8080 jsou instrukce LXI.
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),bc | ld (NN),de | ld (NN),hl |
Přesun hodnoty mezi ukazatelem zásobníku a paměťovým místem určeným konstantou | Přesun hodnoty mezi ukazatelem zásobníku a paměťovým místem určeným konstantou | Přesun hodnoty mezi ukazatelem zásobníku a paměťovým místem určeným konstantou |
ld sp,(NN) | ld sp,(NN) | ld sp,(NN) |
ld (NN),sp | ld (NN),sp | ld (NN),sp |
Kód duplicitní instrukce (pouze pro dvojici registrů HL) | ||||||||
---|---|---|---|---|---|---|---|---|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
1. byte | 0 | 0 | 1 | 0 | S | 0 | 1 | 0 |
2. +more byte | nižší byte adresy | nižší byte adresy | nižší byte adresy | nižší byte adresy | nižší byte adresy | nižší byte adresy | nižší byte adresy | nižší byte adresy |
3. byte | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy | vyšší byte adresy |
Instrukce ke svému vykonání potřebuje 6 M-cyklů a doba jejího vykonání trvá 20 T-cyklů. 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ů. +more 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).
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 ke svému vykonání potřebuje 1 M-cyklus a doba jejího vykonání trvá 6 T-cyklů.
Odpovídající instrukcí v instrukční sadě procesoru Intel 8080 je instrukce SPHL.
Umístění instrukcí ld v souboru instrukcí
Rozmístění instrukcí ld v instrukčním souboru procesoru Z80 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
## | . 0 | . +more1 | . 2 | . 3 | . 4 | . 5 | . 6 | . 7 | . 8 | . 9 | . A | . B | . C | . D | . E | . F |
0. | ld bc,NN | ld (bc),a | ld b,N | ld a,(bc) | ld c,N | |||||||||||
1. | ld de,NN | ld (de),a | ld d,N | ld a,(de) | ld e,N | |||||||||||
2. | ld hl,NN | ld (NN),hl | ld h,N | ld hl,(NN) | ld l,N | |||||||||||
3. | ld sp,NN | ld (NN),a | ld (hl),N | ld a,(NN) | ld a,N | |||||||||||
4. | ld b,b | ld b,c | ld b,d | ld b,e | ld b,h | ld b,l | ld b,(hl) | ld b,a | ld c,b | ld c,c | ld c,d | ld c,e | ld c,h | ld c,l | ld c,(hl) | ld c,a |
5. | ld d,b | ld d,c | ld d,d | ld d,e | ld d,h | ld d,l | ld d,(hl) | ld d,a | ld e,b | ld e,c | ld e,d | ld e,e | ld e,h | ld e,l | ld e,(hl) | ld e,a |
6. | ld h,b | ld h,c | ld h,d | ld h,e | ld h,h | ld h,l | ld h,(hl) | ld h,a | ld l,b | ld l,c | ld l,d | ld l,e | ld l,h | ld l,l | ld l,(hl) | ld l,a |
7. | ld (hl),b | ld (hl),c | ld (hl),d | ld (hl),e | ld (hl),h | ld (hl),l | ld (hl),a | ld a,b | ld a,c | ld a,d | ld a,e | ld a,h | ld a,l | ld a,(hl) | ld a,a | |
F. | ld sp,hl | |||||||||||||||
Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | Po prefixu ED | 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 | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX | S indexovým registrem IX |
2. | ld ix,NN | ld (NN),ix | ld hx,N | ld ix,(NN) | ld lx,N | |||||||||||
3. | ld (ix±N),N | |||||||||||||||
4. | ld b,hx | ld b,lx | ld b,(ix±N) | ld c,hx | ld c,lx | ld c,(ix±N) | ||||||||||
5. | ld d,hx | ld d,lx | ld d,(ix±N) | ld e,hx | ld e,lx | ld e,(ix±N) | ||||||||||
6. | ld hx,b | ld hx,c | ld hx,d | ld hx,e | ld hx,h | ld hx,l | ld h,(ix±N) | ld hx,a | ld lx,b | ld lx,c | ld lx,d | ld lx,e | ld lx,h | ld lx,l | ld l,(ix±N) | ld lx,a |
7. | ld (ix±N),b | ld (ix±N),c | ld (ix±N),d | ld (ix±N),e | ld (ix±N),h | ld (ix±N),l | ld (ix±N),a | ld a,hx | ld a,lx | ld a,(ix±N) | ||||||
F. | ld sp,ix |