Operácie

ASM80 programy: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
Riadok 21: Riadok 21:




'''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?


<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   
START:   
                              LXI H, 0010h      ; do HL adresu prveho cisla na adrese 0010
LDA  000DH 
                              MOV A,M           ; do Akumulatora prve cislo z adresy {HL}
MOV  B,A 
                              INX H             ; HL <-- HL + 1
LDA  000EH 
                              ADD M             ; A <-- A + {HL}
ADD  B 
                              INX H             ; HL <-- HL + 1
STA  000FH 
                              MOV M,A           ; uloz do pamate {HL}
HLT
                              HLT
 
</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>
</source>



Verzia z 20:57, 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?

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