ZPOC Online: 9. Pokračovanie v programovaní procesora
Zo stránky SensorWiki
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
Domáca úloha
Naprogramujte postupne zadané úlohy. Riešte ich postupne a spájajte ich do jedného komplexného programu. Ak si myslíte, že váš program je už hotový (alebo ak už viac neviete spraviť), vyplňte v Classroome formulár, do ktorého vyplníte stav registrov v ktorom ste skončili.
Najprv do pamäte na adresy 70h až 74h vložte hodnoty zodpovedajúce ASCII kódom prvých piatich písmen vášho krstného mena.
Napríklad pre mňa by obsah pamäte vyzeral takto
0068 00 00 00 00 | 00 00 00 00 0070 52 49 43 48 | 41 00 00 00 0078 00 00 00 00 | 00 00 00 00
- Skopírujte (presuňte) obsah pamäťového miesta 71h na adresu 72h.
- Na adresu 75h vložte hodnotu 1.
- Vypočítajte dvojkový doplnok z čísla uloženého na adrese 73h a výsledok uložte do 74h
- Odčítajte od 71h obsah 72h a výsledok zapíšte späť do 71h
- Sčítajte obsah pamäťových miest 71h a 75h a výsledok uložte do 72h
- Sčítajte obsah pamäťových miest 73h a 74h a výsledok uložte do 73h
[72] <- [71] [75] <- 1 [74] <- ~[73] [71] <- [71] - [72] [72] <- [71] + [75] [73] <- [73] + [74]
Keď skončíte, vložte do formulára odpoveď na otázky:
[70] = ? [71] = ? [72] = ? [73] = ?
Flag Z = ? Flag P = ?
Poznámka: Ak budete ASCII hodnoty vkladať do pamäte pomocou pseudoinštrukcie DB, dávajte pri simulácii pozor, pretože tieto hodnoty sa tam vložia len raz, pri zapnutí emulátora (F10). Ak spustíte program druhý raz, napríklad po stlačení RST, v pamäti ostanú hodnoty tak, ako ste ich tam zanechali. Ak chcete mať znova vložené správne hodnoty, musíte sa prepnúť do editora a späť.
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