``` συναρμολόγηση
ORG 100H
; Ορίστε σταθερές
STRLEN EQU 10
NULL_BYTE EQU 0
; Καθορίστε τοποθεσίες μνήμης
ΠΡΟΕΛΕΥΣΗ:equ 02H
STRING_LOCATION:εξίσωση 03H
STRING_LENGTH:εξίσωση 04 Ω
; Ορίστε τη χρήση εγγραφής
Α:εξίσωση 0; Συσσωρευτής
Β:εξίσωση 1; Έμμεση μνήμη
C:εξίσωση 2; Μεταφορά μητρώου
D:εξίσωση 3; Μητρώο δεδομένων
Ε:εξίσωση 4; Μητρώο ευρετηρίου
Η:εξίσωση 5; Υψηλό καταχωρητή τιμής 16 bit
L:εξίσωση 6; Χαμηλό καταχωρητή τιμής 16 bit
Μ:εξίσωση 7; Δείκτης στοίβας
Ρ:εξίσωση 8; Λέξη κατάστασης προγράμματος
; Ορίστε σημαίες
ΜΗΔΕΝ:bit 0,P; Σημαία μηδέν
ΣΗΜΑ:bit 1,P; Σημαία σημαία
ΙΣΟΤΗΤΑ:bit 2,P; Σημαία ισοτιμίας
CARRY:bit 4,P; Φέρτε σημαία
; Το κύριο πρόγραμμα ξεκινά εδώ
ΚΥΡΙΟΣ:
; Αρχικοποίηση δεδομένων
XCHG H,L; Καταχωρητές H και L ανταλλαγής
MVI E,STRING_LENGTH; Ρυθμίστε το E στο μήκος της χορδής
MOV H,E; Αντιγράψτε το μήκος στο H
MVI L,NULL_BYTE; Αρχικοποιήστε το L με το null byte
SHLD ORIGIN; Αποθηκεύστε το μήκος στη διεύθυνση ORIGIN
MVI E,STRLEN; Ρυθμίστε το E στο μέγιστο μήκος της συμβολοσειράς
MOV D,STRLEN; Αντιγράψτε το μέγιστο μήκος στο D
LOOP1:
XTHL; Εναλλαγή καταχωρήσεων H και L για φόρτωση από μια διεύθυνση μνήμης
MVI M,0; Αρχικοποιήστε τη θέση μνήμης με ένα μηδενικό byte
INCR M; Αύξηση δείκτη μνήμης
DCRE D; Μειώστε το μήκος της χορδής
NZ LOOP1; Συνεχίστε μέχρι το μήκος της χορδής να φτάσει το 0
MVI E,STRLEN; Ρυθμίστε το E στο μέγιστο μήκος της συμβολοσειράς
MOV D,STRLEN; Αντιγράψτε το μέγιστο μήκος στο D
READ_STRING:
ΣΕ 0,Α; Διαβάστε έναν χαρακτήρα από το πληκτρολόγιο
MOV H,A; Αποθηκεύστε τον χαρακτήρα στο H
XTHL; Εναλλαγή καταχωρήσεων H και L για φόρτωση από μια διεύθυνση μνήμης
MVI M,0; Αρχικοποιήστε τη θέση μνήμης με ένα μηδενικό byte
LHLD ORIGIN; Φορτώστε τη διεύθυνση προέλευσης από τη μνήμη
INCR M; Αύξηση δείκτη μνήμης
MOV L,A; Αποθηκεύστε τον χαρακτήρα στο L
SHLD ORIGIN; Αποθηκεύστε τη διεύθυνση του επόμενου χαρακτήρα στη μνήμη
DCRE D; Μειώστε το μήκος της χορδής
NZ READ_STRING; Συνεχίστε μέχρι το μήκος της χορδής να φτάσει το 0
; Λειτουργία για έλεγχο εάν μια συμβολοσειρά είναι παλίνδρομο
IS_PALINDROME:
; Αποθήκευση μητρώων
ΩΘΗΣΗ Η
ΩΘΗΣΗ Δ
; Περάστε το μισό κορδόνι
LHLD ORIGIN; Φορτώστε τη διεύθυνση προέλευσης από τη μνήμη
MOV H,L; Αντιγράψτε το χαμηλό byte της διεύθυνσης στο H
ΠΡΟΣΘΗΚΗ HL; Αυξήστε τη διεύθυνση
MOV L,H; Αντιγράψτε το υψηλό byte της διεύθυνσης στο L
MOV D,L; Αντιγράψτε το υψηλό byte της διεύθυνσης στο D
DAD D; Διπλασιάστε τη διεύθυνση
XCHG H,D; Εναλλαγή καταχωρητών H και D
MOV H,A; Αποθηκεύστε τον τελευταίο χαρακτήρα στο H
DCRE E; Μειώστε το μήκος της χορδής
LOOP_PAL:
LHLD ORIGIN; Φορτώστε τη διεύθυνση προέλευσης από τη μνήμη
MOV L,H; Αντιγράψτε το χαμηλό byte της διεύθυνσης στο L
DAD D; Διπλασιάστε τη διεύθυνση
XTHL; Εναλλαγή καταχωρήσεων H και L για φόρτωση από μια διεύθυνση μνήμης
CPI M; Συγκρίνετε τον χαρακτήρα στην τρέχουσα διεύθυνση με τον τελευταίο χαρακτήρα
PUSH PSW; Αποθηκεύστε τις σημαίες κατάστασης
ANI ΜΗΔΕΝ; Ελέγξτε αν οι χαρακτήρες είναι ίσοι
POP PSW; Επαναφέρετε τις σημαίες κατάστασης
JZ NOT_PALINDROME; Αν είναι ίσο, συνεχίστε
XCHG H,D; Εναλλαγή καταχωρητών H και D
MOV H,A; Αποθηκεύστε τον επόμενο χαρακτήρα στο H
DCRE E; Μειώστε το μήκος της χορδής
NZ LOOP_PAL; Συνεχίστε μέχρι το τέλος της χορδής
ΠΟΠ Δ
POP H
; Τέλος λειτουργίας
ΜΟΥΣΚΕΥΩ
NOT_PALINDROME:
CMP E,0; Ελέγξτε εάν το μήκος της συμβολοσειράς είναι 0
JZ PAL_DONE; Αν 0, η συμβολοσειρά είναι παλίνδρομο
ΠΟΠ Δ
POP H
; Λειτουργία εκτύπωσης συμβολοσειράς
PRINT_STRING:
; Αποθήκευση μητρώων
ΩΘΗΣΗ Δ
LOOP_PRINT:
LHLD ORIGIN; Φορτώστε τη διεύθυνση προέλευσης από τη μνήμη
OUT 0,A; Εκτυπώστε τον χαρακτήρα στην τρέχουσα διεύθυνση
XTHL; Εναλλαγή καταχωρήσεων H και L για φόρτωση από μια διεύθυνση μνήμης
CPI NULL_BYTE; Ελέγξτε αν ο χαρακτήρας είναι μηδενικό byte
ΠΟΠ Δ
RETNZ
; Λειτουργία για την εκτύπωση ενός μηνύματος που υποδεικνύει ότι η συμβολοσειρά είναι παλίνδρομο
PRINT_PALINDROME:
MOV E,STR_PALINDROME; Μετακινήστε τη διεύθυνση του μηνύματος στον καταχωρητή E
ΚΛΗΣΗ PRINT_STRING; Καλέστε τη συνάρτηση PRINT_STRING
; Λειτουργία για την εκτύπωση ενός μηνύματος που υποδεικνύει ότι η συμβολοσειρά δεν είναι παλίνδρομο
PRINT_NOT_PALINDROME:
MOV E,STR_NOT_PALINDROME; Μετακινήστε τη διεύθυνση του μηνύματος στον καταχωρητή E
ΚΛΗΣΗ PRINT_STRING; Καλέστε τη συνάρτηση PRINT_STRING
; Εκτυπώστε το αποτέλεσμα του ελέγχου παλίνδρομου
MVI A,'$'; Εκτυπώστε ένα σύμβολο δολαρίου για να διαχωρίσετε το αποτέλεσμα
OUT 0,A; Εκτυπώστε το σύμβολο του δολαρίου
CMP E,0; Ελέγξτε αν η χορδή είναι παλίνδρομο
JZ PRINT_PALINDROME; Εάν είναι 0, εκτυπώστε το μήνυμα παλίνδρομου
ΚΛΗΣΗ PRINT_NOT_PALINDROME; Διαφορετικά, εκτυπώστε το μήνυμα not palindrome
; Εκτυπώστε έναν νέο χαρακτήρα γραμμής
OUT 0,CRLF
; Διακόψτε το πρόγραμμα
HLT
; Συμβολοσειρές για εκτύπωση
STR_PALINDROME:DB '$The string is a palindrome$'
STR_NOT_PALINDROME:DB '$Η συμβολοσειρά δεν είναι παλίνδρομο$'
CRLF:DB ODH,OAH,0; Επιστροφή μεταφοράς και τροφοδοσία γραμμής
; Τέλος προγράμματος
```
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα