Operácie

ZPOC 8: Základy programovania v strojovom kóde: Rozdiel medzi revíziami

Z SensorWiki

(Vytvorená stránka „Tieto jednoduché programy budeme analyzovať v [https://www.asm80.com/ simulátore procesora 8080]. Pri práci je dobrou pomôckou tento [http://senzor.robotika.sk/zp/8…“)
 
 
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="()"}
 
- &#48;
 
+ &#49;
 
 
 
{Aký bude obsah pamäťového miesta s adresou 0040h po vykonaní celého programu?
 
|type="{}"}
 
{ 00|&#48;|00h (i) }
 
 
 
</quiz>
 
 
 
<source lang="asm">
 
</source>
 
 
 
[[Category:Základy počítačov]]
 

Aktuálna revízia z 19:41, 15. november 2022