Operácie

ASM80 programy: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
 
(24 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
* [http://senzor.robotika.sk/zp/8080instructions.pdf Ťahák na cvičenia s výberom inštrukcií] - neberte nám prosím ťaháky z cvičení!


== '''Nulovanie pamäťového miesta''' ==
== '''Nulovanie pamäťového miesta''' ==
Riadok 26: Riadok 27:
Spočítajte dve 8-bitové čísla v pamäti.
Spočítajte dve 8-bitové čísla v pamäti.
Prvý aj druhý sčítanec sú uložené v pamäti, výsledok chceme vrátiť tiež do pamäte za oba sčítance.
Prvý aj druhý sčítanec sú uložené v pamäti, výsledok chceme vrátiť tiež do pamäte za oba sčítance.
Odskúšajte pre rozličné vstupné data. Ako vieme, že výsledok je OK?
Odskúšajte pre rozličné vstupné data. Ako vieme, že výsledok je OK?
Po preklade spočítajte koľko bajtov zaberajú obe riešenia a koľko SC spotrebujú.


<source lang="asm">
<source lang="asm">
Riadok 42: Riadok 46:


<source lang="asm">
<source lang="asm">
      ORG 0010H   
                              ORG 0010H   
      DB  02H,03H,00H
                              DB  02H,03H,00H
 
                               
      ORG 0000   
                              ORG 0000   
                               LXI H, 0010h      ; do HL adresu prveho cisla na adrese 0010
                               LXI H, 0010h      ; do HL adresu prveho cisla na adrese 0010
                               MOV A,M          ; do Akumulatora prve cislo z adresy {HL}
                               MOV A,M          ; do Akumulatora prve cislo z adresy {HL}
Riadok 55: Riadok 59:
</source>
</source>


'''Nájdi väčšie z dvoch čísel''' a ulož ho na ďalšiu pozíciu v pamäti.
 
== '''Nájdi väčšie z dvoch čísel''' ==
 
V pamäti sú za sebou uložené dve čísla. Nájdi väčšie z nich a ulož ho na ďalšiu pozíciu v pamäti.


<source lang="asm">
<source lang="asm">
 
             .ORG    0010H
             .ORG    000DH
             DB      03H,02H,00H                 ; tri cisla v pamati, tretie je 0 rezervovana pre vysledok
             DB      03H,02H,00H  


             .ORG    0000  
             .ORG    0000  
 
             LXI    H,0010h                    ; do HL adresu prveho cisla na adrese 0010
             LXI    H,000Dh
             MOV    A,M                         ; do Akumulatora prve cislo z adresy {HL}
             MOV    A,M  
             INX    H                           ; HL <-- HL + 1
             INX    H  
             CMP    M                           ; porovnaj {HL} a Akumulátor
             CMP    M  
             JNC    HOTOVO                      ; ak A > {HL} skoc na HOTOVO:
             JNC    DONE
             MOV    A,M                         ; v opacnom pripade presun do A druhu hodnotu
             MOV    A,M  
HOTOVO:     INX    H                           ; HL <-- HL + 1
DONE:       INX    H  
             MOV    M,A                         ; uloz vysledok na nasl. adresu
             MOV    M,A  
             HLT     
             HLT     
</source>
</source>


Inštrukcia CMP M nastaví F tak, ako keby bol obsah z M odpočítaný od obsahu A. Na rozidel od SUB
Inštrukcia CMP M nastaví F tak, ako keby bol obsah z M odpočítaný od obsahu A. Na rozdiel od SUB
však obsah Akumulátora ostáva nezmenený.  
však obsah Akumulátora ostáva nezmenený.  
Ak A je obsah Akumulátora a X je obsah M, tak F je nastavené nasledovne:
Ak A je obsah Akumulátora a X je obsah M, tak F je nastavené nasledovne:
Riadok 87: Riadok 92:




'''Spočítajte N čísel''' so začiatkom na adrese 031h, pričom ich počet je na 030h.
=='''Spočítajte N čísel''' ==
 
Spočítajte N čísel so začiatkom na adrese 031h, pričom ich počet je na 030h.
Výsledok uložte na 040h.
Výsledok uložte na 040h.


Riadok 108: Riadok 115:
</source>
</source>


Nájdi maximum v bloku hodnôt. Prvé číslo v bloku je počet dát, nasleduje
== '''Nájdi maximum v bloku hodnôt.''' ==
neusporiadaná množina hodnôt.
 
V pamäti je uložený blok dát. Prvé číslo v bloku je počet dát, nasleduje
neusporiadaná množina 8-bitových hodnôt.
 
<source lang="asm">
            .org  0020H
            db    03h,02h,03h,01h  ; tri cisla = { 02, 03, 01 }
           
            .org  0000
            lda    0020H
            mov    C,A              ; Initialize counter
            sub    A                ; Maximum = Minimum possible value = 0
            lxi    H,0021H          ; Initialize pointer
BACK:      cmp    M                ; Is number > maximum
            jnc    SKIP              ; Yes, replace maximum
            mov    A,M
SKIP:      inx    H
            dcr    C
            jnz    BACK
            sta    0040H            ; Store maximum number
 
            HLT                      ; Terminate program execution
</source>
 
 
== Úlohy na samostatnú prácu ==
 
Jednotlivé úlohy riešte postupne a spájajte ich do jedného komplexného programu. Za každú vyriešenú úlohu ktorú ukážete cvičiacemu získavate 1 bod.
 
# Vynulujte 5 bajtov pamäte od adresy 070h
# Odložte do pamäte na adresu 70h až 74h hodnoty 1 až 5.
# Vymeňte obsah pamäťových miest 70h a 73h.
# Sčítajte obsah pamäťových miest 72h a 73h a výsledok uložte do 74h
# Odčítajte od 74h obsah 71h a zapíšte späť do 74h
# Nájdite dvojkový doplnok čísla z 72h
 
== 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">
<source lang="asm">
  ; najdi maximum v bloku hdonot
            ORG    0040h
            DB      01h,03h,05h,07h


.org    0020H
             ORG     0000h
             db 03h,02h,03h,01h
             LDA    0041h
           
             MOV    B,A  
            .ORG   0000
             LDA     0040h
             LDA    0020H
             ADD     B
             MOV    C,A ; Initialize counter
            STA     0042h
             XRA     A ; Maximum = Minimum possible value = 0
             HLT      
             LXI     H,0021H ; Initialize pointer
</source>
BACK:      CMP     M ; Is number> maximum
<quiz shuffleanswers=true display=simple>
             JNC     SKIP ; Yes, replace maximum
{Aký bude obsah registra B po vykonaní celého programu?
            MOV    A,M
|type="{}"}
SKIP:       INX    H
{ 3|03|03h|03H }
            DCR    C
 
             JNZ     BACK
{Aký bude obsah registra A po vykonaní celého programu?
             STA    0040H ; Store maximum number
|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


             HLT     ; Terminate program execution
            ORG    0000h
            LDA    0043h
            MOV    B,A
            LDA    0042h
            SUB    B
            STA    0041h
            SUB    A
            STA    0040h
             HLT  
</source>
</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;


Úlohy
{Aký bude obsah pamäťového miesta s adresou 0040h po vykonaní celého programu?
|type="{}"}
{ 00|&#48;|00h (i) }


# Vynulujte 5 bajtov pamäte od 030h
</quiz>
# Odložte do pamäte na adresu 030h až 034h hodnoty 1 až 5.
# Vymeňte obsah pamäťových miest 030h a 033h.
# Sčítajte obsah pamäťových miest 032h a 033h a výsledok uložte do 034h
# Odčítajte od 034h 031h a zapíšte späť do 034h
# Nájdite dvojkový doplnok čísla z 032h


<source lang="asm">
<source lang="asm">

Aktuálna revízia z 11:21, 14. november 2017

Nulovanie pamäťového miesta

Vynulujte obsah pamäťového miesta 0010h.

V prvom stĺpci je intuitívne riešenie, na ktoré asi prídete hneď - má 5B a trvá 20T. 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ší programovanie. Porovnajte.

                              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          ; zaciatok programu             
  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


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, výsledok chceme vrátiť tiež do pamäte za oba sčítance.

Odskúšajte pre rozličné vstupné data. Ako vieme, že výsledok je OK?

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
                              ORG 0010H   
                              DB  02H,03H,00H
                                
                              ORG 0000   
                              LXI H, 0010h      ; do HL adresu prveho cisla na adrese 0010
                              MOV A,M           ; do Akumulatora prve cislo z adresy {HL}
                              INX H             ; HL <-- HL + 1
                              ADD M             ; A <-- A + {HL}
                              INX H             ; HL <-- HL + 1
                              MOV M,A           ; uloz do pamate {HL}
                              HLT


Nájdi väčšie z dvoch čísel

V pamäti sú za sebou uložené dve čísla. Nájdi väčšie z nich a ulož ho na ďalšiu pozíciu v pamäti.

            .ORG    0010H 
            DB      03H,02H,00H                 ; tri cisla v pamati, tretie je 0 rezervovana pre vysledok

            .ORG    0000 
            LXI     H,0010h                     ; do HL adresu prveho cisla na adrese 0010
            MOV     A,M                         ; do Akumulatora prve cislo z adresy {HL}
            INX     H                           ; HL <-- HL + 1
            CMP     M                           ; porovnaj {HL} a Akumulátor
            JNC     HOTOVO                      ; ak A > {HL} skoc na HOTOVO:
            MOV     A,M                         ; v opacnom pripade presun do A druhu hodnotu
HOTOVO:     INX     H                           ; HL <-- HL + 1
            MOV     M,A                         ; uloz vysledok na nasl. adresu
            HLT

Inštrukcia CMP M nastaví F tak, ako keby bol obsah z M odpočítaný od obsahu A. Na rozdiel od SUB však obsah Akumulátora ostáva nezmenený. Ak A je obsah Akumulátora a X je obsah M, tak F je nastavené nasledovne:

 Zero = 1   if   A = X
 Zero = 0   if   A ≠ X
Carry = 1   if   A < X
Carry = 0   if   A ≥ X

(A a X chápeme ako neznamienkové binárne čísla)


Spočítajte N čísel

Spočítajte N čísel so začiatkom na adrese 031h, pričom ich počet je na 030h. Výsledok uložte na 040h.

            .ORG    0030h 
            DB      03h,01h,02h,03h 
            .ORG    0000 

            LDA     0030H 
            MOV     C,A ; Initialize C-counter
            SUB     A ; sum = 0
            LXI     H,0031H ; Initialize pointer
BACK:       ADD     M ; SUM = SUM + data
            INX     H ; increment pointer
            DCR     C ; Decrement counter
            JNZ     BACK ; if counter 0 repeat
            STA     040H ; Store sum

            HLT     ; Terminate program execution

Nájdi maximum v bloku hodnôt.

V pamäti je uložený blok dát. Prvé číslo v bloku je počet dát, nasleduje neusporiadaná množina 8-bitových hodnôt.

            .org   0020H
            db     03h,02h,03h,01h   ; tri cisla = { 02, 03, 01 }
             
            .org   0000 
            lda    0020H 
            mov    C,A               ; Initialize counter
            sub    A                 ; Maximum = Minimum possible value = 0
            lxi    H,0021H           ; Initialize pointer
BACK:       cmp    M                 ; Is number > maximum
            jnc    SKIP              ; Yes, replace maximum
            mov    A,M 
SKIP:       inx    H 
            dcr    C 
            jnz    BACK 
            sta    0040H             ; Store maximum number

            HLT                      ; Terminate program execution


Úlohy na samostatnú prácu

Jednotlivé úlohy riešte postupne a spájajte ich do jedného komplexného programu. Za každú vyriešenú úlohu ktorú ukážete cvičiacemu získavate 1 bod.

  1. Vynulujte 5 bajtov pamäte od adresy 070h
  2. Odložte do pamäte na adresu 70h až 74h hodnoty 1 až 5.
  3. Vymeňte obsah pamäťových miest 70h a 73h.
  4. Sčítajte obsah pamäťových miest 72h a 73h a výsledok uložte do 74h
  5. Odčítajte od 74h obsah 71h a zapíšte späť do 74h
  6. Nájdite dvojkový doplnok čísla z 72h

Linky


Precvičovanie

Preštudujte si nasledovný program:

            ORG     0000h 
            MVI     A,07h 
            MOV     B,A 
            MVI     A,03h 
            MOV     C,A 
            HLT

1 Aký bude obsah registra B po vykonaní celého programu?

2 Aký bude obsah registra A po vykonaní celého programu?


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

1 Aký bude obsah registra B po vykonaní celého programu?

2 Aký bude obsah registra A po vykonaní celého programu?

3 Aký bude obsah pamäťového miesta s adresou 0043h po vykonaní celého programu?

4 Aký bude obsah pamäťového miesta s adresou 0042h po vykonaní celého programu?


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

1 Aký bude obsah registra B po vykonaní celého programu?

2 Aký bude obsah pamäťového miesta s adresou 0041h po vykonaní celého programu?

3 Aký bude stav príznaku Z (Zero) po vykonaní celého programu?

1
0

4 Aký bude obsah pamäťového miesta s adresou 0040h po vykonaní celého programu?