Victoriously Epic
Victoriously Epic

Reputation: 3

how to check compare if palindrome or not?

I don't know much of assembly language but I tried making this palindrome and it's quite hard. First I have to enter a string then show its original and reversed string then show if its a palindrome or not.

I already figured out how to show the reverse string by pushing and popping it through a loop from what I have read in another forum and figured it out now the only problem for me is to compare the reverse string and original string to check if its a palindrome or not.

call clearscreen

mov dh, 0
mov dl, 0
call cursor
mov ah, 09h
mov dx, offset str1
int 21h

palin db 40 dup(?)
mov ah, 0ah
mov palin, 40
mov dx, offset palin
int 21h

mov dh, 1
mov dl, 0
call cursor
mov ah, 09h
mov dx, offset str2
int 21h

mov si, 2
forward:
mov al, palin + si
cmp al, 13
je palindrome
mov ah, 02h
mov dl, al
push ax      'push the letter to reverse
int 21h
inc si
jmp forward
 palindrome:

 mov dh, 2
 mov dl, 0
 call cursor
 mov ah, 09h
 mov dx, offset str3
 int 21h

 mov cx, 40   'pop each letter through a loop to show its reverse 
 reverse:
 mov ah, 02h
 pop ax
 mov dl, al
 int 21h
 loop reverse

 int 20h

 clearscreen:
mov ax, 0600h
mov bh, 0Eh
mov cx, 0
mov dx, 8025
int 10h
ret
 cursor:
mov ah, 02h
mov bh, 0
int 10h
ret
str1: db "Enter A String : $"
str2: db "Forward : $"
str3: db "Backward : $"
str4: db "Its a Palindrome! $"
str5: db "Not a Palindrome!$"

Upvotes: 0

Views: 1648

Answers (1)

Gunner
Gunner

Reputation: 5884

You have a string the user typed in, what you need to do is compare the first byte with the last byte, do the same for the 2nd one and the 2nd to last one. Keep doing this for the whole string. You also need the length of the string. To make life easier, you should convert the string to all UPPER case letters or all lowercase letters to make comparison easier.

It is unfortunate they are still teaching 16bit DOS code. This is a sample with the word defined in the data section. You will have to modify it to receive input and work on that string

.data
    pal db "racecar"
    pal_len equ $ - pal  - 1
    szYes     db "yes$"
    szNo      db "no$"
.code

start:  
    mov     ax,@data
    mov     ds,ax

    call    IsPalindrome

    mov     ah,4ch
    int     21h

IsPalindrome:    
    lea     si, pal
    lea     di, pal
    add     di, pal_len
    mov     cx, 0
CheckIt:
    mov     al, byte ptr [si]
    mov     dl, byte ptr [di]
    cmp     al, dl
    jne     No
    inc     si
    dec     di
    inc     cx
    cmp     cx, pal_len
    jne     CheckIt

    mov ah,9
    lea dx,szYes
    int 21h
    ret

No:
    mov ah,9
    lea dx,szNo
    int 21h
    ret
end start

For completeness and to bring us into the 21st century, 32bit NASM code:

section .data
fmt         db  "%s", 0
szPal       db  "RACECAR"
Pal_len     equ $ - szPal - 1
szYes       db  "Yes", 10, 0
szNo        db  "No", 10, 0

extern printf, exit

global _start
section .text
_start:
    call    IsPalindrome
    call    exit

IsPalindrome:

    mov     ecx, 0
    mov     ebx, Pal_len
    mov     esi, szPal

.CheckIt:
    mov     al, byte [esi + ecx]
    mov     dl, byte [esi + ebx]
    cmp     al, dl
    jne     .No
    inc     ecx
    dec     ebx
    jns     .CheckIt

    push    szYes
    push    fmt
    call    printf
    add     esp, 4 * 2
    mov     eax, 1
    jmp     Done

.No:
    push    szNo
    push    fmt
    call    printf
    add     esp, 4 * 2
    xor     eax, eax
Done:    
    ret

Upvotes: 2

Related Questions