如果回顾如何检查回文?

时间:2013-03-17 03:05:30

标签: string assembly x86 reverse palindrome

我对汇编语言知之甚少,但我尝试制作这个回文,这很难。首先,我必须输入一个字符串,然后显示其原始和反向字符串,然后显示它是否是一个回文。

我已经想出了如何通过从我在另一个论坛中读到的循环推送并弹出它来显示反向字符串并找出它 现在唯一的问题是比较反向字符串和原始字符串以检查它是否是回文。

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!$"

1 个答案:

答案 0 :(得分:2)

您有一个用户输入的字符串,您需要做的是将第一个字节与最后一个字节进行比较,对第二个字节和第二个字节进行相同操作。继续为整个字符串执行此操作。您还需要字符串的长度。为了让生活更轻松,您应该将字符串转换为所有UPPER大小写字母或全部小写字母,以便于比较。

不幸的是,他们仍然在教16位DOS代码。这是一个带有数据部分中定义的单词的示例。 必须修改它才能接收输入并处理该字符串

.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

为了完整性并将我们带入21世纪,32位NASM代码:

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