Solutions aux problèmes du chapitre 4 de la base de données informatique en ligne complète et du cours de carrière sur Internet depuis le début

Solutions Aux Problemes Du Chapitre 4 De La Base De Donnees Informatique En Ligne Complete Et Du Cours De Carriere Sur Internet Depuis Le Debut



Problèmes et leurs solutions

1) Écrivez un programme en langage assembleur qui commence à 0200 $ pour le 6502 µP et ajoute les nombres non signés de 2A94 H (ajouter) à 2ABF H (augend). Laissez les entrées et les sorties être dans la mémoire. Produisez également à la main le document de programme assemblé.







Solution:



CTC
LDA 0213 $
CAD 0215 $
STA 0217 $
LDA 0214 $
CAD 0216 $
STA 0218 $



Programme assemblé :





2) Écrivez un programme en langage assembleur qui commence à 0200 $, pour le 6502 µP, et soustrait les nombres non signés, 1569 H (soustraire) de 2ABF H (fin de minute). Laissez les entrées et les sorties être en mémoire. Produisez également le document de programme assemblé, à la main.



Solution:

SECONDE
LDA 0213 $
DCE 0215 $
STA 0217 $
LDA 0214 $
DCE 0216 $
STA 0218 $

Programme assemblé :

3) Écrivez un programme en langage assembleur pour le 6502 µP qui compte de 00 $ à 09 $ à l'aide d'une boucle. Le programme devrait commencer à 0200 $. Produisez également à la main le document de programme assemblé.

Solution:

LDA #$09
STA 0220 $ ; pour comparer X et 09 $
LDX #00$
boucle INX
CPX 0 220 $
Boucle BNE

Programme assemblé :

4) Écrivez un programme en langage assembleur qui commence à 0200 $ pour le 6502 µP. Le programme comporte deux sous-programmes. Le premier sous-programme ajoute les nombres non signés de 0203 H (août) et 0102 H (ajouter). Le deuxième sous-programme additionne la somme du premier sous-programme qui est 0305 H à 0006 H (augend). Le résultat final est stocké dans la mémoire. Appelez le premier sous-programme qui est FSTSUB et le deuxième sous-programme qui est SECSUB. Laissez les entrées et sorties être dans la mémoire. Produisez également à la main le document de programme assemblé pour l’ensemble du programme.

Solution:

SECSUB CLC
LDA $021A
CAD 0234 $
STA 0236 $
MDL 021 milliards de dollars
CAD 0235 $
STA 0237 $
RTS

FSTSUB CLC
LDA 0216 $
CAD 0218 $
STA $021A
LDA 0217 $
CAD 0219 $
STA 021 milliards de dollars
RTS

JSR FSTSUB

Programme assemblé :

5) Étant donné qu'un ¯IRQ le gestionnaire ajoute 02 $ à 01 $ à l'accumulateur comme gestion de base pendant que ¯NMI est émis, et le traitement de base pour ¯NMI ajoute 05 $ à 04 $ à l'accumulateur, écrivez un langage assembleur pour les deux gestionnaires, y compris leurs appels. L'appel au ¯IRQ le gestionnaire doit être à l’adresse $0200. Le ¯IRQ Le gestionnaire doit commencer à l’adresse 0300 $. Le ¯NMI Le gestionnaire doit commencer à l’adresse 0400 $. Le résultat du ¯IRQ le gestionnaire doit être mis à l’adresse $0500, et le résultat du ¯NMI Le gestionnaire doit être placé à l’adresse $0501.

Solution:

NMISR PHA ; La routine NMI commence ici à l'adresse 0400 $
PHX
PHY
;
LDA #$04
CDA #$05
STA 0501 $
;
PLI
PLX
PLA
RTI

ISR PHA ; cette instruction est à l'adresse $0300
PHX
PHY
;
LDA #$01
CDA #$02
; JMP NMISR : commenté car cela ne fait pas partie de la routine
STA 0500 $ ; je vais empiler
;
PLI
PLX
PLA
RTI
;
JMP ISR ; cette instruction est à l'adresse $0200

6) Expliquez brièvement comment l'instruction BRK est utilisée pour produire l'interruption logicielle dans un ordinateur 65C02.

Solution:

