2016-03-17 2 views
-1

Я ввожу четыре ASCII-символа: ch1, ch2, ch3, ch4.MASM: проверьте, что 4 символа являются palindrom

Я хочу проверить, является ли 4-буквенное слово палиндромом.

Алгоритм правильный, но он не будет компилироваться. Любые идеи почему?

; 
; isPalindrom.asm 
; 
    .MODEL SMALL 
    .STACK 100h 
    .DATA 
    ch1 DB ? ;var dec 
    ch2 DB ? ;var dec 
    ch3 DB ? ;var dec 
    ch4 DB ? ;var dec 
PrintUSER DB 13,10 
     DB 'Pls enter 4 chars:',13,10,'$' 
     ;Print 4 chars string 

PaliExists DB 13,10 
     DB 'Palindrome permutation exists',13,10,'$' 
     ;Print msg that pali exists 

PaliNOTExists DB 13,10 
     DB 'There is no possible solution',13,10,'$' 
     ;Print msg that pali does not exist 

    .CODE 
ProgStart: 
    MOV AX,@DATA    ; DS can be written to only through a register 
    MOV DS,AX    ; Set DS to point to data segment 

    MOV AH,9 
    MOV DX, Offset PrintUSER 
    INT 21h 

    MOV AH,1 
    INT 21h     ; Input to ch1 
    MOV ch1,AL 

    MOV AH,1 
    INT 21h     ; Input to ch2 
    MOV ch2,AL 

    MOV AH,1 
    INT 21h     ; Input to ch3 
    MOV ch3,AL 

    MOV AH,1 
    INT 21h 
    MOV ch4,AL  ; Input to ch4 
    ;//////////////////////////////// 

    CMP ch1, ch2 ; Compare ch1,ch2 
    JE checkThreeFour ; jump to label checkTwoThree 
    JMP Skip1 ;Skip compare ch3,ch4 

    checkThreeFour: ;label 
    CMP ch3, ch4 ; Compare ch3,ch4 
    JE Exists ; Jump to Exists 
    JMP notExists 

    Skip1: 
    CMP ch1, ch3 ;Compare ch1,ch3 
    JE checkTwoFour ;Jump 
    JMP Skip2: 

    checkTwoFour: 
    CMP ch2, ch4 ;Compare ch2,ch4 
    JE Exists ; Jump to Exists 
    JMP notExists 

    Skip2: 
    CMP ch1, ch4 ;Compare ch1,ch4 
    JE checkTwoThree ;Jump 
    JMP notExists 

    checkTwoThree: 
    CMP ch2, ch3 ;Compare ch2,ch3 
    JMP Exists ; Jump to Exists 
    JMP notExists 

Exists: ;print message for Existing pali 
    MOV AH,9 
    MOV DX, Offset PaliExists 
    INT 21h 
    JMP DisplayGreeting 

notExists: ; print messasge palindrom does not exist 
    MOV AH,9 
    MOV DX, Offset PaliNOTExists 
    INT 21h 


DisplayGreeting: 
    MOV AH,9       ; Set print option for int 21h 
    INT 21h       ; Print chosen message 
    MOV AH,4Ch    ; Set terminate option for int 21h 
    INT 21h     ; Return to DOS (terminate program) 
    END ProgStart 
+1

downvoted для гигантского блока кода, без упоминания которого линия была ошибка, или что сообщение об ошибке есть. Если вы опубликуете вопрос «исправить мою ошибку компиляции», по крайней мере, поместите ошибку компиляции в вопрос, чтобы найти этого человека в будущем, просматривая это сообщение об ошибке. –

ответ

3

Вы сравниваете два операнда памяти в

CMP chX, chY ;Compare ch2,ch3 

инструкции. В Intel ISA вы не сможете этого сделать. Один аргумент всегда должен быть регистром, см. Для CMP here.

Таким образом, решение будет состоять из MOV одного аргумента в регистр, а затем применить CMP.

PS: Простое решение, чтобы проверить, если 4-углеродно строка палиндром будет:

mov eax, dword ptr [string] 
mov edx, eax 
bswap edx 
cmp eax, edx 
je palindrome 
no_palindrome: 
... 
jmp end 
palindrome: 
... 
end: 
+0

Большое спасибо папе –