Rozwiązania problemów rozdziału 4 pełnej internetowej bazy danych informatycznych i internetowego kursu kariery od początku

Rozwiazania Problemow Rozdzialu 4 Pelnej Internetowej Bazy Danych Informatycznych I Internetowego Kursu Kariery Od Poczatku



Problemy i ich rozwiązania

1) Napisz program w języku asemblera, który zaczyna się od $0200 dla 6502 µP i dodaje liczby bez znaku z 2A94 H (dodaj) do 2ABF H (dodaj). Niech wejścia i wyjścia będą w pamięci. Przygotuj także ręcznie zmontowany dokument programu.







Rozwiązanie:



WŻCH
LDA 0213 dolarów
ADC 0215 dolarów
STA $0217
LDA 0214 dolarów
ADC 0216 dolarów
STA $0218



Złożony program:





2) Napisz program w języku asemblera, który zaczyna się od $0200 dla 6502 µP i odejmuje liczby bez znaku, 1569 H (odejmij) od 2ABF H (odjemna). Niech wejścia i wyjścia będą w pamięci. Przygotuj także ręcznie zmontowany dokument programowy.



Rozwiązanie:

SEK
LDA 0213 dolarów
SBC 0215 dolarów
STA $0217
LDA 0214 dolarów
SBC 0216 dolarów
STA $0218

Złożony program:

3) Napisz program w języku asemblera dla 6502 µP, który będzie zliczał w górę od 00 $ do 09 $, używając pętli. Program powinien zaczynać się od kwoty 0200 USD. Przygotuj także ręcznie zmontowany dokument programu.

Rozwiązanie:

LDA #09 USD
STA $0220; do porównania X i 09 USD
LDX#00 dolarów
pętla INX
CPX 0220 dolarów
Pętla BNE

Złożony program:

4) Napisz program w języku asemblera zaczynający się od 0200 $ dla 6502 µP. Program posiada dwa podprogramy. Pierwszy podprogram dodaje liczby bez znaku 0203 H (auend) i 0102 H (dodajnik). Drugi podprogram dodaje sumę z pierwszego podprogramu, czyli 0305 H do 0006 H (dodaj). Wynik końcowy zapisywany jest w pamięci. Wywołaj pierwszy podprogram, który jest FSTSUB i drugi podprogram, który jest SECSUB. Niech wejścia i wyjścia będą w pamięci. Przygotuj także ręcznie zmontowany dokument programowy dla całego programu.

Rozwiązanie:

SECSUB CLC
LDA 021A
ADC 0234 USD
STA $0236
LDA 021 miliardów dolarów
ADC 0235 dolarów
STA $0237
RTS

FSTSUB CLC
LDA 0216 dolarów
ADC 0218 dolarów
STA $021A
LDA 0217 dolarów
ADC 0219 dolarów
STA 021 miliardów dolarów
RTS

JSR FSTSUB

Złożony program:

5) Biorąc pod uwagę, że ¯IRQ handler dodaje 02 USD do 01 USD w akumulatorze jako obsługa rdzenia podczas ¯NMI jest wydawane i podstawowa obsługa ¯NMI dodaje 05 $ do 04 $ w akumulatorze, napisz język asemblera dla obu procedur obsługi, łącznie z ich wywołaniami. Wezwanie do ¯IRQ handler powinien znajdować się pod adresem $0200. The ¯IRQ handler powinien zaczynać się od adresu $0300. The ¯NMI handler powinien zaczynać się od adresu $0400. Wynik ¯IRQ handler należy umieścić pod adresem $0500, a wynik operacji ¯NMI handler należy umieścić pod adresem $0501.

Rozwiązanie:

NMISR PHA; Procedura NMI zaczyna się tutaj pod adresem $0400
PHX
FI
;
LDA #04 USD
ADC #05 dolarów
STA $0501
;
ZAGIĘCIE
PLX
PLA
RTI

ISR PHA; ta instrukcja znajduje się pod adresem $0300
PHX
FI
;
LDA #01 USD
ADC nr 02
; JMP NMISR: skomentowano, ponieważ nie jest to część rutyny
STA $0500; pójdzie do stosu
;
ZAGIĘCIE
PLX
PLA
RTI
;
JMP ISR ; ta instrukcja znajduje się pod adresem $0200

6) Krótko wyjaśnij, w jaki sposób instrukcja BRK jest używana do generowania przerwania programowego w komputerze 65C02.

Rozwiązanie:

