ZPOC online: 8. Základy programovania v strojovom kóde: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 118: | Riadok 118: | ||
000E 76 HLT ; - hotovo | 000E 76 HLT ; - hotovo | ||
</source> | </source> | ||
== Linky == | == Linky == |
Verzia z 09:42, 12. november 2020
Tieto jednoduché programy budeme analyzovať v simulátore procesora 8080. Pri práci je dobrou pomôckou tento ťahák s výberom inštrukcií. Obsluhu simulátora sme vysvetlili na cvičeniach, preto tu nájdete len tento stručný obrázok s opisom.
Nulovanie pamäťového miesta
Vynulujte obsah pamäťového miesta 0010h, do ktorého sme vložili naschvál nejaké číslo (55h), aby ste vedeli skontrolovať, že program naozaj danú pamäťovú bunku vynuluje. Obsah pamäte môžete meniť aj ručne.
V prvom stĺpci je intuitívne riešenie, na ktoré asi prídete hneď - má dĺžku 5 Bajtov a trvá 20 strojových cyklov. V druhom stĺpci je profesionálnejšie riešenie, ktoré je kratšie (4B, 17T) a aj nastaví príznaky. V treťom stĺpci je riešenie pomocou pseudoinštrukcie EQU, ktorá zjednoduší a sprehľadní programovanie. Porovnajte.
POZN.: toto sú programy napísané pre porovnanie vedľa seba, do simulátora musíte napísať len jeden zo stĺpcov, takže Copy/Paste odtiaľto vám nebude fungovať!
myData equ 0010h
org 0010h org 0010h org myData
db 55h db 55h db 55 ; nejake data aby sme mali co vymazat
org 0000h org 0000h org 0000h ; program uloz od 0000h
mvi a,00h sub A sub A ; najprv vynulujem akumulator sub A: A <- A-A = 0
sta 0010h sta 0010h sta myData ; a potom ho presuniem do pamäte
hlt hlt hlt ; stop, koniec
Presuny sem a tam
Tento program nerobí nič užitočné, len presúva data hore dole pomocou rozličných inštrukcií. Program je tu zámerne aj so strojovým kódom a adresami, takže sa nedá Copy/Paste do simulátora. Je to tak preto, že kopírovaním sa nič nenaučíte, je potrebné ten program naozaj napísať.
0000 .ORG 0000h ; tu hovorime, ze program zacne od adresy 0
0000 3E 07 MVI A,07h ; A = 07h - uloz do akumulatora cislo 7
0002 47 MOV B,A ; B = A - obsah akumulatora skopiruj aj do B
0003 4A MOV C,D ; C = D - neviem co je v D, ale skopiruj to do C
0004 32 10 00 STA 0010h ; A = [0010] - do akumulatora skopiruj to co je v pamati na adrese 0010
0007 3E 00 MVI A,00h ; A = 0, mozeme nahradit aj kratsim SUB A - cim vynulujeme A
0009 32 11 00 STA 0011h ; to je vlastne MOV [0011],A cize presun (skopiruj) to co je v A do pamate
000C 3A 10 00 LDA 0010h ; a toto je vlastne MOV A, [0010], cize presun z pamate do A
000F 76 HLT
Súčet dvoch 8-bitových čísel
Spočítajte dve 8-bitové čísla v pamäti. Prvý aj druhý sčítanec sú uložené v pamäti [0010h] a [0011h], výsledok chceme vrátiť tiež do pamäte za oba sčítance, teda na adresu [0012h].
Odskúšajte pre rozličné vstupné data. Ako vieme, že výsledok je OK? Skúste aj také čísla, ktorými prekročíte rozsah. Čo sa stane?
Po preklade spočítajte koľko bajtov zaberajú obe riešenia a koľko SC spotrebujú.
0010 ORG 0010H
0010 02 03 00 DB 02H,03H,00H ; tri cisla v pamati, tretie je 0 rezervovana pre vysledok
0000 ORG 0000
0000 3A 0D 00 LDA 0010H ; do Akumulatora prve cislo z adresy 0010
0003 47 MOV B,A ; presun zatial do B
0004 3A 0E 00 LDA 0011H ; do Akumulatora druhe cislo z nasledujucej adresy
0007 80 ADD B ; A <-- A + B
0008 32 0F 00 STA 0012H ; vysledok odloz na nasledujucu adresu
000B 76 HLT
Tu je nepovinná ukážka, ako sa to dá spraviť aj celkom inak. Sú tam však inštrukcie, ktoré prekračujú rámec povinností na cvičeniach.
0010 .ORG 0010H
0010 02 03 00 DB 02H,03H,00H
0000 .ORG 0000
0000 21 10 00 LXI H,0010h ; do HL adresu prveho cisla na adrese 0010
0003 7E MOV A,M ; do Akumulatora prve cislo z adresy {HL}
0004 23 INX H ; HL <-- HL + 1
0005 86 ADD M ; A <-- A + {HL}
0006 23 INX H ; HL <-- HL + 1
0007 77 MOV M,A ; uloz do pamate {HL}
0008 76 HLT
Výmena
V pamäti sú za sebou uložené dve čísla. Vymeňte ich navzájom.
Pred spustením programu
0010 42 0011 55
Po vykonaní programu
0010 55 0011 42
Program môže vyzerať napríklad takto, znova je vo formáte, ktorý sa nedá Copy/Paste do simulátora. Viete prečo...
0010 .ORG 0010h
0010 42 55 DB 42h,55h
0000 .ORG 0000h
0000 3A 10 00 LDA 0010h ; 1: precitaj do A z 010h
0003 47 MOV B,A ; 2: odloz A do B
0004 3A 11 00 LDA 0011h ; 3: precitaj do A z 011h
0007 32 10 00 STA 0010h ; 4: to rovno zapisem do 010h
000A 78 MOV A,B ; 5: vrat do A to z B
000B 32 11 00 STA 0011h ; 6: zapis to do 011h
000E 76 HLT ; - hotovo
Linky
Precvičovanie
Preštudujte si nasledovný program:
ORG 0000h
MVI A,07h
MOV B,A
MVI A,03h
MOV C,A
HLT
Preštudujte si nasledovný program:
ORG 0040h
DB 01h,03h,05h,07h
ORG 0000h
LDA 0041h
MOV B,A
LDA 0040h
ADD B
STA 0042h
HLT
Preštudujte si nasledovný program:
ORG 0040h
DB 01h,03h,05h,07h
ORG 0000h
LDA 0043h
MOV B,A
LDA 0042h
SUB B
STA 0041h
SUB A
STA 0040h
HLT