ASM80 programy: Rozdiel medzi revíziami
Z SensorWiki
(→Precvičovanie) |
|||
(27 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
+ | * [http://senzor.robotika.sk/zp/8080instructions.pdf Ťahák na cvičenia s výberom inštrukcií] - neberte nám prosím ťaháky z cvičení! | ||
== '''Nulovanie pamäťového miesta''' == | == '''Nulovanie pamäťového miesta''' == | ||
Riadok 4: | Riadok 5: | ||
Vynulujte obsah pamäťového miesta 0010h. | Vynulujte obsah pamäťového miesta 0010h. | ||
− | V prvom stĺpci je intuitívne riešenie, na ktoré asi prídete hneď. | + | 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 a aj nastaví príznaky. | + | 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. | V treťom stĺpci je riešenie pomocou pseudoinštrukcie EQU, ktorá zjednoduší programovanie. | ||
− | + | Porovnajte. | |
− | |||
<source lang="asm"> | <source lang="asm"> | ||
− | + | 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 | ||
</source> | </source> | ||
− | |||
− | 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? | ||
+ | |||
+ | Po preklade spočítajte koľko bajtov zaberajú obe riešenia a koľko SC spotrebujú. | ||
<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> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == '''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. | |
<source lang="asm"> | <source lang="asm"> | ||
− | + | .ORG 0010H | |
− | .ORG | + | DB 03H,02H,00H ; tri cisla v pamati, tretie je 0 rezervovana pre vysledok |
− | DB 03H,02H,00H | ||
.ORG 0000 | .ORG 0000 | ||
− | + | LXI H,0010h ; do HL adresu prveho cisla na adrese 0010 | |
− | LXI H, | + | MOV A,M ; do Akumulatora prve cislo z adresy {HL} |
− | MOV A,M | + | INX H ; HL <-- HL + 1 |
− | INX H | + | CMP M ; porovnaj {HL} a Akumulátor |
− | CMP M | + | JNC HOTOVO ; ak A > {HL} skoc na HOTOVO: |
− | JNC | + | MOV A,M ; v opacnom pripade presun do A druhu hodnotu |
− | MOV A,M | + | HOTOVO: INX H ; HL <-- HL + 1 |
− | + | MOV M,A ; uloz vysledok na nasl. adresu | |
− | MOV M,A | ||
HLT | HLT | ||
</source> | </source> | ||
− | Inštrukcia CMP M nastaví F tak, ako keby bol obsah z M odpočítaný od obsahu A. Na | + | 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ý. | však obsah Akumulátora ostáva nezmenený. | ||
Ak A je obsah Akumulátora a X je obsah M, tak F je nastavené nasledovne: | Ak A je obsah Akumulátora a X je obsah M, tak F je nastavené nasledovne: | ||
Riadok 100: | Riadok 92: | ||
− | '''Spočítajte N čísel''' so začiatkom na adrese 031h, pričom ich počet je na 030h. | + | =='''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. | Výsledok uložte na 040h. | ||
Riadok 121: | Riadok 115: | ||
</source> | </source> | ||
− | Nájdi maximum v bloku hodnôt. Prvé číslo v bloku je počet dát, nasleduje | + | == '''Nájdi maximum v bloku hodnôt.''' == |
− | neusporiadaná množina 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. | ||
+ | |||
+ | <source lang="asm"> | ||
+ | .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 | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == Ú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. | ||
+ | |||
+ | # Vynulujte 5 bajtov pamäte od adresy 070h | ||
+ | # Odložte do pamäte na adresu 70h až 74h hodnoty 1 až 5. | ||
+ | # Vymeňte obsah pamäťových miest 70h a 73h. | ||
+ | # Sčítajte obsah pamäťových miest 72h a 73h a výsledok uložte do 74h | ||
+ | # Odčítajte od 74h obsah 71h a zapíšte späť do 74h | ||
+ | # Nájdite dvojkový doplnok čísla z 72h | ||
+ | |||
+ | == Linky == | ||
+ | * [https://www.asm80.com Asembler a simulátor] | ||
+ | * [http://senzor.robotika.sk/zp/8080instructions.pdf Ťahák na cvičenia s výberom inštrukcií] | ||
+ | * [http://www.pastraiser.com/cpu/i8080/i8080_opcodes.html Všetky inštrukcie 8080] | ||
+ | |||
+ | |||
+ | == Precvičovanie == | ||
+ | |||
+ | |||
+ | Preštudujte si nasledovný program: | ||
+ | <source lang="asm"> | ||
+ | ORG 0000h | ||
+ | MVI A,07h | ||
+ | MOV B,A | ||
+ | MVI A,03h | ||
+ | MOV C,A | ||
+ | HLT | ||
+ | </source> | ||
+ | <quiz shuffleanswers=true display=simple> | ||
+ | {Aký bude obsah registra B po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 7|07|07h|07H } | ||
+ | |||
+ | {Aký bude obsah registra A po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 3|03|03h|03H } | ||
+ | </quiz> | ||
+ | |||
+ | Preštudujte si nasledovný program: | ||
<source lang="asm"> | <source lang="asm"> | ||
− | + | ORG 0040h | |
+ | DB 01h,03h,05h,07h | ||
+ | |||
+ | ORG 0000h | ||
+ | LDA 0041h | ||
+ | MOV B,A | ||
+ | LDA 0040h | ||
+ | ADD B | ||
+ | STA 0042h | ||
+ | HLT | ||
+ | </source> | ||
+ | <quiz shuffleanswers=true display=simple> | ||
+ | {Aký bude obsah registra B po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 3|03|03h|03H } | ||
+ | |||
+ | {Aký bude obsah registra A po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 4|04|04h|04H } | ||
+ | |||
+ | {Aký bude obsah pamäťového miesta s adresou 0043h po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 7|07|07h|07H } | ||
+ | |||
+ | {Aký bude obsah pamäťového miesta s adresou 0042h po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 4|04|04h|04H } | ||
+ | </quiz> | ||
− | + | Preštudujte si nasledovný program: | |
− | + | <source lang="asm"> | |
− | + | ORG 0040h | |
− | + | DB 01h,03h,05h,07h | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | HLT | + | ORG 0000h |
+ | LDA 0043h | ||
+ | MOV B,A | ||
+ | LDA 0042h | ||
+ | SUB B | ||
+ | STA 0041h | ||
+ | SUB A | ||
+ | STA 0040h | ||
+ | HLT | ||
</source> | </source> | ||
+ | <quiz shuffleanswers=true display=simple> | ||
+ | {Aký bude obsah registra B po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 7|07|07h|07H } | ||
+ | |||
+ | {Aký bude obsah pamäťového miesta s adresou 0041h po vykonaní celého programu? | ||
+ | |type="{}"} | ||
+ | { 254|FE (i)|0feh (i) } | ||
+ | {Aký bude stav príznaku Z (Zero) po vykonaní celého programu? | ||
+ | |type="()"} | ||
+ | - 0 | ||
+ | + 1 | ||
− | + | {Aký bude obsah pamäťového miesta s adresou 0040h po vykonaní celého programu? | |
+ | |type="{}"} | ||
+ | { 00|0|00h (i) } | ||
− | + | </quiz> | |
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="asm"> | <source lang="asm"> |
Aktuálna revízia z 11:21, 14. november 2017
- Ťahák na cvičenia s výberom inštrukcií - neberte nám prosím ťaháky z cvičení!
Obsah
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
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.
- Vynulujte 5 bajtov pamäte od adresy 070h
- Odložte do pamäte na adresu 70h až 74h hodnoty 1 až 5.
- Vymeňte obsah pamäťových miest 70h a 73h.
- Sčítajte obsah pamäťových miest 72h a 73h a výsledok uložte do 74h
- Odčítajte od 74h obsah 71h a zapíšte späť do 74h
- Nájdite dvojkový doplnok čísla z 72h
Linky
Precvičovanie
Preštudujte si nasledovný program:
ORG 0000h
MVI A,07h
MOV B,A
MVI A,03h
MOV C,A
HLT
Preštudujte si nasledovný program:
ORG 0040h
DB 01h,03h,05h,07h
ORG 0000h
LDA 0041h
MOV B,A
LDA 0040h
ADD B
STA 0042h
HLT
Preštudujte si nasledovný program:
ORG 0040h
DB 01h,03h,05h,07h
ORG 0000h
LDA 0043h
MOV B,A
LDA 0042h
SUB B
STA 0041h
SUB A
STA 0040h
HLT