Głównym sposobem uzyskania przerwania programowego dla 65C02 µP jest użycie instrukcji adresu implikowanego BRK. Załóżmy, że program główny jest uruchomiony i napotkał instrukcję BRK. Od tego momentu adres następnej instrukcji w komputerze powinien zostać wysłany na stos po zakończeniu bieżącej instrukcji. Następnie należy wywołać podprogram obsługujący instrukcję oprogramowania. Ten podprogram przerwania powinien wypchnąć zawartość rejestrów A, X i Y na stos. Po wykonaniu rdzenia podprogramu zawartość rejestrów A, X i Y powinna zostać ściągnięta ze stosu do ich rejestrów poprzez podprogram kończący. Ostatnią instrukcją w procedurze jest RTI. Zawartość komputera PC jest również automatycznie pobierana ze stosu na komputer PC dzięki funkcji RTI.

7) Utwórz tabelę porównującą i kontrastującą normalny podprogram z procedurą obsługi przerwania.

Rozwiązanie:

8) Krótko wyjaśnij główne tryby adresowania 65C02 µP na podstawie przykładów instrukcji w języku asemblera.

Rozwiązanie:

Każda instrukcja dla 6502 składa się z jednego bajtu, po którym następuje zero lub więcej operandów.

Tryb adresowania natychmiastowego
W trybie adresowania bezpośredniego po operandze znajduje się wartość, a nie adres pamięci. Wartość musi być poprzedzona #. Jeśli wartość jest w formacie szesnastkowym, po „#” musi nastąpić „$”. Instrukcje bezpośredniego adresowania dla 65C02 to: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Czytelnik powinien zapoznać się z dokumentacją 65C02 µP, aby dowiedzieć się, jak korzystać z podanych tutaj instrukcji, które nie zostały wyjaśnione w tym rozdziale. Przykładowa instrukcja to:

LDA #77 dolarów

Tryb adresowania bezwzględnego
W trybie adresowania absolutnego istnieje jeden argument. Ten operand jest adresem wartości w pamięci (zwykle w formacie szesnastkowym lub etykiecie). Dla 6502 µP jest 64K10 = 65,53610 adresów pamięci. Zazwyczaj wartość jednobajtowa znajduje się pod jednym z tych adresów. Instrukcje adresowania bezwzględnego dla 65C02 to: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Czytelnik powinien zapoznać się z dokumentacją 65C02 µP, aby dowiedzieć się, jak korzystać z instrukcji tutaj wymienionych, a także pozostałych trybów adresowania, które nie zostały wyjaśnione w tym rozdziale. Przykładowa instrukcja to:

SĄ 1234 USD

Domniemany tryb adresowania
W domyślnym trybie adresowania nie ma operandu. Instrukcja sugeruje dowolny rejestr µP. Domniemane instrukcje adresowania dla 65C02 to: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Przykładowa instrukcja to:

DEX: Zmniejsz rejestr X o jedną jednostkę.

Tryb adresowania względnego
Tryb adresowania względnego dotyczy tylko instrukcji rozgałęzień. W trybie adresowania względnego istnieje tylko jeden operand. Jest to wartość z zakresu -12810 do +12710. Wartość ta nazywana jest przesunięciem. Na podstawie znaku wartość ta jest dodawana lub odejmowana od następnej instrukcji Licznika Programu do wyniku w adresie zamierzonej następnej instrukcji. Instrukcje trybu adresu względnego to: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Przykładowe instrukcje to:

BNE $7F : (oddział jeśli Z = 0 w rejestrze statusowym, P)

co dodaje 127 do aktualnego licznika programu (adresu do wykonania) i rozpoczyna wykonywanie instrukcji pod tym adresem. Podobnie:

BEQ $F9 : (gałąź jeśli Z = : w rejestrze statusowym, P)

co dodaje -7 do bieżącego licznika programu i rozpoczyna wykonywanie pod nowym adresem licznika programu. Operand jest liczbą uzupełniającą do dwójki.

Adresowanie indeksu bezwzględnego
W przypadku adresowania indeksowego bezwzględnego zawartość rejestru X lub Y jest dodawana do podanego adresu bezwzględnego (od 0000 $ do $FFFF, tj. od 010 do 6553610), aby uzyskać adres rzeczywisty. Ten podany adres bezwzględny nazywany jest adresem bazowym. Jeśli używany jest rejestr X, instrukcja montażu wygląda mniej więcej tak:

LDA $C453,X

Jeśli używany jest rejestr Y, wyglądałoby to mniej więcej tak:

LDA $C453,Y

Wartość rejestru X lub Y nazywana jest wartością licznika lub indeksu i może wynosić od 00 $ (010) do $FF (25010). Nie nazywa się to offsetem.

