Solucions als problemes del capítol 4 de la base de dades d'informàtica en línia completa i el curs professional a Internet des del principi

Solucions Als Problemes Del Capitol 4 De La Base De Dades D Informatica En Linia Completa I El Curs Professional A Internet Des Del Principi



Problemes i les seves solucions

1) Escriviu un programa de llenguatge ensamblador que comenci a $0200 per al 6502 µP i afegeixi els números sense signar de 2A94 H (afegiu) a 2ABF H (augend). Deixeu que les entrades i les sortides estiguin a la memòria. A més, elaboreu manualment el document del programa muntat.







Solució:



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



Programa ensamblat:





2) Escriu un programa de llenguatge ensamblador que comenci a $0200, per a 6502 µP, i resta els nombres sense signe, 1569 H (substraend) de 2ABF H (minuend). Deixeu que les entrades i les sortides estiguin a la memòria. També produir el document del programa muntat, a mà.



Solució:

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

Programa ensamblat:

3) Escriu un programa de llenguatge ensamblador per al 6502 µP que compti de $00 a $09 mitjançant un bucle. El programa hauria de començar a $ 0200. A més, elaboreu manualment el document del programa muntat.

Solució:

LDA #$09
STA $ 0220; per comparar X i $09
LDX #$00
bucle INX
CPX $ 0220
Bucle BNE

Programa ensamblat:

4) Escriviu un programa de llenguatge ensamblador que comenci a $0200 per al 6502 µP. El programa té dues subrutines. La primera subrutina afegeix els números sense signar de 0203 H (augend) i 0102 H (afegir). La segona subrutina suma la suma de la primera subrutina que és 0305 H al 0006 H (augend). El resultat final s'emmagatzema a la memòria. Truqueu la primera subrutina que és FSTSUB i la segona subrutina que és SECSUB. Deixeu que les entrades i sortides estiguin a la memòria. A més, elaboreu manualment el document del programa muntat per a tot el programa.

Solució:

SECSUB CLC
LDA $021A
ADC $ 0234
STA $ 0236
LDA 021 milions de dòlars
ADC $ 0235
STA $ 0237
RTS

FSTSUB CLC
LDA 0216 $
ADC $ 0218
STA $021A
LDA 0217 $
ADC $ 0219
STA 021 milions de dòlars
RTS

JSR FSTSUB

Programa ensamblat:

5) Tenint en compte que an ¯IRQ El gestor afegeix $02 a $01 a l'acumulador com a gestió bàsica mentre ¯NMI s'emet, i la gestió bàsica per ¯NMI afegeix $ 05 a $ 04 a l'acumulador, escriu un llenguatge ensamblador per als dos gestors incloses les seves trucades. La crida al ¯IRQ El gestor hauria d'estar a l'adreça de $0200. El ¯IRQ El gestor hauria de començar a l'adreça de $0300. El ¯NMI El gestor hauria de començar a l'adreça de $0400. El resultat de la ¯IRQ s'ha de posar a l'adreça de $0500, i el resultat del ¯NMI s'ha de posar a l'adreça de $0501.

Solució:

NMISR PHA ; La rutina NMI comença aquí a l'adreça de $ 0400
PHX
PHY
;
LDA #$04
ADC #$05
STA $ 0501
;
PLY
PLX
PLA
RTI

ISR PHA ; aquesta instrucció es troba a l'adreça $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : comentat perquè no forma part de la rutina
STA $ 0500 ; anirà a apilar
;
PLY
PLX
PLA
RTI
;
JMP ISR ; aquesta instrucció es troba a l'adreça $0200

6) Expliqueu breument com s'utilitza la instrucció BRK per produir la interrupció de programari en un ordinador 65C02.

Solució:

La forma principal d'haver una interrupció de programari per al 65C02 µP és mitjançant l'ús de la instrucció d'adreça implícita BRK. Suposem que el programa principal s'està executant i troba la instrucció BRK. A partir d'aquest moment, l'adreça de la següent instrucció a l'ordinador s'hauria d'enviar a la pila a mesura que es completi la instrucció actual. A continuació s'hauria de cridar una subrutina per gestionar la instrucció del programari. Aquesta subrutina d'interrupció hauria d'empènyer el contingut del registre A, X i Y a la pila. Després d'executar el nucli de la subrutina, el contingut dels registres A, X i Y s'hauria de treure de la pila als seus registres mitjançant la subrutina completa. L'última declaració de la rutina és RTI. El contingut de l'ordinador també es retira de la pila a l'ordinador, automàticament, a causa de RTI.

7) Elaborar una taula que compare i contrasti una subrutina normal amb una rutina de servei d'interrupció.

Solució:

8) Expliqueu breument els modes d'adreçament principals del 65C02 µP donats els exemples d'instruccions del llenguatge ensamblador.

Solució:

Cada instrucció per al 6502 és d'un byte, seguida de zero o més operands.

Mode d'adreçament immediat
Amb el mode d'adreçament immediat, després de l'operand, és el valor i no una adreça de memòria. El valor ha d'anar precedit de #. Si el valor està en hexadecimal, llavors '#' ha d'anar seguit de '$'. Les instruccions d'adreçament immediates per al 65C02 són: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. El lector ha de consultar la documentació del 65C02 µP per saber com utilitzar les instruccions que s'enumeren aquí i que no s'han explicat en aquest capítol. Una instrucció d'exemple és:

LDA # $77

Mode d'adreçament absolut
Amb el mode d'adreçament absolut, hi ha un operand. Aquest operand és l'adreça del valor a la memòria (normalment en hexadecimal o una etiqueta). Hi ha 64K10 = 65.53610 adreces de memòria per al 6502 µP. Normalment, el valor d'un byte es troba en una d'aquestes adreces. Les instruccions d'adreçament absolutes per al 65C02 són: 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. El lector ha de consultar la documentació del 65C02 µP per saber com utilitzar les instruccions que s'enumeren aquí així com per a la resta de modes d'adreçament que no s'han explicat en aquest capítol. Una instrucció d'exemple és:

SÓN 1234 $

Mode d'adreçament implícit
Amb el mode d'adreçament implícit, no hi ha operand. Qualsevol registre µP implicat està implicat per la instrucció. Les instruccions d'adreçament implícites per al 65C02 són: 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. Una instrucció d'exemple és:

DEX: Disminueix el registre X en una unitat.

Mode d'adreçament relatiu
El mode d'adreçament relatiu només tracta les instruccions de branca. Amb el mode d'adreçament relatiu, només hi ha un operand. És un valor de -12810 a +12710. Aquest valor s'anomena desplaçament. En funció del signe, aquest valor s'afegeix o es resta de la següent instrucció del comptador de programes al resultat de l'adreça de la següent instrucció prevista. Les instruccions del mode d'adreça relativa són: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Els exemples d'instruccions són:

