2013-03-17 82 views
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!$" 

回答

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 
+0

嗯,這是他們在做什麼在這裏教我們在學校的16bit DOS。從來不知道這種語言有一個新的標準。感覺就像過時了。 生病嘗試比較第一個字節和最後一個字節,然後嘗試修改您給我的示例代碼,謝謝。 – 2013-03-17 04:30:25

+0

請問槍手什麼是SI和DI?舉一個例子說明這個SI和DI的工作原理。我猜這就是我如何比較第一個字節和最後一個字節是否正確? – 2013-03-18 12:43:51