Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
```montáž
ORG 100H
; Definujte konštanty
STRLEN EQU 10
NULL_BYTE EQU 0
; Definujte miesta v pamäti
ORIGIN:ekv 02H
STRING_LOCATION:ekv 03H
STRING_LENGTH:ekv 04H
; Definujte použitie registra
A:ekv 0; Akumulátor
B:ekv 1; Nepriama pamäť
C:ekv 2; Noste register
D:ekv 3; Register údajov
E:ekv 4; Indexový register
H:ekv 5; Vysoký register 16-bitovej hodnoty
L:ekv 6; Nízky register 16-bitovej hodnoty
M:ekv 7; Ukazovateľ zásobníka
P:ekv 8; Stavové slovo programu
; Definujte vlajky
NULA:bit 0,P; Nulová vlajka
SIGN:bit 1,P; Podpísať vlajku
PARITY:bit 2,P; Vlajka parity
PRENOS:bit 4,P; Nosiť vlajku
; Hlavný program začína tu
HLAVNÉ:
; Inicializujte údaje
XCHG H,L; Výmena registrov H a L
MVI E, STRING_DĹŽKA; Nastavte E na dĺžku reťazca
MOV H,E; Skopírujte dĺžku do H
MVI L,NULL_BYTE; Inicializujte L s nulovým bajtom
SHLD ORIGIN; Dĺžku uložte na adresu ORIGIN
MVI E,STRLEN; Nastavte E na maximálnu dĺžku reťazca
MOV D,STRLEN; Skopírujte maximálnu dĺžku do D
LOOP1:
XTHL; Zameňte registre H a L na načítanie z adresy pamäte
MVI M,0; Inicializujte pamäťové miesto s nulovým bajtom
INCR M; Ukazovateľ prírastku pamäte
DCRE D; Znížte dĺžku reťazca
NZ LOOP1; Pokračujte, kým dĺžka reťazca nedosiahne 0
MVI E,STRLEN; Nastavte E na maximálnu dĺžku reťazca
MOV D,STRLEN; Skopírujte maximálnu dĺžku do D
READ_STRING:
IN 0,A; Prečítajte si znak z klávesnice
MOV H,A; Uložte postavu do H
XTHL; Zameňte registre H a L na načítanie z adresy pamäte
MVI M,0; Inicializujte pamäťové miesto s nulovým bajtom
LHLD ORIGIN; Načítajte pôvodnú adresu z pamäte
INCR M; Ukazovateľ prírastku pamäte
MOV L,A; Uložte postavu do L
SHLD ORIGIN; Uložte adresu nasledujúceho znaku do pamäte
DCRE D; Znížte dĺžku reťazca
NZ READ_STRING; Pokračujte, kým dĺžka reťazca nedosiahne 0
; Funkcia na kontrolu, či je reťazec palindróm
IS_PALINDROME:
; Uložiť registre
PUSH H
STLAČIŤ D
; Prevlečte polovicu šnúrky
LHLD ORIGIN; Načítajte pôvodnú adresu z pamäte
MOV H,L; Skopírujte spodný bajt adresy do H
PRIDAŤ HL; Zvýšte adresu
MOV L,H; Skopírujte vysoký bajt adresy do L
MOV D,L; Skopírujte vysoký bajt adresy do D
DAD D; Zdvojnásobte adresu
XCHG H,D; Vymeňte registre H a D
MOV H,A; Uložte posledný znak do H
DCRE E; Znížte dĺžku reťazca
LOOP_PAL:
LHLD ORIGIN; Načítajte pôvodnú adresu z pamäte
MOV L,H; Skopírujte spodný bajt adresy do L
DAD D; Zdvojnásobte adresu
XTHL; Zameňte registre H a L na načítanie z adresy pamäte
CPI M; Porovnajte znak na aktuálnej adrese s posledným znakom
PUSH PSW; Uložte príznaky stavu
ANI NULA; Skontrolujte, či sú znaky rovnaké
POP PSW; Obnovte stavové príznaky
JZ NOT_PALINDROME; Ak je rovnaký, pokračujte
XCHG H,D; Vymeňte registre H a D
MOV H,A; Uložte ďalší znak do H
DCRE E; Znížte dĺžku reťazca
NZ LOOP_PAL; Pokračujte až do konca šnúrky
POP D
POP H
; Koniec funkcie
RET
NOT_PALINDROME:
CMP E,0; Skontrolujte, či je dĺžka reťazca 0
JZ PAL_DONE; Ak je 0, reťazec je palindróm
POP D
POP H
; Funkcia na tlač reťazca
PRINT_STRING:
; Uložiť registre
STLAČIŤ D
LOOP_PRINT:
LHLD ORIGIN; Načítajte pôvodnú adresu z pamäte
OUT 0,A; Vytlačte znak na aktuálnej adrese
XTHL; Zameňte registre H a L na načítanie z adresy pamäte
CPI NULL_BYTE; Skontrolujte, či je znak prázdnym bajtom
POP D
RETNZ
; Funkcia na vytlačenie správy označujúcej, že reťazec je palindróm
PRINT_PALINDROME:
MOV E,STR_PALINDROME; Presuňte adresu správy do registra E
CALL PRINT_STRING; Zavolajte funkciu PRINT_STRING
; Funkcia na vytlačenie správy označujúcej, že reťazec nie je palindróm
PRINT_NOT_PALINDROME:
MOV E,STR_NOT_PALINDROME; Presuňte adresu správy do registra E
CALL PRINT_STRING; Zavolajte funkciu PRINT_STRING
; Vytlačte výsledok kontroly palindrómu
MVI A,'$'; Vytlačte znak dolára na oddelenie výsledku
OUT 0,A; Vytlačte znak dolára
CMP E,0; Skontrolujte, či je reťazec palindróm
JZ PRINT_PALINDROME; Ak je 0, vytlačte správu palindrómu
CALL PRINT_NOT_PALINDROME; V opačnom prípade vytlačte správu nie je palindróm
; Vytlačte znak nového riadku
OUT 0,CRLF
; Zastavte program
HLT
; Reťazce na tlač
STR_PALINDROME:DB '$Reťazec je palindróm$'
STR_NOT_PALINDROME:DB '$Reťazec nie je palindróm$'
CRLF:DB ODH,OAH,0; Vrátenie vozíka a posuv riadku
; Koniec programu
```