Soluții la problemele capitolului 4 din baza de date online completă în domeniul informaticii și cursul de carieră pe internet de la început

Solutii La Problemele Capitolului 4 Din Baza De Date Online Completa In Domeniul Informaticii Si Cursul De Cariera Pe Internet De La Inceput



Problemele și soluțiile lor

1) Scrieți un program în limbaj de asamblare care începe de la 0200 USD pentru 6502 µP și adaugă numerele nesemnate ale lui 2A94 H (adăugați) la 2ABF H (augend). Lăsați intrările și ieșirile să fie în memorie. De asemenea, produceți manual documentul de program asamblat.







Soluţie:



CLC
LDA 0213 USD
ADC 0215 USD
STA 0217 USD
LDA 0214 USD
ADC 0216 USD
STA 0218 USD



Program asamblat:





2) Scrieți un program în limbaj de asamblare care începe de la $0200, pentru 6502 µP, și scade numerele fără semn, 1569 H (subtraend) din 2ABF H (descăzut). Lăsați intrările și ieșirile să fie în memorie. Produceți, de asemenea, manual documentul de program asamblat.



Soluţie:

SEC
LDA 0213 USD
SBC 0215 USD
STA 0217 USD
LDA 0214 USD
SBC 0216 USD
STA 0218 USD

Program asamblat:

3) Scrieți un program în limbaj de asamblare pentru 6502 µP care numără de la $00 la $09 folosind o buclă. Programul ar trebui să înceapă de la 0200 USD. De asemenea, produceți manual documentul de program asamblat.

Soluţie:

LDA # 09 USD
STA $0220 ; pentru a compara X și 09 USD
LDX # 00 USD
bucla INX
CPX 0220 USD
bucla BNE

Program asamblat:

4) Scrieți un program în limbaj de asamblare care începe de la 0200 USD pentru 6502 µP. Programul are două subrutine. Prima subrutină adaugă numerele nesemnate ale 0203 H (augend) și 0102 H (adăugător). Al doilea subprogram adaugă suma din primul subprogram, care este 0305 H la 0006 H (augend). Rezultatul final este stocat în memorie. Apelați prima subrutină care este FSTSUB și a doua subrutină care este SECSUB. Lăsați intrările și ieșirile să fie în memorie. De asemenea, produceți manual documentul de program asamblat pentru întregul program.

Soluţie:

SECSUB CLC
LDA 021 A$
ADC 0234 USD
STA 0236 USD
LDA 021 miliarde USD
ADC 0235 USD
STA 0237 USD
RTS

FSTSUB CLC
LDA 0216 USD
ADC 0218 USD
STA $021A
LDA 0217 USD
ADC 0219 USD
STA 021 miliarde USD
RTS

JSR FSTSUB

Program asamblat:

5) Având în vedere că an ¯IRQ handler adaugă $ 02 la $ 01 la acumulator ca core handling while ¯NMI este emis, iar manipularea de bază pentru ¯NMI adaugă $05 până la $04 la acumulator, scrieți un limbaj de asamblare pentru ambii manipulatori, inclusiv apelurile lor. Apelul către ¯IRQ administratorul ar trebui să fie la adresa de 0200 USD. The ¯IRQ handlerul ar trebui să înceapă de la adresa de 0300 USD. The ¯NMI handler ar trebui să înceapă de la adresa de 0400 USD. Rezultatul ¯IRQ handler-ul ar trebui să fie pus la adresa de $0500, iar rezultatul ¯NMI handler-ul trebuie pus la adresa de $0501.

Soluţie:

NMISR PHA ; Rutina NMI începe aici la adresa de 0400 USD
PHX
PHY
;
LDA # $04
ADC #$05
STA 0501 USD
;
PLY
PLX
PLA
RTI

ISR PHA ; această instrucțiune este la adresa 0300 USD
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: a comentat pentru că nu face parte din rutină
STA $0500; va merge la stiva
;
PLY
PLX
PLA
RTI
;
JMP ISR; această instrucțiune este la adresa 0200 USD

6) Explicați pe scurt modul în care instrucțiunea BRK este utilizată pentru a produce întreruperea software într-un computer 65C02.

Soluţie:

Principala modalitate de a avea o întrerupere software pentru 65C02 µP este utilizarea instrucțiunii de adresă implicită BRK. Să presupunem că programul principal rulează și întâlnește instrucțiunea BRK. Din acel moment, adresa următoarei instrucțiuni din PC ar trebui trimisă la stivă pe măsură ce instrucțiunea curentă se finalizează. O subrutină pentru a gestiona instrucțiunile software ar trebui apelată în continuare. Această subrutină de întrerupere ar trebui să împingă conținutul registrului A, X și Y în stivă. După ce nucleul subrutinei este executat, conținutul registrelor A, X și Y ar trebui să fie tras înapoi din stivă în registrele lor de către subrutinele care se completează. Ultima afirmație din rutină este RTI. Conținutul PC-ului este, de asemenea, tras înapoi din stivă pe PC, automat, din cauza RTI.

7) Produceți un tabel care compară și contrastează o subrutină normală cu o rutină de serviciu de întrerupere.

Soluţie:

8) Explicați pe scurt principalele moduri de adresare ale 65C02 µP, având în vedere exemplele de instrucțiuni în limbajul de asamblare.

Soluţie:

Fiecare instrucțiune pentru 6502 este de un octet, urmată de zero sau mai mulți operanzi.

Modul de adresare imediată
Cu modul de adresare imediată, după operand, este valoarea și nu o adresă de memorie. Valoarea trebuie precedată de #. Dacă valoarea este în hexazecimal, atunci „#” trebuie să fie urmat de „$”. Instrucțiunile de adresare imediată pentru 65C02 sunt: ​​ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Cititorul ar trebui să consulte documentația pentru 65C02 µP pentru a ști cum să folosească instrucțiunile care sunt enumerate aici și care nu au fost explicate în acest capitol. Un exemplu de instrucțiune este:

LDA # 77 USD

Modul de adresare absolută
Cu modul de adresare absolută, există un singur operand. Acest operand este adresa valorii din memorie (de obicei în hexazecimal sau o etichetă). Există 64K10 = 65,53610 adrese de memorie pentru 6502 µP. De obicei, valoarea de un octet se află la una dintre aceste adrese. Instrucțiunile absolute de adresare pentru 65C02 sunt: ​​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. Cititorul ar trebui să consulte documentația pentru 65C02 µP pentru a ști cum să folosească instrucțiunile care sunt enumerate aici, precum și pentru restul modurilor de adresare care nu au fost explicate în acest capitol. Un exemplu de instrucțiune este:

SUNT 1234 USD

Modul de adresare implicit
Cu modul de adresare implicit, nu există operand. Orice registru µP implicat este implicat de instrucțiune. Instrucțiunile de adresare implicite pentru 65C02 sunt: ​​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. Un exemplu de instrucțiune este:

DEX: Decrementează registrul X cu o unitate.

Modul de adresare relativă
Modul de adresare relativă se ocupă numai de instrucțiuni de ramificație. Cu modul de adresare relativă, există un singur operand. Este o valoare de la -12810 la +12710. Această valoare se numește offset. Pe baza semnului, această valoare se adaugă sau se scade din următoarea instrucțiune a Contorului de programe la rezultatul din adresa următoarei instrucțiuni intenționate. Instrucțiunile modului de adresă relativă sunt: ​​BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Exemplele de instrucțiuni sunt:

BNE $7F : (ramură dacă Z = 0 în registrul de stare, P)

care adaugă 127 la contorul programului curent (adresa de executat) și începe executarea instrucțiunii la adresa respectivă. În mod similar:

BEQ $F9 : (filiala dacă Z = : în registrul de stare, P)

care adaugă un -7 la contorul programului curent și începe execuția la noua adresă a contorului programului. Operandul este un număr de complement a doi.

Adresarea indexului absolut
Cu adresarea indexului absolut, conținutul registrului X sau Y este adăugat la adresa absolută dată (oriunde de la $0000 la $FFFF, adică de la 010 la 6553610) pentru a avea adresa reală. Această adresă absolută dată se numește adresa de bază. Dacă se folosește registrul X, instrucțiunea de asamblare este cam așa:

LDA C453,X

Dacă se folosește registrul Y, ar fi cam așa:

LDA 453 USD, Y

Valoarea pentru registrul X sau Y se numește valoare de numărare sau index și poate fi oriunde de la 00 USD (010) la FF (25010 USD). Nu se numește offset.

