2015-11-02 16 views
2

以下汇编代码应该反转输入字符串,但不是,它只是输出字符串数据。在组件中反转输入字符串

.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 
+0

你在几个地方使用'di',但是我没有看到你将任何东西初始化为“di”。 – Michael

回答

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