Le principal moyen d'obtenir une interruption logicielle pour le 65C02 µP consiste à utiliser l'instruction d'adresse implicite BRK. Supposons que le programme principal est en cours d’exécution et qu’il rencontre l’instruction BRK. À partir de ce moment, l'adresse de l'instruction suivante dans le PC doit être envoyée à la pile à la fin de l'instruction en cours. Un sous-programme pour gérer l’instruction logicielle doit ensuite être appelé. Ce sous-programme d'interruption doit pousser le contenu des registres A, X et Y vers la pile. Une fois le cœur du sous-programme exécuté, le contenu des registres A, X et Y doit être retiré de la pile vers leurs registres par le sous-programme qui se termine. La dernière instruction de la routine est RTI. Le contenu du PC est également extrait automatiquement de la pile vers le PC, grâce à RTI.

7) Produisez un tableau qui compare et met en contraste un sous-programme normal avec une routine de service d'interruption.

Solution:

8) Expliquez brièvement les principaux modes d'adressage du 65C02 µP à partir des exemples d'instructions en langage assembleur.

Solution:

Chaque instruction du 6502 est constituée d'un octet, suivi de zéro ou plusieurs opérandes.

Mode d'adressage immédiat
Avec le mode d'adressage immédiat, après l'opérande, se trouve la valeur et non une adresse mémoire. La valeur doit être précédée de #. Si la valeur est en hexadécimal, alors « # » doit être suivi de « $ ». Les instructions d'adressage immédiat pour le 65C02 sont : ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Le lecteur doit consulter la documentation du 65C02 µP afin de savoir comment utiliser les instructions répertoriées ici qui n'ont pas été expliquées dans ce chapitre. Un exemple d'instruction est :

LDA #77$

Mode d'adressage absolu
Avec le mode d'adressage absolu, il n'y a qu'un seul opérande. Cet opérande est l'adresse de la valeur en mémoire (généralement en hexadécimal ou en label). Il y a 64K10 = 65,53610 adresses mémoire pour le 6502 µP. En règle générale, la valeur d'un octet se trouve à l'une de ces adresses. Les instructions d'adressage absolues pour le 65C02 sont : 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, BST. Le lecteur devra consulter la documentation du 65C02 µP afin de savoir comment utiliser les instructions listées ici ainsi que pour le reste des modes d'adressage qui n'ont pas été expliqués dans ce chapitre. Un exemple d'instruction est :

ILS SONT 1234$

Mode d'adressage implicite
Avec le mode d'adressage implicite, il n'y a pas d'opérande. Tout registre µP impliqué est impliqué par l'instruction. Les instructions d'adressage implicites pour le 65C02 sont : 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 exemple d'instruction est :

DEX : Décrémenter le registre X d'une unité.

Mode d'adressage relatif
Le mode d'adressage relatif ne concerne que les instructions de branchement. En mode d'adressage relatif, il n'y a qu'un seul opérande. C'est une valeur comprise entre -12810 et +12710. Cette valeur est appelée un décalage. En fonction du signe, cette valeur est ajoutée ou soustraite de l'instruction suivante du compteur de programme au résultat à l'adresse de l'instruction suivante prévue. Les instructions relatives du mode d'adressage sont : BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Les exemples d'instructions sont :

