2014-04-20 81 views
0

對於輸入abcd,輸出是dcbc,但它實際上應該是dcba。 因此而不是a它正在打印c彙編語言字符串反轉

這可能是愚蠢的。抱歉。但是我在這方面浪費了幾個小時。

這是我的代碼:

 .model small 
     .stack 100h 
     .data 
     msg1 db 10,13,"enter the string:","$" 
    maxlen db 100 
    act_len db 0 
    act_data db 100 dup('$') 
    Newline db 13,10,"$" 
    msg2 db 10 dup('$') 

    .code 
start: 
    mov ax,@data 
    mov ds,ax 

    lea dx, msg1 
    mov ah,09h 
    int 21h 

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

    mov cl,act_len 
    mov ch,0 
    lea si,act_data 
    add si,cx 
    dec si 
    dec cx 
    lea di,msg2 
rev: 
    mov ax,[si] 
    mov [di],ax 
    inc di 
    dec si 
    dec cx 

    jnz rev 

    mov ah,09h 
    lea dx,Newline 
    int 21h 

    mov ah,09h 
    lea dx,msg2 
    int 21h 


    mov ah,4ch 
    int 21h 

    end start 

回答

2

不可能的,我此刻的編譯,但可能犯了一個:

msg2 db 10 dup('$') 
.... 

lea di,msg2 
rev: 
    mov ax,[si] 
    mov [di],ax 
    inc di 
    dec si 
    dec cx 

您聲明MSG2是字節的行(或數組的字節),但是你用16位的ax加載它,所以你用字加載準備好的字節,可能會覆蓋。爲此,最好使用al,ah或其他8位寄存器。

更重要的是,我不知道你是否會第一個字符實際上是複製,因爲這樣的:

lea si,act_data 
add si,cx 
dec si 
dec cx 

您在開始遞減CX,所以第三次迭代CX達到0後沒有第四次迭代(jnz不會強制跳轉,因爲在之前的最後一次必要的迭代之前的最後一次操作產生了0 )。我相信你不應該在循環開始之前遞減cx。