反转程序集中的输入字符串

时间:2015-11-02 11:44:26

标签: assembly x86 dos

以下汇编代码应该反转输入字符串,但它不会,它只打印字符串数据。

.model small
.data
    str1 db 13,10,'-Enter String: $'
    str2 db 13,10,'-your reverse string: $'
    t db ? 
    str3 db 100 dup('$')
    str4 db 13,10,'-Your string: $'
.code
main proc
    s:
    mov ax,@data
    mov ds,ax
 ;get string   
    mov ah,9
    lea dx,str1
    int 21h

    mov ah,0ah
    lea dx ,str3
    int 21h
  ;get lenght  
    mov bl,str3+1
    add bl,30h
    mov ah,02h
    mov dl,bl
    int 21h
    mov [di],bl
;print entered string
    mov ah,9
    lea dx,str4
    int 21h

    mov ah,9
    lea dx,str3+2
    int 21h
;print reverse string 
    mov ah,9
    lea dx,str2
    int 21h

    mov cx,0   
    lea si,str3+ [di]
    dec si
    mov cl,[si]
    l1:
    mov ah,02h 
    mov dl,[si]
    dec si
    int 21h
    jne l1
main endp
end

1 个答案:

答案 0 :(得分:2)

str3 db 100 dup('$')

您没有为DOS输入功能设置数据结构。现在它似乎有效,因为字符 $ 的值为36.由于您将输入的长度显示为单个字符,我建议您写一下:

str3 db 9,0,10 dup('$')

当您获得长度并显示它时,您应该将长度存储在DI(而不是角色)

 ;get length  
 mov  bl, str3+1
 mov  dl, bl
 add  dl, 30h
 mov  ah, 02h
 int  21h
 mov  bh, 0
 mov  di, bx

因为您输入的文字从 str3 + 2 开始,您需要更改LEA。更好地使用DI作为循环计数器,它已经具有长度。

 lea  si, str3 + 2 + [di]
l1:
 dec  si
 mov  dl, [si]
 mov  ah, 02h 
 int  21h
 dec  di
 jne  l1