协助回文装配

时间:2013-11-27 18:11:53

标签: assembly x86 nasm

这是我到目前为止的工作

.DATA

LF              EQU         10
String_prompt   DB          "Enter a character string: ",0
Is_palindrome   DB          "The string is a palindrome.",0
Not_palindrome  DB          "The string is not a palindrome.",0



.UDATA

user_input      resb        80  
strip_input     resb        80  

.CODE

.STARTUP
; Set up ES register
    mov         AX, DS
    mov         ES, AX

    try_again:    
        GetStr      user_input
        cmp         user_input, LF
        je          try_again
        mov         EDX, user_input
        call        string_convert




.EXIT

;********************************************
; string_convert: Eliminate blanks and 
;     punctuation. Convert to upper case
;
;********************************************        
string_convert:
        enter  0, 0
        xor     EBX, EBX
        mov     ECX, 80

        read:
            mov     AL, [EDX+EBX]
            cmp     AL, '0'
            jl      skip
            cmp     AL, '9'
            jg      check

            check:
                sub     AL, 20H
                cmp     AL, 'A'
                jl      skip
                cmp     AL, 'Z'
                jle     write
                cmp     AL, 5BH            :check for ASCII past 'Z'
                jge     skip

            skip:
                inc     EBX
                jmp     read

            write:
                push    AX
                push    ECX
                les     EDI, user_input
                mov     ECX, 80
                cld
                mov     AL, 0
                repne   scasb




        leave
        ret    

我已经了解了如何检查反向字符串的基本概念,使用堆栈来反转它但我还挂了如何将这些字符写入新字符串strip_input

有没有办法将未初始化的字符串与单个字符连接?我想要做的是删除所有标点符号和数字的user_input,同时将所有字符转换为大写。我认为我的检查设置正确,但我坚持write:程序。

还有一种更好的方法来读取用户的输入而不是只接受80个字符吗?我觉得这会导致问题,如果它是一个回文,因为所有的空白区域。

所以我得到它大部分输出,这就是我现在的位置,我似乎在第一次函数调用后得到错误

LF              EQU         10
String_prompt   DB          "Enter a character string: ",0
Is_palindrome   DB          "The string is a palindrome.",0
Not_palindrome  DB          "The string is not a palindrome.",0
index           DB          0



.UDATA

user_input      resb        80  
strip_input     resb        80  
final_input     resb        80

.CODE

.STARTUP
; Set up ES register
    mov         AX, DS
    mov         ES, AX

    try_again:    
        PutStr      String_prompt
        GetStr      user_input
        cmp         word[user_input], LF
        je          try_again

    call    string_convert
    call    string_reverse
    call    palindrome_check
    PutStr  user_input
    PutStr  strip_input
    PutStr  final_input
    cmp     EAX, 1
    jne     notP
    PutStr  Is_palindrome

    notP:
        PutStr  Not_palindrome


.EXIT

;********************************************
; string_convert: Eliminate blanks and 
;     punctuation. Convert to upper case
;
;********************************************        
string_convert:
        enter  0, 0
        xor     EBX, EBX
        mov     ECX, 80

        read:
            cmp     ECX, 0
            jz      endread   
            mov     AL, byte [user_input+EBX]
            cmp     AL, '9'
            jle     skip
            cmp     AL, 7BH
            jge     skip 

            check:
                inc     EBX
                or      AL, 20H
                cmp     AL, 'a'
                jl      skip
                cmp     AL, 'z'
                jle     write


            skip:
                inc     EBX
                loop    read

            write:
                ;PutCh   AL
                push    EBX
                mov     EBX, [index]
                mov     byte [strip_input+EBX], AL
                inc     EBX
                mov     [index], EBX
                pop     EBX
                loop    read

        endread:

        leave
        ret     
;*********************************************
; string_reverse: Recursive procedure to 
;     reverse string
;
;
;*********************************************
string_reverse:
        enter   0,0
        xor     EBX, EBX
        xor     EAX, EAX
        push    0

        checknull:
            mov     AL, byte [strip_input+EBX]
            PutCh   AL
            cmp     AL, 0
            je      reverse
            ret

        pushtostack:
            push    AX
            inc     EBX
            call    checknull

        reverse:
            xor     EBX, EBX
            pop     AX
            cmp     AL, 0
            je      end
            mov     byte [final_input+EBX],AL
            inc     EBX 
            jmp     reverse

        end:



        leave
        ret
;************************************************
;palindrome check: Check for palindrome
;
;************************************************
palindrome_check:
        enter   0,0
        push    ECX
        push    EDI
        push    ESI
        push    DS
        push    ES
        les     EDI, [strip_input]
        mov     EDX, 80
        lds     ESI, [final_input]
        cld
        repe    cmpsb
        je      same
        xor     EAX, EAX

        same:
            mov EAX, 1

        leave
        ret

C-prompt刚崩溃

所以现在我把这个问题减少了一些,不确定这是怎么回事,但是EBX正在增加2?

string_reverse:
        enter   0,0
        xor     EBX, EBX
        xor     EAX, EAX
        xor     ECX, ECX
        push    00h

        checknull:
            mov     AL, byte [strip_input+EBX]
            PutLInt EBX
            inc     EBX
            PutCh   AL
            cmp     AL, 00h
            jne     pushtostack
            ret

        pushtostack:
            push    AX
            PutLInt EBX
            ;inc     EBX
            call    checknull

        reverse:
            pop     AX
            cmp     AL, 00h
            je      end
            mov     byte [final_input+ECX],AL
            inc     ECX 
            jmp     SHORT reverse

        end:



        leave
        ret

一旦完成strip_input的循环,它就会崩溃,我认为它涉及到ret的{​​{1}}

所以现在唯一的问题是比较2个字符串reverse:strip_input 我真的不知道怎么做才能有人帮助我?

0 个答案:

没有答案