Operácie

ZPOC Online: 9. Pokračovanie v programovaní procesora

Zo stránky SensorWiki

Verzia z 09:54, 12. november 2020, ktorú vytvoril Balogh (diskusia | príspevky) (Vytvorená stránka „Tento týždeň pokračujeme prácou s trocha náročnejšími programami. == '''Nájdi väčšie z dvoch čísel''' == V pamäti sú za sebou uložené dve čísla.…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)

Tento týždeň pokračujeme prácou s trocha náročnejšími programami.


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

!!! TODO: pripravit nove ulohy na precvicenie!!!

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?