汇编输出字符串显示问题学习笔记

首先是一开始的代码,目的是将从键盘输入的字符串进行输出

ASSUME CS:CODE,DS:DATA

DATA SEGMENT
INPUT DB 50,0,50 DUP(0) ;INPUT只是一个标号, 50为最大允许输入字符数,0仅做占位,输入后将会填入实际输入字符数,后面再占上50个字节
DATA ENDS

CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET INPUT
MOV AH,10
INT 21H

MOV DI,OFFSET INPUT+1 ;取得实际输入字符数所在的偏移地址
MOV BL,[DI] ;取得实际输入字符数,注意用BL,若用BX,则会取得一个字(两个字节)
MOV AX,'$'	;不能直接将'$'写入内存,要借助寄存器
MOV [BX+DI+1],AX    ;加入结束符

MOV AH,9    ;调用9号中断,将输出DS:DX为首地址,到'$'为止的字符串
MOV DX,OFFSET INPUT+2   ;将偏移地址送入DX
INT 21H     ;中断显示输出

MOV AX,4C00H    ;4号中断返回
INT 21H

CODE ENDS
END START

看起来这段代码好像没有什么问题,
但实测效果如下
这里写图片描述

看起来好像并没有输出,再进入debug模式调试一番,看看原因
这里写图片描述
字符串明显已经读入内存

这里写图片描述
上图显示输出也没问题,那是什么原因的

不妨对上述代码稍作补充

ASSUME CS:CODE,DS:DATA

DATA SEGMENT
INPUT DB 50,0,50 DUP(0)
STRING DB "YOUR INPUT IS:$"
DATA ENDS

CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET INPUT
MOV AH,10
INT 21H

MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX

MOV DX,OFFSET STRING
MOV AH,9
INT 21H

MOV DX,OFFSET INPUT+2
INT 21H

MOV AX,4C00H
INT 21H

CODE ENDS
END START

运行结果如下:
这里写图片描述
这里写图片描述
显然是输出把输入的字符覆盖了
即输出字符之前应先进行回车
那只需在数据段里加上如下代码

NEWLINE DB 13,10,'$'

每次输出前先输出回车和换行即可

整理后代码如下

ASSUME CS:CODE,DS:DATA

DATA SEGMENT
NEWLINE DB 13,10,'$'
INPUT DB 50,0,50 DUP(0)
DATA ENDS

CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX

MOV DX,OFFSET INPUT
MOV AH,10
INT 21H

MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX

MOV DX,OFFSET NEWLINE
MOV AH,9
INT 21H
MOV DX,OFFSET INPUT+2
INT 21H

MOV AX,4C00H
INT 21H
CODE ENDS
END START

运行效果如下

这里写图片描述

另外对于结束符的添加,此处做记录

MOV DI,OFFSET INPUT+1
MOV BL,[DI]
MOV AX,'$'
MOV [BX+DI+1],AX
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值