Voici un programme assembleur 8085 possible pour vérifier si une chaîne donnée est un palindrome :
```assemblage
BIO 100H
; Définir des constantes
STRLEN ÉQU 10
NULL_BYTE ÉQU 0
; Définir les emplacements mémoire
ORIGINE :équi 02H
STRING_LOCATION :équivalence 03H
STRING_LENGTH :équivalent à 04 H
; Définir l'utilisation du registre
A :équivalence 0 ; Accumulateur
B :équation 1; Mémoire indirecte
C :équation 2; Registre de transport
D :équation 3; Registre de données
E :équation 4; Registre d'indexation
H :équation 5; Registre haut de valeur 16 bits
L :équation 6; Registre bas de valeur 16 bits
M :équation 7; Pointeur de pile
P :équation 8; Mot d'état du programme
; Définir des drapeaux
ZÉRO :bit 0,P; Drapeau zéro
SIGNE :bit 1,P; Signer le drapeau
PARITÉ :bit 2,P; Drapeau de parité
CARRY :bit 4,P; Porter le drapeau
; Le programme principal commence ici
PRINCIPAL:
; Initialiser les données
XCHGH,L; Échanger les registres H et L
MVI E,STRING_LENGTH; Réglez E sur la longueur de la chaîne
MOUVEMENT H,E ; Copiez la longueur dans H
MVI L,NULL_BYTE; Initialisez L avec l'octet nul
ORIGINE SHLD; Stocker la longueur à l'adresse ORIGINE
MVI E, STRLEN; Réglez E sur la longueur maximale de la chaîne
MOUVEMENT D, STRLEN; Copiez la longueur maximale dans D
BOUCLE1 :
XTHL; Échangez les registres H et L pour charger à partir d'une adresse mémoire
MVI M,0; Initialiser l'emplacement mémoire avec un octet nul
INCRM ; Incrémenter le pointeur de mémoire
DCRE D; Décrémenter la longueur de la chaîne
BOUCLE NZ1 ; Continuez jusqu'à ce que la longueur de la chaîne atteigne 0
MVI E, STRLEN; Réglez E sur la longueur maximale de la chaîne
MOUVEMENT D, STRLEN; Copiez la longueur maximale dans D
READ_STRING :
EN 0,UNE; Lire un caractère au clavier
MOUVEMENT H,A ; Stocker le personnage en H
XTHL; Échangez les registres H et L pour charger à partir d'une adresse mémoire
MVI M,0; Initialiser l'emplacement mémoire avec un octet nul
ORIGINE LHLD; Charger l'adresse d'origine depuis la mémoire
INCRM ; Incrémenter le pointeur de mémoire
MOUVEMENT L,A ; Stocker le personnage dans L
ORIGINE SHLD; Stocker l'adresse du caractère suivant en mémoire
DCRE D; Décrémenter la longueur de la chaîne
Nouvelle-Zélande READ_STRING ; Continuez jusqu'à ce que la longueur de la chaîne atteigne 0
; Fonction pour vérifier si une chaîne est un palindrome
IS_PALINDROME :
; Enregistrer les registres
POUSSEZ H
APPUYEZ SUR D
; Bouclez sur la moitié de la corde
ORIGINE LHLD; Charger l'adresse d'origine depuis la mémoire
MOUVEMENT H,L ; Copiez l'octet faible de l'adresse dans H
AJOUTER HL ; Incrémenter l'adresse
MOUVEMENT L,H ; Copiez l'octet de poids fort de l'adresse dans L
MOUVEMENT D,L ; Copiez l'octet de poids fort de l'adresse dans D
PAPA D; Doublez l'adresse
XCHG H,D; Échanger les registres H et D
MOUVEMENT H,A ; Stocker le dernier caractère de H
DCRE E; Décrémenter la longueur de la chaîne
LOOP_PAL :
ORIGINE LHLD; Charger l'adresse d'origine depuis la mémoire
MOUVEMENT L,H ; Copiez l'octet de poids faible de l'adresse dans L
PAPA D; Doublez l'adresse
XTHL; Échangez les registres H et L pour charger à partir d'une adresse mémoire
IPC M ; Comparez le caractère à l'adresse actuelle avec le dernier caractère
POUSSER PSW ; Enregistrez les indicateurs d'état
ANI ZÉRO ; Vérifiez si les caractères sont égaux
POP PSW ; Restaurer les indicateurs d'état
JZ NOT_PALINDROME; Si égal, continuez
XCHG H,D; Échanger les registres H et D
MOUVEMENT H,A ; Stocker le caractère suivant dans H
DCRE E; Décrémenter la longueur de la chaîne
NZ LOOP_PAL; Continuer jusqu'à la fin de la chaîne
POP D
POP H
; Fin de fonction
RET
NOT_PALINDROME :
CMP E,0; Vérifiez si la longueur de la chaîne est 0
JZ PAL_DONE; Si 0, la chaîne est un palindrome
POP D
POP H
; Fonction pour imprimer une chaîne
PRINT_STRING :
; Enregistrer les registres
APPUYEZ SUR D
BOUCLE_PRINT :
ORIGINE LHLD; Charger l'adresse d'origine depuis la mémoire
SORTIE 0,A ; Imprimer le caractère à l'adresse actuelle
XTHL; Échangez les registres H et L pour charger à partir d'une adresse mémoire
IPC NULL_BYTE ; Vérifiez si le caractère est un octet nul
POP D
RETNZ
; Fonction pour imprimer un message indiquant que la chaîne est un palindrome
PRINT_PALINDROME :
MOUVEMENT E,STR_PALINDROME; Déplacer l'adresse du message vers le registre E
APPEL PRINT_STRING ; Appelez la fonction PRINT_STRING
; Fonction pour imprimer un message indiquant que la chaîne n'est pas un palindrome
PRINT_NOT_PALINDROME :
MOUVEMENT E,STR_NOT_PALINDROME; Déplacer l'adresse du message vers le registre E
APPEL PRINT_STRING ; Appelez la fonction PRINT_STRING
; Imprimer le résultat du contrôle palindrome
MVI A,'$'; Imprimez un signe dollar pour séparer le résultat
SORTIE 0,A ; Imprimez le signe dollar
CMP E,0; Vérifiez si la chaîne est un palindrome
JZ PRINT_PALINDROME; Si 0, imprime le message palindrome
APPELER PRINT_NOT_PALINDROME ; Sinon, imprimez le message non palindrome
; Imprimer un nouveau caractère de ligne
SORTIE 0,CRLF
; Arrêter le programme
HLT
; Chaînes à imprimer
STR_PALINDROME :DB '$La chaîne est un palindrome$'
STR_NOT_PALINDROME :DB '$La chaîne n'est pas un palindrome$'
CRLF :DB ODH,OAH,0 ; Retour chariot et saut de ligne
; Fin du programme
```
|