ASM80 programy: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 82: | Riadok 82: | ||
</source> | </source> | ||
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. | |||
<source lang="asm"> | |||
.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 | |||
</source> | |||
Úlohy | Úlohy |
Verzia z 21:55, 1. november 2017
Nulovanie pamäťového miesta
Intuitívne MVI A,00h ale lepšie je SUB A, ktoré je kratšie a aj nastaví príznaky. Porovnajte.
myX equ 0010h
org 0000h
mvi a,55h
sta myX
sub a ;mvi a,00h
sta myX
hlt
Súčet dvoch 8-bitových čísel
Prvý aj druhý sčítanec sú uložené v pamäti, výsledok chceme tiež tam. Ako vieme, že výsledok je OK?
CISLO EQU 0x000D
000D ORG 000DH
000D 02 03 00 DB 02H,03H,00H
0000 ORG 0000
0000 START:
0000 3A 0D 00 LDA 000DH
0003 47 MOV B,A
0004 3A 0E 00 LDA 000EH
0007 80 ADD B
0008 32 0F 00 STA 000FH
000B 76 HLT
CISLO EQU 0x000D
ORG 000DH
DB 02H,03H,00H
ORG 0000
START:
LDA 000DH
MOV B,A
LDA 000EH
ADD B
STA 000FH
HLT
LXI H, 000Dh
MOV A,M ; prvy scitanec
INX H
ADD M ; druhy scitanec
INX H
MOV M,A ; uloz vysledok
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
Ú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