打印程序集中字符串内每个字符的编号

时间:2016-03-07 13:07:04

标签: assembly x86 dos

嘿伙计们我正在尝试学习汇编,我现在正在解决这个问题,所以我试图获取字符串中每个字符的数字。

例如,如果我输入“hi”,它应该输出: A0 B0 .. H1 I1 .. Z0

但我会得到随机字符,我会给予任何帮助。

 data segment
            msg1 db 10,13,': $'
            msg3 db 10,13,' $'
            msg4 db 10,13,'no, character found in the given string $'
            msg5 db ' character(s) found in the given string $'
            char db 97
            count db 0
            p1 label byte
            m1 db 0ffh
            l1 db ?
            auxsi db 0
            p11 db 0ffh dup ('$')
        data ends
        display macro msg
            mov ah,9
            lea dx,msg
            int 21h
        endm
        code segment
            assume cs:code,ds:data
        start:
                mov ax,data
                mov ds,ax

                display msg1

                lea dx,p1
                mov ah,0ah
                int 21h



                lea si,p11


                mov cl,l1
            mov ch,0

    check:
            mov al,[si]
            cmp char,al
            jne skip
            inc count
    skip:
            inc si
            loop check

            cmp count,0
            je notfound



            display msg3

            mov ah,02h
            mov dl,char
            int 21h


            mov dl,count
            add dl,30h
            mov ah,2
            int 21h

            inc char
            mov count,0

            cmp char,123
            jne check

            jmp exit
    notfound:
            display msg4

    exit:   mov ah,4ch
            int 21h
    code ends
    end 

start

1 个答案:

答案 0 :(得分:0)

对于初学者来说,它永远不会打印零,因为您已明确检查代码中没有这样做。这甚至是你自己的代码吗?此外,非常检查将在第一个不存在的字符处停止,因此如果您的字符串不以a开头,它将立即停止。此外,在打印计数后,您将循环回check,但不会重新加载cxsi,因此它将在缓冲区后继续。最后,缓冲区中明显未使用的auxsi标签将使代码跳过输入的第一个字符。

学习使用调试器并对代码进行注释,尤其是在您希望其他人提供帮助的情况下。