汇编语言字符串反转

时间:2014-04-20 22:58:06

标签: string assembly

对于输入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

1 个答案:

答案 0 :(得分: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,所以在第3次迭代之后cx达到0并且没有第4次迭代(jnz不会强制跳转,因为最后一次操作是在之前最后一次必要的迭代之前产生的)。我相信你不应该在循环开始之前减少cx。