2014-04-20 80 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。