初学汇编中输出字符串遇到的困惑

weixin_40309095 2017-10-29 05:40:37
问题简化后如下:
假如我想实现这样一个功能:我输入一串字符串,将它保存在内存空间里。输出的时候我先输出一个自定义的换行指令(DB 13,10,’$’),我再输出自己的字符串。
假如我定义最大输入字符数为5,则比如我输入5个字符:abcde时,能够成功输出这5个字符abcde。
但是如果我只输入了1个字符a,那么我输出并不能显示a。
如果我输入3个字符abc,那么输出为 空格bc ,即不能显示完全abc


汇编程序如下:

DATAS SEGMENT
;此处输入数据段代码
BUF DB 6
DB ?
SAVOR DB 5 dup(0)
DB '$'
SHIFTLINE DB 13,10,'$'
DATAS ENDS

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

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,BUF;输入最多5个字符的字符串
MOV AH,0AH
INT 21H
LEA DX,SHIFTLINE;输出一行换行
MOV AH,9
INT 21H
LEA DX,SAVOR;输出实际输入的字符
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
...全文
603 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Intel0011 2017-10-30
  • 打赏
  • 举报
回复
MOV AH,0AH INT 21H 确实是输入一个字符串的指令,可是需要注意的是,使用这个指令的时候需要设置一些东西,否则的话,使用的时候会出错。 在这儿解释一下INT 21H里的0Ah功能:输入一个字符串到DS:DX,第一个字节是buffer的大小,第二个字节是实际需要读的字符串的字符个数。 而且这个指令不需要在字符串最后加'$',要使用INT 21H/AH=9号功能打印的话,你必须要在字符串的最后加上'$',而且打印的起始地址为DS:DX+2.

DATAS SEGMENT
   ;此处输入数据段代码  
   BUF       DB 6
             DB ?
   SAVOR     DB 5 dup(0)
             DB '$'
   SHIFTLINE DB 13,10,'$'
DATAS ENDS

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

CODES SEGMENT
   ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
   MOV AX,DATAS
   MOV DS,AX
   
   ;此处输入代码段代码
   LEA DX,BUF;输入最多5个字符的字符串
   MOV AH,0AH
   INT 21H
   
   ;新添加的代码
   XOR BX, BX
   MOV BL, BUF[1]
   MOV BUF[BX+2],'$'
   
   LEA DX,SHIFTLINE;输出一行换行
   MOV AH,9
   INT 21H
   
   LEA DX,SAVOR;输出实际输入的字符
   MOV AH,9
   INT 21H
   
   MOV AH,4CH
   INT 21H
CODES ENDS

END START

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