在Assembly中反转输入字符串

时间:2017-11-02 09:33:29

标签: string assembly dos x86-16

我有这个汇编代码可以反转我输入的字符串。它只接受最多20个字符。我的问题是当我按Enter键查看输出时,在反向字符串的末尾有一个额外的字符 请帮助我理解为什么会发生这种情况以及如何在输出中删除它 我们只需要使用函数09H int 21h来显示字符串并且函数0Ah int 21h来输入字符串。我们正在使用TASM 非常感谢您的帮助。谢谢。

这是我的代码:

.model small
.stack 100h
.data 
    MSG DB "Input String(max 20 chars): ", 10, 13, "$"
    Sentence1 DB 21,?,21 dup("$")  
    str2 dw 21 dup("$")
.code
start:
    mov ax, @data
    mov ds, ax

    ;Getting the string input
        mov ah,09h
        lea dx, MSG
        int 21h

        lea si,Sentence1
        mov ah,0ah
        mov dx,si
        int 21h

    ;Reverse String    
        mov cl,Sentence1
        add cl,1
        add si,2
    loop1:
        inc si
        cmp byte ptr[si],"$"
        jne loop1

        dec si
        lea di,str2
    loop2:
        mov al,byte ptr[si]
        mov byte ptr[di],al
        dec si
        inc di
        loop loop2

        ;Printing the reverse string    
            mov ah,09h
            lea dx,str2
            int 21h    

        mov ah, 4ch
        int 21h
end start 

1 个答案:

答案 0 :(得分:2)

str2 dw 21 dup("$")

通常这将使用db指令。

mov cl,Sentence1
add cl,1

反转循环使用CX作为循环计数器,但您没有正确设置!
" Sentence1"的第二个字节输入结构,包含CX寄存器中所需的值。您不需要搜索任何终止字符。此外,如果你这样做,你宁愿寻找ASCII代码13(回车)而不是' $'。

mov cl, [si + 1]   ;Number of characters in the string
mov ch, 0          ;Make it a word because LOOP depends on CX (not just CL)

设置SI然后变为:

add si, 2          ;To the start of the string
add si, cx         ;To the position after the string
dec si             ;To the last character of the string

但更短:

add si, cx
inc si

如果用户没有输入任何文字,您将完全绕过逆转!这是jcxz在下一个代码中的用途:

 lea si, Sentence1
 mov ah, 0Ah
 mov dx, si
 int 21h

 ;Reverse String    
 mov cl, [si + 1]
 mov ch, 0
 add si, cx
 inc si
 lea di, str2

 jcxz EmptyString     ;By-pass the reversal entirely!

loop2:
 mov al, byte ptr[si]
 mov byte ptr[di], al
 dec si
 inc di
 loop loop2

EmptyString:
 ;Printing the reverse string (could be empty)
 mov ah, 09h
 lea dx, str2
 int 21h