Hier is een mogelijk 8085-assemblageprogramma om te controleren of een bepaalde string een palindroom is:
```montage
ORG 100H
; Definieer constanten
STRLEN EQU 10
NULL_BYTE EQU 0
; Definieer geheugenlocaties
HERKOMST:equ 02H
STRING_LOCATION:gelijk aan 03H
STRING_LENGTH:gelijk aan 04H
; Definieer het registergebruik
A:gelijk aan 0; Accumulator
B:gelijk 1; Indirect geheugen
C:gelijk 2; Register meenemen
D:gelijk 3; Gegevens registreren
E:gelijk 4; Indexregister
H:gelijk 5; Hoog register van 16-bits waarde
L:gelijk 6; Laag register van 16-bits waarde
M:gelijk 7; Stapelwijzer
P:gelijk 8; Programmastatuswoord
; Definieer vlaggen
NUL:bit 0,P; Nul vlag
TEKEN:bit 1,P; Teken vlag
PARITEIT:bit 2,P; Pariteit vlag
DRAGEN:bit 4,P; Vlag dragen
; Het hoofdprogramma begint hier
VOORNAAMST:
; Initialiseer gegevens
XCHG H,L; Wissel H- en L-registers uit
MVI E,STRING_LENGTH; Stel E in op de lengte van de snaar
MOV H,E; Kopieer de lengte naar H
MVI L,NULL_BYTE; Initialiseer L met de nulbyte
SHLD-OORSPRONG; Sla de lengte op op het ORIGIN-adres
MVI E,STRLEN; Stel E in op de maximale lengte van de snaar
MOV D,STRLEN; Kopieer de maximale lengte naar D
LOOP1:
XTHL; Verwissel H- en L-registers om te laden vanaf een geheugenadres
MVI M,0; Initialiseer de geheugenlocatie met een nulbyte
INCR M; Geheugenaanwijzer verhogen
DCRE D; Verlaag de tekenreekslengte
NZ LOOP1; Ga door totdat de tekenreekslengte 0 bereikt
MVI E,STRLEN; Stel E in op de maximale lengte van de snaar
MOV D,STRLEN; Kopieer de maximale lengte naar D
READ_STRING:
IN 0,A; Lees een teken van het toetsenbord
MOV H,A; Sla het teken op in H
XTHL; Verwissel H- en L-registers om te laden vanaf een geheugenadres
MVI M,0; Initialiseer de geheugenlocatie met een nulbyte
LHLD-OORSPRONG; Laad het oorsprongsadres uit het geheugen
INCR M; Geheugenaanwijzer verhogen
MOV L,A; Sla het teken op in L
SHLD-OORSPRONG; Sla het adres van het volgende teken in het geheugen op
DCRE D; Verlaag de tekenreekslengte
NZ READ_STRING; Ga door totdat de tekenreekslengte 0 bereikt
; Functie om te controleren of een string een palindroom is
IS_PALINDROME:
; Registers opslaan
DRUK H
DRUK D
; Loop door de helft van het touw
LHLD-OORSPRONG; Laad het oorsprongsadres uit het geheugen
MOV H,L; Kopieer de lage byte van het adres naar H
HL TOEVOEGEN; Verhoog het adres
MOV L,H; Kopieer de hoge byte van het adres naar L
MOV D,L; Kopieer de hoge byte van het adres naar D
PAPA D; Verdubbel het adres
XCHG H,D; Wissel H- en D-registers om
MOV H,A; Sla het laatste teken op in H
DCRE E; Verlaag de tekenreekslengte
LOOP_PAL:
LHLD-OORSPRONG; Laad het oorsprongsadres uit het geheugen
MOV L,H; Kopieer de lage byte van het adres naar L
PAPA D; Verdubbel het adres
XTHL; Verwissel H- en L-registers om te laden vanaf een geheugenadres
CPI M; Vergelijk het teken op het huidige adres met het laatste teken
DRUK PSW; Sla de statusvlaggen op
ANI NUL; Controleer of de karakters gelijk zijn
POP PSW; Herstel de statusvlaggen
JZ NOT_PALINDROME; Indien gelijk, doorgaan
XCHG H,D; Wissel H- en D-registers om
MOV H,A; Sla het volgende teken op in H
DCRE E; Verlaag de tekenreekslengte
NZ LOOP_PAL; Ga door tot het einde van het touwtje
POP D
POP H
; Einde functie
RET
NOT_PALINDROME:
CMP E,0; Controleer of de tekenreekslengte 0 is
JZ PAL_DONE; Indien 0, is de string een palindroom
POP D
POP H
; Functie om een string af te drukken
PRINT_STRING:
; Registers opslaan
DRUK D
LOOP_PRINT:
LHLD-OORSPRONG; Laad het oorsprongsadres uit het geheugen
UIT 0,A; Druk het teken af op het huidige adres
XTHL; Verwissel H- en L-registers om te laden vanaf een geheugenadres
CPI NULL_BYTE; Controleer of het teken een null-byte is
POP D
RETNZ
; Functie om een bericht af te drukken dat aangeeft dat de string een palindroom is
PRINT_PALINDROME:
MOV E,STR_PALINDROME; Verplaats het berichtadres naar het E-register
OPROEP PRINT_STRING; Roep de PRINT_STRING-functie aan
; Functie om een bericht af te drukken dat aangeeft dat de string geen palindroom is
PRINT_NOT_PALINDROME:
MOV E,STR_NOT_PALINDROME; Verplaats het berichtadres naar het E-register
OPROEP PRINT_STRING; Roep de PRINT_STRING-functie aan
; Druk het resultaat van de palindroomcontrole af
MVI A,'$'; Druk een dollarteken af om het resultaat te scheiden
UIT 0,A; Druk het dollarteken af
CMP E,0; Controleer of de string een palindroom is
JZ PRINT_PALINDROME; Indien 0, druk dan het palindroombericht af
OPROEP PRINT_NOT_PALINDROME; Druk anders het bericht 'niet palindroom' af
; Druk een nieuw regelteken af
UIT 0,CRLF
; Stop het programma
HLT
; Tekenreeksen om af te drukken
STR_PALINDROME:DB '$De string is een palindroom$'
STR_NOT_PALINDROME:DB '$De string is geen palindroom$'
CRLF:DB ODH,OAH,0; Vervoerretour en regelinvoer
; Einde programma
``` |