BNE $7F : (sucursal si Z = 0 al registre d'estat, P)

que afegeix 127 al comptador del programa actual (adreça a executar) i comença a executar la instrucció a aquesta adreça. De la mateixa manera:

BEQ $F9 : (sucursal si Z = : al registre d'estat, P)

que afegeix un -7 al comptador del programa actual i comença l'execució a la nova adreça del comptador del programa. L'operand és un nombre de complement a dos.

Adreçament d'índex absolut
Amb l'adreçament d'índex absolut, el contingut del registre X o Y s'afegeix a l'adreça absoluta donada (entre $0000 i $FFFF, és a dir, de 010 a 6553610) per tenir l'adreça real. Aquesta adreça absoluta donada s'anomena adreça base. Si s'utilitza el registre X, la instrucció de muntatge és una cosa així:

LDA $ C453,X

Si s'utilitza el registre Y, seria una cosa així:

LDA $C453,I

El valor del registre X o Y s'anomena valor de recompte o índex i pot anar des de $ 00 (010) fins a $ FF (25010). No s'anomena compensació.

Les instruccions d'adreçament d'índex absolut són: ADC, AND, ASL (només X), BIT (amb acumulador i memòria, només amb X), CMP, DEC (només memòria i X), EOR, INC (només memòria i X), LDA , LDX, LDY, LSR (només X), ORA, ROL (només X), ROR (només X), SBC, STA, STZ (només X).

Adreçament indirecte absolut
Això només s'utilitza amb la instrucció de salt. Amb això, l'adreça absoluta donada té una adreça de punter. L'adreça del punter consta de dos bytes. El punter de dos bytes apunta a (és l'adreça de) el valor del byte de destinació a la memòria. Per tant, la instrucció del llenguatge ensamblador és la següent:

JMP (3456 $)

Amb els parèntesis i $13 a l'adreça de $3456 mentre que $EB és a l'adreça $3457 (= $3456 + 1), l'adreça de destinació és $13EB i $13EB és el punter. Els 3456 $ absoluts es troben entre parèntesis de la instrucció.

9) a) Escriu un programa de llenguatge màquina 6502 per posar el 'T'estimo!' cadena de codis ASCII a la memòria, començant per l'adreça $0300 amb la longitud de la cadena. El programa hauria de començar a l'adreça $0200. Obteniu cada caràcter de l'acumulador, suposant que s'envien allà un per un per alguna subrutina. A més, munta el programa a mà. (Si necessiteu conèixer els codis ASCII de 'T'estimo!', aquí els teniu: 'I':4916, espai: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 i '!':2116. Nota: cada codi ocupa 1 byte).

b) Escriu un programa de llenguatge màquina 6502 per posar el 'T'estimo!' cadena de codis ASCII a la memòria, començant per l'adreça $0300 sense la longitud de la cadena però acabant en 0016. El programa hauria de començar a l'adreça $0200. Obteniu cada caràcter de l'acumulador, suposant que s'envien allà un per un per alguna subrutina. A més, munta el programa a mà.

Solució:

a) Estratègia: Hi ha 12 bytes per a la cadena: 1 byte per a la longitud de la cadena i 11 bytes per a la cadena literal. Per tant, hi ha d'haver 12 iteracions (bucles) comptant des de 0. És a dir: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Són 12 nombres.

El nombre enter 0 es posa al registre X i el nombre 1110 = 1210 – 110 = B16 = $0B es posa en una ubicació d'adreça a la memòria, per exemple, l'adreça $0250. Per a cada iteració, el valor del registre X s'incrementa i el resultat es compara amb $0B a la ubicació de l'adreça $0250. Just després que el valor de X sigui igual al valor de $ 0B, la iteració s'atura. En aquest punt, la longitud (nombre de bytes) de la cadena i el literal de la cadena ocupen les ubicacions d'adreces de $ 0300 a $ 030B (inclosos). Per anar incrementant les adreces de memòria des de $0300, s'utilitza el registre Y. El codi és:

LDA #$0B
SÓN 0250 $
LDX #$00
LDY #$00
STA $ 0300; la longitud d'11 es posa a A per alguna subrutina i arriba a $0300
bucle INX
Allà
0250 CPY
bucle BEQ

b) Estratègia: hi ha 12 bytes per a la cadena: 1 byte per al terminador nul de $00 i 11 bytes per a la cadena literal. Per tant, hi ha d'haver 12 iteracions (bucles) comptant des de 0. És a dir: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Són 12 nombres.

El nombre enter 0 es posa al registre X i el nombre 1110 = 1210 – 110 = B16 = $0B es posa en una ubicació d'adreça a la memòria, per exemple, l'adreça $0250. Per a cada iteració, el valor del registre X s'incrementa i el resultat es compara amb $0B a la ubicació de l'adreça $0250. Just després que el valor de X sigui igual al valor de $ 0B, la iteració s'atura. En aquest punt, el nombre de bytes del literal de cadena més el caràcter nul ocupen les ubicacions d'adreces de $0300 a $030B (inclosos). Per augmentar les adreces de memòria des de $0300, s'utilitza el registre Y. El codi és:

LDA #$0B
SÓN 0250 $
LDX #$00
LDY#$00
STA $ 0300; 'I' es posa a A per alguna subrutina i arriba a $0300
bucle INX
Allà
0250 CPY
bucle BEQ