"assemblea".
ORG 100H
; Definire le costanti
STRLEN EQU 10
NULL_BYTE EQU 0
; Definire le posizioni di memoria
ORIGINE:equ 02H
STRING_LOCATION:equivalente 03H
STRING_LENGTH:equivalente a 04H
; Definire l'utilizzo del registro
A:eq 0; Accumulatore
B:eq 1; Memoria indiretta
C:eq 2; Portare il registro
D:equ 3; Registro dati
E:equ 4; Registro indice
H:equ 5; Registro alto con valore a 16 bit
L:equ 6; Registro basso con valore a 16 bit
M:equ 7; Puntatore dello stack
P:equ 8; Parola di stato del programma
; Definire i flag
ZERO:bit 0,P; Bandiera zero
SEGNO:bit 1,P; Bandiera del segno
PARITÀ:bit 2,P; Bandiera di parità
CARRY:bit 4,P; Porta la bandiera
; Il programma principale inizia qui
PRINCIPALE:
; Inizializza i dati
XCHG H,L; Scambiare i registri H e L
MVI E,STRING_LENGTH; Imposta E sulla lunghezza della corda
MOV H,E; Copia la lunghezza in H
MVIL,NULL_BYTE; Inizializza L con il byte null
ORIGINE SHLD; Memorizza la lunghezza all'indirizzo ORIGIN
MVI E,STRLEN; Imposta E sulla lunghezza massima della corda
MOV D,STRLEN; Copia la lunghezza massima in D
CICLO1:
XTHL; Scambia i registri H e L per caricare da un indirizzo di memoria
MVI M,0; Inizializza la posizione di memoria con un byte nullo
INCR M; Incrementa il puntatore della memoria
DCRE D; Diminuire la lunghezza della stringa
NZ LOOP1; Continua finché la lunghezza della stringa non raggiunge 0
MVI E,STRLEN; Imposta E sulla lunghezza massima della corda
MOV D,STRLEN; Copia la lunghezza massima in D
READ_STRING:
IN0,A; Leggere un carattere dalla tastiera
MOVH,A; Memorizza il carattere in H
XTHL; Scambia i registri H e L per caricare da un indirizzo di memoria
MVI M,0; Inizializza la posizione di memoria con un byte nullo
ORIGINE LHLD; Carica l'indirizzo di origine dalla memoria
INCR M; Incrementa il puntatore della memoria
MOV L,A; Memorizzare il carattere in L
ORIGINE SHLD; Memorizza in memoria l'indirizzo del carattere successivo
DCRE D; Diminuire la lunghezza della stringa
NZ READ_STRING; Continua finché la lunghezza della stringa non raggiunge 0
; Funzione per verificare se una stringa è palindroma
IS_PALINDROME:
; Salva registri
SPINGI H
SPINGERE D
; Passa attraverso metà della corda
ORIGINE LHLD; Carica l'indirizzo di origine dalla memoria
MOV H,L; Copia il byte basso dell'indirizzo in H
AGGIUNGI HL; Incrementa l'indirizzo
MOV L,H; Copia il byte alto dell'indirizzo in L
MOVD,L; Copia il byte alto dell'indirizzo in D
PAPÀ D; Raddoppia l'indirizzo
XCHG H,D; Scambia i registri H e D
MOVH,A; Memorizza l'ultimo carattere in H
DCRE E; Diminuire la lunghezza della stringa
LOOP_PAL:
ORIGINE LHLD; Carica l'indirizzo di origine dalla memoria
MOV L,H; Copia il byte basso dell'indirizzo in L
PAPÀ D; Raddoppia l'indirizzo
XTHL; Scambia i registri H e L per caricare da un indirizzo di memoria
CPI M; Confronta il carattere dell'indirizzo corrente con l'ultimo carattere
PREMERE PSW; Salva i flag di stato
ANI ZERO; Controlla se i caratteri sono uguali
POPPSW; Ripristinare i flag di stato
JZ NOT_PALINDROME; Se è uguale, continua
XCHG H,D; Scambia i registri H e D
MOVH,A; Memorizza il carattere successivo in H
DCRE E; Diminuire la lunghezza della stringa
NZ LOOP_PAL; Continua fino alla fine della corda
POP D
POPH
; Fine della funzione
RET
NOT_PALINDROME:
CMP E,0; Controlla se la lunghezza della stringa è 0
JZ PAL_FATTO; Se 0, la stringa è palindromo
POP D
POPH
; Funzione per stampare una stringa
STAMPA_STRING:
; Salva registri
SPINGERE D
LOOP_PRINT:
ORIGINE LHLD; Carica l'indirizzo di origine dalla memoria
FUORI 0,A; Stampa il carattere all'indirizzo corrente
XTHL; Scambia i registri H e L per caricare da un indirizzo di memoria
CPI NULL_BYTE; Controlla se il carattere è un byte nullo
POP D
RETNZ
; Funzione per stampare un messaggio che indica che la stringa è palindroma
STAMPA_PALINDROME:
MOV E,STR_PALINDROME; Sposta l'indirizzo del messaggio nel registro E
CHIAMA STAMPA_STRING; Chiama la funzione PRINT_STRING
; Funzione per stampare un messaggio che indica che la stringa non è palindroma
PRINT_NOT_PALINDROME:
MOV E,STR_NOT_PALINDROME; Sposta l'indirizzo del messaggio nel registro E
CHIAMA STAMPA_STRING; Chiama la funzione PRINT_STRING
; Stampa il risultato del controllo palindromo
MVI A,'$'; Stampa il simbolo del dollaro per separare il risultato
FUORI 0,A; Stampa il simbolo del dollaro
CMP E,0; Controlla se la stringa è palindromo
JZ STAMPA_PALINDROME; Se 0, stampa il messaggio palindromo
CHIAMA PRINT_NOT_PALINDROME; Altrimenti stampa il messaggio non palindromo
; Stampa un carattere di nuova riga
USCITA 0,CRLF
; Interrompere il programma
HLT
; Stringhe da stampare
STR_PALINDROME:DB '$La stringa è palindroma$'
STR_NOT_PALINDROME:DB '$La stringa non è palindroma$'
CRLF:DB ODH, OAH, 0; Ritorno a capo e avanzamento riga
; Fine del programma
```
Programmazione © www.354353.com