ASM80 programy: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 21: | Riadok 21: | ||
Prvý aj druhý sčítanec sú uložené v pamäti, výsledok chceme tiež | == '''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"> | ||
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 ORG 0000 | ||
0000 3A 0D 00 LDA 0010H ; do Akumulatora prve cislo z adresy 0010 | |||
0000 3A 0D 00 LDA | 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 | 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 | |||
000B 76 HLT | 000B 76 HLT | ||
</source> | </source> | ||
<source lang="asm"> | <source lang="asm"> | ||
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 | |||
</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
- Vynulujte 5 bajtov pamäte od 030h
- 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