2015-11-02 52 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