Operácie

ASM80 programy: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
Riadok 26: Riadok 26:
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">

Verzia z 20:58, 2. 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 a ulož ho na ďalšiu pozíciu v pamäti.

            .ORG    000DH 
            DB      03H,02H,00H 

            .ORG    0000 

            LXI     H,000Dh 
            MOV     A,M 
            INX     H 
            CMP     M 
            JNC     DONE 
            MOV     A,M 
DONE:       INX     H 
            MOV     M,A 
            HLT

Inštrukcia CMP M nastaví F tak, ako keby bol obsah z M odpočítaný od obsahu A. Na rozidel 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 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. Prvé číslo v bloku je počet dát, nasleduje neusporiadaná množina hodnôt.

  ; najdi maximum v bloku hdonot

			.org    0020H
            db		03h,02h,03h,01h
            
            .ORG    0000 
            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


Úlohy

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