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

来源:互联网 发布:同福3队吊打棒子知乎 编辑:程序博客网 时间:2024/05/21 17:24

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

ASSUME CS:CODE,DS:DATADATA SEGMENTINPUT DB 50,0,50 DUP(0) ;INPUT只是一个标号, 50为最大允许输入字符数,0仅做占位,输入后将会填入实际输入字符数,后面再占上50个字节DATA ENDSCODE SEGMENTSTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INPUTMOV AH,10INT 21HMOV 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   ;将偏移地址送入DXINT 21H     ;中断显示输出MOV AX,4C00H    ;4号中断返回INT 21HCODE ENDSEND START

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

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

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

不妨对上述代码稍作补充

ASSUME CS:CODE,DS:DATADATA SEGMENTINPUT DB 50,0,50 DUP(0)STRING DB "YOUR INPUT IS:$"DATA ENDSCODE SEGMENTSTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INPUTMOV AH,10INT 21HMOV DI,OFFSET INPUT+1MOV BL,[DI]MOV AX,'$'MOV [BX+DI+1],AXMOV DX,OFFSET STRINGMOV AH,9INT 21HMOV DX,OFFSET INPUT+2INT 21HMOV AX,4C00HINT 21HCODE ENDSEND START

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

NEWLINE DB 13,10,'$'

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

整理后代码如下

ASSUME CS:CODE,DS:DATADATA SEGMENTNEWLINE DB 13,10,'$'INPUT DB 50,0,50 DUP(0)DATA ENDSCODE SEGMENTSTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INPUTMOV AH,10INT 21HMOV DI,OFFSET INPUT+1MOV BL,[DI]MOV AX,'$'MOV [BX+DI+1],AXMOV DX,OFFSET NEWLINEMOV AH,9INT 21HMOV DX,OFFSET INPUT+2INT 21HMOV AX,4C00HINT 21HCODE ENDSEND START

运行效果如下

这里写图片描述

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

MOV DI,OFFSET INPUT+1MOV BL,[DI]MOV AX,'$'MOV [BX+DI+1],AX
原创粉丝点击