0

アセンブリ言語についてはよくわかりませんが、この回文を作ってみましたが、かなり大変です。最初に文字列を入力してから、元の文字列と反転した文字列を表示してから、回文かどうかを表示する必要があります。

別のフォーラムで読んだものからループを押してポップすることで逆文字列を表示する方法をすでに理解していて、今私にとって唯一の問題は、逆文字列と元の文字列を比較して、回文かどうか。

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

1 に答える 1

2

ユーザーが入力した文字列があります。最初のバイトと最後のバイトを比較し、2番目のバイトと最後から2番目のバイトについて同じことを行う必要があります。文字列全体に対してこれを続けます。文字列の長さも必要です。作業を楽にするために、文字列をすべて大文字またはすべて小文字に変換して、比較を容易にする必要があります。

彼らがまだ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
于 2013-03-17T04:11:37.197 に答える