Operácie

ASM80 programy: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
Balogh (diskusia | príspevky)
 
(27 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 4: Riadok 5:
Vynulujte obsah pamäťového miesta 0010h.
Vynulujte obsah pamäťového miesta 0010h.


V prvom stĺpci je intuitívne riešenie, na ktoré asi prídete hneď.  
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 a aj nastaví príznaky.  
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.
V treťom stĺpci je riešenie pomocou pseudoinštrukcie EQU, ktorá zjednoduší programovanie.
 
Porovnajte.
Intuitívne MVI A,00h ale lepšie je SUB A, ktoré je kratšie a aj nastaví príznaky. Porovnajte.


<source lang="asm">
<source lang="asm">
        org 0010h
                              myData  equ 0010h
        db 55h          ; nejake data aby sme mali co vymazat
  org 0010h      org 0010h           org myData
             
  db 55h          db 55h              db 55              ; nejake data aby sme mali co vymazat
        org 0000h      ; zaciatok programu
           
        mvi a,00h      ; najprv vynulujem akumulator
  org 0000h      org 0000h          org 0000h          ; zaciatok programu            
        sta 0010h      ; a potom ho presuniem do pamäte
  mvi a,00h      sub A              sub A              ; najprv vynulujem akumulator   sub A: A <- A-A = 0
        hlt            ; stop, koniec
  sta 0010h      sta 0010h          sta myData        ; a potom ho presuniem do pamäte    
  hlt            hlt                hlt                ; stop, koniec                    
</source>
</source>




'''Súčet dvoch 8-bitových čísel'''


Prvý aj druhý sčítanec sú uložené v pamäti, výsledok chceme tiež tam.
== '''Súčet dvoch 8-bitových čísel''' ==
Ako vieme, že výsledok je OK?
 
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ú.


<source lang="asm">
<source lang="asm">
                    CISLO    EQU 0x000D
0010                         ORG 0010H    
000D                         ORG 000DH    
0010   02 03 00              DB  02H,03H,00H   ; tri cisla v pamati, tretie je 0 rezervovana pre vysledok
000D   02 03 00              DB  02H,03H,00H
    
    
0000                          ORG 0000  
0000                          ORG 0000    
0000                START:   
0000  3A 0D 00              LDA  0010H        ; do Akumulatora prve cislo z adresy 0010
0000  3A 0D 00              LDA  000DH 
0003  47                    MOV  B,A           ; presun zatial do B
0003  47                    MOV  B,A  
0004  3A 0E 00              LDA  0011H        ; do Akumulatora druhe cislo z nasledujucej adresy
0004  3A 0E 00              LDA  000EH 
0007  80                    ADD  B             ; A <-- A + B
0007  80                    ADD  B  
0008  32 0F 00              STA  0012H        ; vysledok odloz na nasledujucu adresu
0008  32 0F 00              STA  000FH 
000B  76                    HLT
000B  76                    HLT
</source>
</source>


<source lang="asm">
<source lang="asm">
CISLO EQU 0x000D
                              ORG 0010H    
ORG 000DH    
                              DB  02H,03H,00H
DB  02H,03H,00H
                               
 
                              ORG 0000   
ORG 0000   
                              LXI H, 0010h      ; do HL adresu prveho cisla na adrese 0010
START:   
                              MOV A,M          ; do Akumulatora prve cislo z adresy {HL}
LDA  000DH 
                              INX H            ; HL <-- HL + 1
MOV B,
                              ADD M            ; A <-- A + {HL}
LDA  000EH 
                              INX H            ; HL <-- HL + 1
ADD
                              MOV M,A          ; uloz do pamate {HL}
STA  000FH 
                              HLT
HLT
 
</source>
</source>


<source lang="asm">
                LXI H, 000Dh
                MOV A,M    ; prvy scitanec
                INX H
                ADD M      ; druhy scitanec
                INX H
                MOV M,A    ; uloz vysledok
                HLT


</source>
== '''Nájdi väčšie z dvoch čísel''' ==


'''Nájdi väčšie z dvoch čísel''' a ulož ho na ďalšiu pozíciu v pamäti.
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 100: 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 121: 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    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>


.org    0020H
Preštudujte si nasledovný program:
            db 03h,02h,03h,01h
<source lang="asm">
           
             ORG    0040h
             .ORG   0000
             DB      01h,03h,05h,07h
            LDA     0020H
             MOV    C,A ; Initialize counter
            XRA    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
            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?