BNE $7F : (branche si Z = 0 dans le registre d'état, P)

qui ajoute 127 au compteur du programme actuel (adresse à exécuter) et commence à exécuter l'instruction à cette adresse. De la même manière:

BEQ $F9 : (branchement si Z = : dans le registre d'état, P)

qui ajoute un -7 au compteur du programme actuel et démarre l'exécution à la nouvelle adresse du compteur du programme. L’opérande est un nombre complémentaire à deux.

Adressage d'index absolu
Avec l'adressage par index absolu, le contenu du registre X ou Y est ajouté à l'adresse absolue donnée (de 0000 $ à FFFF, c'est-à-dire de 010 à 6553610) pour avoir l'adresse réelle. Cette adresse absolue donnée est appelée adresse de base. Si le registre X est utilisé, l'instruction d'assemblage ressemble à ceci :

MDL $C453,X

Si le registre Y est utilisé, cela ressemblerait à ceci :

MDL $C453,Y

La valeur du registre X ou Y est appelée valeur de comptage ou d'index et elle peut être comprise entre 00 $ (010) et $FF (25010). Cela ne s’appelle pas le décalage.

Les instructions d'adressage d'index absolu sont : ADC, AND, ASL (X uniquement), BIT (avec accumulateur et mémoire, avec X uniquement), CMP, DEC (mémoire et X uniquement), EOR, INC (mémoire et X uniquement), LDA. , LDX, LDY, LSR (X uniquement), ORA, ROL (X uniquement), ROR (X uniquement), SBC, STA, STZ (X uniquement).

Adressage indirect absolu
Ceci est utilisé uniquement avec l'instruction de saut. Avec cela, l'adresse absolue donnée a une adresse de pointeur. L'adresse du pointeur se compose de deux octets. Le pointeur de deux octets pointe vers (est l'adresse de) la valeur d'octet de destination dans la mémoire. Ainsi, l'instruction en langage assembleur est la suivante :

JMP (3 456 $)

Avec les parenthèses et $13 dans l'adresse $3456 tandis que $EB est dans l'adresse $3457 (= $3456 + 1), l'adresse de destination est $13EB et $13EB est le pointeur. L'absolu 3456 $ est entre parenthèses dans les instructions.

9) a) Écrivez un programme en langage machine 6502 pour mettre le « Je t'aime ! » chaîne de codes ASCII en mémoire, en commençant par l'adresse $0300 avec la longueur de la chaîne. Le programme devrait démarrer à l'adresse $0200. Obtenez chaque caractère de l'accumulateur, en supposant qu'ils y sont envoyés un par un par un sous-programme. Aussi, assemblez le programme à la main. (Si vous avez besoin de connaître les codes ASCII pour 'Je t'aime !', les voici : 'I':4916, espace : 2016, 'l' : 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 et '!':2116. Remarque : chaque code occupe 1 octet).

b) Écrivez un programme en langage machine 6502 pour mettre le « Je t'aime ! » chaîne de codes ASCII en mémoire, commençant à l'adresse $0300 sans la longueur de la chaîne mais se terminant par 0016. Le programme doit démarrer à l'adresse $0200. Obtenez chaque caractère de l'accumulateur, en supposant qu'ils y sont envoyés un par un par un sous-programme. Assemblez également le programme à la main.

Solution:

a) Stratégie : Il y a 12 octets pour la chaîne : 1 octet pour la longueur de la chaîne et 11 octets pour le littéral de la chaîne. Il doit donc y avoir 12 itérations (boucles) en comptant à partir de 0. Soit : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ce sont 12 nombres.

L'entier 0 est placé dans le registre X et le nombre 1110 = 1210 – 110 = B16 = $0B est placé dans un emplacement d'adresse dans la mémoire, par exemple l'adresse $0250. Pour chaque itération, la valeur dans le registre X est incrémentée et le résultat est comparé à 0 milliard $ à l'emplacement de l'adresse $0250. Juste après que la valeur de X soit égale à la valeur de 0 milliard de dollars, l'itération s'arrête. À ce stade, la longueur (nombre d’octets) de la chaîne et le littéral de la chaîne occupent les emplacements d’adresse de 0 300 $ à 030 B $ (inclus). Afin d'incrémenter les adresses mémoire à partir de 0300 $, le registre Y est utilisé. Le code est :

MDL #0 G$
ILS SONT 0250 $
LDX #00$
LDY #$00
STA 0300 $ ; la longueur de 11 est mise dans A par un sous-programme et va à 0300 $
boucle INX

0250 $ CPY
Boucle BEQ

b) Stratégie : il y a 12 octets pour la chaîne : 1 octet pour le terminateur Null $00 et 11 octets pour le littéral de chaîne. Il doit donc y avoir 12 itérations (boucles) en comptant à partir de 0. Soit : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ce sont 12 nombres.

L'entier 0 est placé dans le registre X et le nombre 1110 = 1210 – 110 = B16 = $0B est placé dans un emplacement d'adresse dans la mémoire, par exemple l'adresse $0250. Pour chaque itération, la valeur dans le registre X est incrémentée et le résultat est comparé à 0 milliard $ à l'emplacement de l'adresse $0250. Juste après que la valeur de X soit égale à la valeur de 0 milliard de dollars, l'itération s'arrête. À ce stade, le nombre d'octets de la chaîne littérale plus le caractère Null occupent les emplacements d'adresse $0300 à $030B (inclus). Afin d'incrémenter les adresses mémoire à partir de 0300 $, le registre Y est utilisé. Le code est :

MDL #0 G$
ILS SONT 0250 $
LDX #00$
LDY #$00
STA 0300 $ ; 'I' est mis dans A par un sous-programme et va à 0300 $
boucle INX

0250 $ CPY
Boucle BEQ