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