Instrukcje adresowania indeksu bezwzględnego to: ADC, AND, ASL (tylko X), BIT (z akumulatorem i pamięcią, tylko X), CMP, DEC (tylko pamięć i X), EOR, INC (tylko pamięć i X), LDA , LDX, LDY, LSR (tylko X), ORA, ROL (tylko X), ROR (tylko X), SBC, STA, STZ (tylko X).

Absolutne adresowanie pośrednie
Używa się tego tylko z instrukcją skoku. Dzięki temu podany adres bezwzględny ma adres wskaźnika. Adres wskaźnika składa się z dwóch bajtów. Dwubajtowy wskaźnik wskazuje (jest adresem) docelowej wartości bajtu w pamięci. Zatem instrukcja języka asemblera wygląda następująco:

JMP (3456 USD)

Z nawiasami i 13 $ w adresie 3456 $, podczas gdy $EB znajduje się w adresie 3457 $ (= 3456 $ + 1), adres docelowy to 13EB $, a 13EB jest wskaźnikiem. W instrukcji w nawiasach podano kwotę bezwzględną 3456 USD.

9) a) Napisz program w języku maszynowym 6502, który wstawi komunikat „Kocham cię!” ciąg kodów ASCII w pamięci, zaczynając od adresu $0300 wraz z długością ciągu. Program powinien zaczynać się od adresu $0200. Uzyskaj każdy znak z akumulatora, zakładając, że są tam wysyłane jeden po drugim przez jakiś podprogram. Należy także złożyć program ręcznie. (Jeśli potrzebujesz znać kody ASCII dla „Kocham cię!”, oto one: „I”:4916, spacja: 2016, „l”: 6C16, „o”:6F16, „v”:7616, „ e':65, 'y':7916, 'u':7516 i '!':2116. Uwaga: każdy kod zajmuje 1 bajt).

b) Napisz program w języku maszynowym 6502, w którym będzie umieszczane słowo „Kocham cię!” ciąg kodów ASCII w pamięci, zaczynający się od adresu $0300 bez długości ciągu, ale kończący się na 0016. Program powinien zaczynać się od adresu $0200. Uzyskaj każdy znak z akumulatora, zakładając, że są tam wysyłane jeden po drugim przez jakiś podprogram. Należy także złożyć program ręcznie.

Rozwiązanie:

a) Strategia: Łańcuch ma 12 bajtów: 1 bajt na długość łańcucha i 11 bajtów na literał ciągu. Zatem musi być 12 iteracji (pętli) licząc od 0. Czyli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. To jest 12 liczb.

Liczba całkowita 0 jest umieszczana w rejestrze X, a liczba 1110 = 1210 – 110 = B16 = $0B jest umieszczana w miejscu adresu w pamięci, powiedzmy adres $0250. Dla każdej iteracji wartość w rejestrze X jest zwiększana, a wynik porównywany jest z 0B w lokalizacji adresu $0250. Zaraz po tym, jak wartość w X jest równa wartości 0B, iteracja zostaje zatrzymana. W tym momencie długość (liczba bajtów) ciągu znaków i literał ciągu zajmują adresy od 0300 do 030B (włącznie). Aby zwiększyć adresy pamięci od $0300, używany jest rejestr Y. Kod to:

LDA # 0 miliardów dolarów
SĄ 0250 dolarów
LDX#00 dolarów
LDY#$00
STA $0300; długość 11 jest umieszczana w A przez jakiś podprogram i osiąga wartość 0300 $
pętla INX
TAM
0250 dolarów kanadyjskich
Pętla BEQ

b) Strategia: Łańcuch ma 12 bajtów: 1 bajt dla terminatora zerowego 00 $ i 11 bajtów dla literału ciągu. Zatem musi być 12 iteracji (pętli) licząc od 0. Czyli: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. To jest 12 liczb.

Liczba całkowita 0 jest umieszczana w rejestrze X, a liczba 1110 = 1210 – 110 = B16 = $0B jest umieszczana w miejscu adresu w pamięci, powiedzmy adres $0250. Dla każdej iteracji wartość w rejestrze X jest zwiększana, a wynik porównywany jest z 0B w lokalizacji adresu $0250. Zaraz po tym, jak wartość w X jest równa wartości 0B, iteracja zostaje zatrzymana. W tym momencie liczba bajtów literału ciągu plus znak Null zajmują lokalizacje adresowe od 0300 do 030B (włącznie). Aby zwiększyć adresy pamięci od $0300, używany jest rejestr Y. Kod to:

LDA # 0 miliardów dolarów
SĄ 0250 dolarów
LDX#00 dolarów
LDY#$00
STA $0300; „I” jest wstawiane do A przez jakiś podprogram i osiąga wartość 0300 $
pętla INX
TAM
0250 dolarów kanadyjskich
Pętla BEQ