初学汇编,要求输入一个字符串然后输出。请帮看看错在哪里
发布网友
发布时间:2022-05-04 11:59
我来回答
共1个回答
热心网友
时间:2022-06-21 15:49
lea dx,string
mov ah,0ah
int 21h
在调用中断往字符串输入字符的时候,string里数据的意义的这样的:
第一个字节表示一共可容纳的字符数,包括回车符,也就是10h
第二个字节表示,当输入结束,按下回车后,实际输入的字符数,不包括回车符。
从第三个字节开始,表示实际的字符。
但是当输出字符串的时候:
lea dx,string
mov ah,09h
int 21h
是从string开始输出,碰到'$'后停止。而你输入的字符,是从string+2开始存放的,并且是以回车符结束的,而不是以'$'结束的。所以你的程序主要有两个问题:
(1)输出时要把dx指向string+2,而不是之前的string
(2)输入结束后,要把最后一个有效字符后面的回车符修改为'$'
另外还有个问题。你输入字符的时候,最后输入了一个回车。在C语言里会自动换行,但是在汇编里是不会自动换行的。所以你在输入结束,输出之前,还要自己换行。
程序修改如下:
data segment
string db 10h,50 p('?')
strrn db 0ah, 0dh, '$' ;这个是专门用来换行的
data ends
code segment
assume ds:data,cs:code
begin: mov ax,data
mov ds,ax
lea dx,string
mov ah,0ah
int 21h
;下面三句的作用是换行
lea dx, strrn
mov ah, 09h
int 21h
;下面三句的作用是把输入的最后一个有效字符后的回车符修改为'$'
mov bl, string + 1 ;实际输入的字符数,不包括回车符
mov bh, 0
mov byte ptr [string + 2 + bx], '$' ;实际输入的有效字符从string+2开始,注意理解
mov ah,09h
lea dx, string + 2
int 21h
mov ah,4ch
int 21h
code ends
end begin