帮忙写一个汇编程序,要求从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后
从键盘输入的一个字符串(以回车结束),并将字符串末尾加上结束标志’$’,然后输出该字符串。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? 展开
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? 展开
2个回答
展开全部
你的程序有两个错误
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
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询