2013-03-17 2 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

У вас есть строка пользователя набранная, что вам нужно сделать, это сравнить первые байты с последним байтом, сделать то же самое для 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-м веке, 32bit 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

хорошо, что это то, что они преподавая нам здесь в школе 16-битный DOS. никогда не знал, что на этом языке появился новый стандарт. Похоже, что я устарел. плохо попробуйте сравнить первый и последний байты, затем попробуйте изменить образец кода, который вы мне дали. –

+0

извините меня Gunner, что такое SI и DI ?? дайте мне пример, как это SI и DI работает. Я предполагаю, что так я сравниваю первый и последний байты, это правильно? –

Смежные вопросы