|
|
Riadok 1: |
Riadok 1: |
| Tieto jednoduché programy budeme analyzovať v [https://www.asm80.com/ simulátore procesora 8080]. Pri práci je dobrou pomôckou tento
| | #presmeruj [[ZPOC 9: Základy programovania v strojovom kóde]] |
| [http://senzor.robotika.sk/zp/8080instructions.pdf ť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.
| |
| | |
| | |
| [[Súbor:Simulator8080a.png]]
| |
| [[Súbor:Simulator8080b.png]]
| |
| | |
| | |
| == '''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ť!
| |
| | |
| <source lang="asm">
| |
| 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
| |
| | |
| </source>
| |
| | |
| | |
| == '''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ť.
| |
| | |
| <source lang="asm">
| |
| | |
| 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
| |
| | |
| </source>
| |
| | |
| == '''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ú.
| |
| | |
| <source lang="asm">
| |
| 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
| |
| </source>
| |
| | |
| 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.
| |
| | |
| <source lang="asm">
| |
| 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
| |
| | |
| </source>
| |
| | |
| == '''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...
| |
| | |
| <source lang="asm">
| |
| 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
| |
| </source>
| |
| | |
| == Linky ==
| |
| * [https://www.asm80.com Asembler a simulátor]
| |
| * [http://senzor.robotika.sk/zp/8080instructions.pdf Ťahák na cvičenia s výberom inštrukcií]
| |
| * [http://www.pastraiser.com/cpu/i8080/i8080_opcodes.html Všetky inštrukcie 8080]
| |
| | |
| | |
| == Precvičovanie ==
| |
| | |
| | |
| Preštudujte si nasledovný program:
| |
| <source lang="asm">
| |
| ORG 0000h
| |
| MVI A,07h
| |
| MOV B,A
| |
| MVI A,03h
| |
| MOV C,A
| |
| HLT
| |
| </source>
| |
| <quiz shuffleanswers=true display=simple>
| |
| {Aký bude obsah registra B po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 7|07|07h|07H }
| |
| | |
| {Aký bude obsah registra A po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 3|03|03h|03H }
| |
| </quiz>
| |
| | |
| | |
| Preštudujte si nasledovný program:
| |
| <source lang="asm">
| |
| ORG 0040h
| |
| DB 01h,03h,05h,07h
| |
| | |
| ORG 0000h
| |
| LDA 0041h
| |
| MOV B,A
| |
| LDA 0040h
| |
| ADD B
| |
| STA 0042h
| |
| HLT
| |
| </source>
| |
| <quiz shuffleanswers=true display=simple>
| |
| {Aký bude obsah registra B po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 3|03|03h|03H }
| |
| | |
| {Aký bude obsah registra A po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 4|04|04h|04H }
| |
| | |
| {Aký bude obsah pamäťového miesta s adresou 0043h po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 7|07|07h|07H }
| |
| | |
| {Aký bude obsah pamäťového miesta s adresou 0042h po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 4|04|04h|04H }
| |
| </quiz>
| |
| | |
| Preštudujte si nasledovný program:
| |
| <source lang="asm">
| |
| 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
| |
| </source>
| |
| <quiz shuffleanswers=true display=simple>
| |
| {Aký bude obsah registra B po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 7|07|07h|07H }
| |
| | |
| {Aký bude obsah pamäťového miesta s adresou 0041h po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 254|FE (i)|0feh (i) }
| |
| | |
| {Aký bude stav príznaku Z (Zero) po vykonaní celého programu?
| |
| |type="()"}
| |
| - 0
| |
| + 1
| |
| | |
| {Aký bude obsah pamäťového miesta s adresou 0040h po vykonaní celého programu?
| |
| |type="{}"}
| |
| { 00|0|00h (i) }
| |
| | |
| </quiz>
| |
| | |
| <source lang="asm">
| |
| </source>
| |
| | |
| [[Category:Základy počítačov]] | |