Instrucțiunile de adresare a indexului absolut sunt: ​​ADC, AND, ASL (doar X), BIT (cu acumulator și memorie, numai cu X), CMP, DEC (doar memorie și X), EOR, INC (doar memorie și X), LDA , LDX, LDY, LSR (numai X), ORA, ROL (numai X), ROR (numai X), SBC, STA, STZ (numai X).

Adresare indirectă absolută
Acesta este utilizat numai cu instrucțiunea de salt. Cu aceasta, adresa absolută dată are o adresă pointer. Adresa pointerului este formată din doi octeți. Pointerul de doi octeți indică (este adresa) valoarea octetului de destinație din memorie. Deci, instrucțiunea limbajului de asamblare este după cum urmează:

JMP (3456 USD)

Cu paranteze și $13 în adresa $3456, în timp ce $EB este în $3457 (= $3456 + 1), adresa de destinație este $13EB și $13EB este indicatorul. 3456 USD sunt în paranteze în instrucțiune.

9) a) Scrieți un program în limbajul mașină 6502 pentru a pune „te iubesc!” șir de coduri ASCII din memorie, începând cu adresa $0300 cu lungimea șirului. Programul ar trebui să înceapă de la adresa de 0200 USD. Obțineți fiecare caracter de la acumulator, presupunând că sunt trimise acolo unul câte unul de către o subrutină. De asemenea, as-semble programul manual. (Dacă trebuie să cunoașteți codurile ASCII pentru „Te iubesc!”, iată-le: „I”:4916, spațiu: 2016, „l”: 6C16, „o”:6F16, „v”:7616, „ e':65, 'y':7916, 'u':7516 și '!':2116. Notă: fiecare cod ocupă 1 octet).

b) Scrieți un program în limbajul mașină 6502 pentru a pune „te iubesc!” șir de coduri ASCII din memorie, începând de la adresa $0300 fără lungimea șirului, dar care se termină în 0016. Programul ar trebui să înceapă la adresa $0200. Obțineți fiecare caracter din acumulator, presupunând că sunt trimise acolo unul câte unul de către o subrutină. De asemenea, asamblați programul manual.

Soluţie:

a) Strategie: Există 12 octeți pentru șir: 1 octet pentru lungimea șirului și 11 octeți pentru literalul șir. Deci, trebuie să existe 12 iterații (bucle) numărând de la 0. Adică: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Acestea sunt 12 numere.

Numărul întreg 0 este pus în registrul X și numărul 1110 = 1210 – 110 = B16 = $0B este pus într-o locație de adresă din memorie, să spunem adresa $0250. Pentru fiecare iterație, valoarea din registrul X este incrementată, iar rezultatul este comparat cu $0B în locația adresei $0250. Imediat după ce valoarea din X este egală cu valoarea de $0B, iterația se oprește. În acest moment, lungimea (numărul de octeți) șirului și literalul șirului ocupă locațiile de adrese de la $0300 la $030B (inclusiv). Pentru a crește adresele de memorie de la $0300, se folosește registrul Y. Codul este:

LDA # 0 miliarde USD
SUNT 0250 USD
LDX # 00 USD
LDY # 00 USD
STA $0300; lungimea de 11 este introdusă în A de o anumită subrutină și ajunge la 0300 USD
bucla INX
ACOLO
0250 USD CPY
buclă BEQ

b) Strategie: Există 12 octeți pentru șir: 1 octet pentru terminatorul nul $00 și 11 octeți pentru literalul șir. Deci, trebuie să existe 12 iterații (bucle) numărând de la 0. Adică: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Acestea sunt 12 numere.

Numărul întreg 0 este pus în registrul X și numărul 1110 = 1210 – 110 = B16 = $0B este pus într-o locație de adresă din memorie, să spunem adresa $0250. Pentru fiecare iterație, valoarea din registrul X este incrementată, iar rezultatul este comparat cu $0B în locația adresei $0250. Imediat după ce valoarea din X este egală cu valoarea de $0B, iterația se oprește. În acest moment, numărul de octeți ai literalului șir plus caracterul Null ocupă locațiile de adrese de la $0300 până la $030B (inclusiv). Pentru a crește adresele de memorie de la $0300, se folosește registrul Y. Codul este:

LDA # 0 miliarde USD
SUNT 0250 USD
LDX # 00 USD
LDY # 00 USD
STA $0300; „I” este introdus în A de o anumită subrutină și ajunge la 0300 USD
bucla INX
ACOLO
0250 USD CPY
buclă BEQ