```asamblea
ORG 100H
; Definir constantes
STRLEN EQU 10
NULL_BYTE EQU 0
; Definir ubicaciones de memoria
ORIGEN:equ 02H
STRING_LOCATION:ecuación 03H
STRING_LENGTH:ecuación 04H
; Definir el uso del registro
A:ecuación 0; Acumulador
B:ecuación 1; memoria indirecta
C:ecuación 2; llevar registro
D:ecuación 3; registro de datos
E:ecuación 4; registro de índice
H:ecuación 5; Registro alto de valor de 16 bits.
L:ecuación 6; Registro bajo de valor de 16 bits.
M:ecuación 7; puntero de pila
P:ecuación 8; Palabra de estado del programa
; Definir banderas
CERO:bit 0,P; bandera cero
SEÑAL:bit 1,P; Bandera de signo
PARIDAD:bit 2,P; bandera de paridad
LLEVAR:bit 4,P; llevar bandera
; El programa principal comienza aquí.
PRINCIPAL:
; Inicializar datos
XCHGH,L; Intercambiar registros H y L
MVI E,STRING_LENGTH; Establezca E en la longitud de la cuerda.
MOV H,E; Copia la longitud a H
MVI L,NULL_BYTE; Inicialice L con el byte nulo
ORIGEN DE LA DEMANDA; Almacene la longitud en la dirección ORIGEN
MVI E,STRLEN; Establezca E en la longitud máxima de la cuerda.
MOV D,STRLEN; Copie la longitud máxima a D
BUCLE1:
XTHL; Intercambie los registros H y L para cargar desde una dirección de memoria
MVIM,0; Inicializar la ubicación de la memoria con un byte nulo
INCR M; Puntero de memoria incremental
DCRE D; Disminuir la longitud de la cuerda
Nueva Zelanda LOOP1; Continúe hasta que la longitud de la cuerda llegue a 0
MVI E,STRLEN; Establezca E en la longitud máxima de la cuerda.
MOV D,STRLEN; Copie la longitud máxima a D
LEER_STRING:
EN 0,A; Leer un carácter del teclado
MOV H,A; Guarda el personaje en H.
XTHL; Intercambie los registros H y L para cargar desde una dirección de memoria
MVIM,0; Inicializar la ubicación de la memoria con un byte nulo
ORIGEN LHLD; Cargar la dirección de origen desde la memoria.
INCR M; Puntero de memoria incremental
MOV L,A; Guarda el personaje en L.
ORIGEN DE LA DEMANDA; Almacenar la dirección del siguiente carácter en la memoria.
DCRE D; Disminuir la longitud de la cuerda
Nueva Zelanda READ_STRING; Continúe hasta que la longitud de la cuerda llegue a 0
; Función para comprobar si una cadena es un palíndromo
ES_PALÍNDROME:
; Guardar registros
EMPUJAR H
EMPUJAR D
; Pasa la mitad de la cuerda
ORIGEN LHLD; Cargar la dirección de origen desde la memoria.
MOVIMIENTO H,L; Copie el byte bajo de la dirección a H
AÑADIR HL; Incrementar la dirección
MOV L, H; Copie el byte alto de la dirección a L
MOV D,L; Copie el byte alto de la dirección a D
PAPÁ D; Duplica la dirección
XCHGH,D; Intercambiar registros H y D
MOV H,A; Almacenar el último carácter en H
DCRE E; Disminuir la longitud de la cuerda
LOOP_PAL:
ORIGEN LHLD; Cargar la dirección de origen desde la memoria.
MOVIMIENTO L,H; Copie el byte bajo de la dirección a L
PAPÁ D; Duplica la dirección
XTHL; Intercambie los registros H y L para cargar desde una dirección de memoria
IPC M; Compare el carácter en la dirección actual con el último carácter
EMPUJAR PSW; Guardar las banderas de estado
ANÍ CERO; Comprueba si los caracteres son iguales.
POP PSW; Restaurar las banderas de estado
JZ NOT_PALINDROME; Si es igual, continúa
XCHGH,D; Intercambiar registros H y D
MOV H,A; Almacene el siguiente carácter en H
DCRE E; Disminuir la longitud de la cuerda
Nueva Zelanda LOOP_PAL; Continuar hasta el final de la cuerda.
POP D
POP H
; Fin de función
RETIRADO
NOT_PALÍNDROME:
CMPE,0; Compruebe si la longitud de la cadena es 0
JZ PAL_DONE; Si es 0, la cuerda es un palíndromo.
POP D
POP H
; Función para imprimir una cadena
IMPRIMIR_STRING:
; Guardar registros
EMPUJAR D
LOOP_PRINT:
ORIGEN LHLD; Cargar la dirección de origen desde la memoria.
FUERA 0,A; Imprime el carácter en la dirección actual.
XTHL; Intercambie los registros H y L para cargar desde una dirección de memoria
IPC NULL_BYTE; Compruebe si el carácter es un byte nulo
POP D
RETNZ
; Función para imprimir un mensaje indicando que la cadena es un palíndromo
IMPRIMIR_PALÍNDROMO:
MOVER E,STR_PALINDROMO; Mover la dirección del mensaje al registro E
LLAMAR A PRINT_STRING; Llame a la función PRINT_STRING
; Función para imprimir un mensaje indicando que la cadena no es un palíndromo
PRINT_NOT_PALÍNDROMO:
MOVER E,STR_NOT_PALINDROMO; Mover la dirección del mensaje al registro E
LLAMAR A PRINT_STRING; Llame a la función PRINT_STRING
; Imprime el resultado de la comprobación del palíndromo.
MVI A,'$'; Imprime un signo de dólar para separar el resultado.
FUERA 0,A; Imprime el signo de dólar
CMPE,0; Comprueba si la cuerda es un palíndromo.
JZ PRINT_PALINDROME; Si es 0, imprime el mensaje palíndromo.
LLAMAR A PRINT_NOT_PALINDROMO; De lo contrario, imprima el mensaje no palíndromo.
; Imprimir un carácter de nueva línea
SALIDA 0,CRLF
; detener el programa
HLT
; Cadenas para imprimir
STR_PALINDROME:DB '$La cadena es un palíndromo$'
STR_NOT_PALINDROME:DB '$La cadena no es un palíndromo$'
CRLF:DB ODH,OAH,0; Retorno de carro y avance de línea
; Fin del programa
```