帮忙写一个汇编程序,要求从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后

从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后输出该字符串。DATASSEGMENTbufferdb80db0db80dup(0);此处输入... 从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后输出该字符串。

DATAS SEGMENT
buffer db 80
db 0
db 80 dup (0);此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
mov ah,0ah
mov dx,seg buffer
mov ds,dx
lea dx,buffer
int 21h
inc dx
mov si,dx
mov [si],'$'

mov ah,09h
mov dx,seg buffer
mov ds,dx
lea dx,buffer
int 21h

MOV AH,4CH
INT 21H

CODES ENDS
END START我这个哪里不对啊?为什么输出的第一个总是P?
展开
 我来答
baitang3671b
推荐于2017-12-16 · TA获得超过5040个赞
知道大有可为答主
回答量:4421
采纳率:31%
帮助的人:1129万
展开全部
你的程序有两个错误
1。调用mov ah,0ah int21h 后dx指向的是缓冲区的开始,不是结尾,因此你加$的位置应该是:缓冲区开始地址+2+输入字节数
2。显示时,dx应该指向字符串的开始,而不是缓冲区的开始,两者差两个字节。

调试好的程序如下:

DATAS SEGMENT
buffer db 80
db 0
db 80 dup (0);此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
mov ah,0ah
mov dx,seg buffer
mov ds,dx
lea dx,buffer
int 21h

inc dx
mov si,dx
mov cl,byte ptr [si] ;输入的字节数
mov ch,0
add si,2
add si,cx ;字符串结尾
mov byte ptr [si],'$'
push ds
pop es
mov di,offset buffer
mov ax,0a0dh ;回车换行
stosw ;把缓冲区的开始两个字节填充成回车换行,是为了让结果和输入分别在两行上显示
mov ah,09h
lea dx,buffer
int 21h

MOV AH,4CH
INT 21H

CODES ENDS
END START
pig05121
2010-11-17 · TA获得超过599个赞
知道小有建树答主
回答量:234
采纳率:50%
帮助的人:137万
展开全部
因为你输出的字符串是:80,?,?????
lea dx,buffer
int 21h
把它改为:
lea dx,buffer+2
int 21h
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式