利用DOS功能调用9、10实现从键盘输入一串字符 “abcde”,然后输出3次。注:字符串长度不超过5个字符

结果是输入:abcde↙
输出:abcde
abcde
abcde
提示:

DATA SEGMENT
MAX DB 10
ACT DB 0
STR DB 10 DUP(‘$’)
DATA ENDS

  ;利用DOS功能调用9、10实现从键盘输入一串字符 “abcde”,然后输出3次。注:字符串长度不超过5个字符
  assume cs:code, ds:data
  data segment
  INPUT DB 0Ah,0DH,"Please Input a string:$"
  CRLF DB 0AH,0DH,'$'
  BUF db 5 ;字符串长度不超过5个字符,所以这里是5
  db ?
  db 5 dup (?) ;字符串长度不超过5个字符,所以这里是5
  NUM db 3 ;然后输出3次,所以这里是3
data ends

  stack segment
  db 16 dup (?)
stack ends

  code segment
  start: mov ax,data
  mov ds,ax
  mov ax,stack
  mov ss,ax
mov sp,10H

  ;显示提示字符串Please input a string:
  lea dx,INPUT
  mov ah,9
int 21h

  ;接受用户输入的字符串
  lea dx,BUF
  mov ah,10
int 21h

  ;输出回车空行
  lea dx,CRLF
  mov ah,9
int 21h

  ;cx清0
  xor cx,cx
  ;NUM = 3,所以cl = 3,输出3次字符串
  mov cl,NUM
  next: push cx

  ;获取用户输入的字符串的字符个数
  mov cl,BUF+1
  ;获取存放用户输入的字符串的偏移地址
  lea si,BUF+2
  next1:
  ;获取字符,然后输出
  mov dl,[si]
  mov ah,2
  int 21h
  inc si
  loop next1

  lea dx,CRLF
  mov ah,9
  int 21h
  pop cx
loop next

  mov ax,4c00h
  int 21h
  code ends
end start

PS:若有不明白的地方,可以追问追问

好复杂啊,有没有别的简单点的方法?有一个提示如下:
DATA SEGMENT
MAX DB 10
ACT DB 0
STR DB 10 DUP(‘$’)
DATA ENDS

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-21
assume cs:code, ds:data
DATA SEGMENT
MAX DB 10
ACT DB 0
STR DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
LEA DX, MAX
MOV AH, 10
INT 21H
MOV MAX, 10
MOV ACT, 13
LEA DX, MAX
MOV AH, 9
INT 21H
INT 21H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START

从键盘输入一串字符 “abcde”,然后输出3次。
注:字符串长度不超过10个字符。

输入:
abcde↙
输出:
abcde
abcde
abcde

不会有比本程序更简单的了。本回答被提问者和网友采纳
第2个回答  2012-11-21
把code段这样改,稍微简洁点。
 code segment
  start: mov ax,data
  mov ds,ax
  mov ax,stack
  mov ss,ax
mov sp,10H

  ;接受用户输入的字符串
  lea dx,STR
  mov ah,10
int 21h

  mov cx,3

next:
  ;输出

  lea dx,STR
  mov ah,9
int 21h
loop next

  mov ax,4c00h
  int 21h
  code ends

通过dos输入的是字符还是数字
利用DOS功能调用,用汇编语言编程实现从键盘输入一串字符存至内存,请参考如下程序(输入字符数最多200字符,用回车符表示输入结束):data segment str db 200 dup (0)data ends code segment assume cs:code,ds:data main proc far start:mov ax,data mov ds,ax lea si,str inpstr: mov ah,06...

从键盘输入一个字符串在下一行逆序输出用汇编语言如何实现
;可以这样考虑:;1.利用dos 21h中断的A号功能,读取一个字符串,这样可以取得字符串的长度N。;2.mov cx,N,利用Loop指令,倒序输出字符串。;代码如下:; multi-segment executable file template.data segment buf0 db 255 ;字符串最大长度 db 0 ;输入的字符串的实际长度 buf1 db 2...

DEBUG命令谁知道多少?
功能: 以内存映象方式显示内存中的信息。说明: 转储用左右两部分显示内存映象内容,左边以十六进制,右边以ASCII字符显示,所有不可打印字符用句号(。)表示。每行显示16个字节的内容,在第八和第九个字节之间有一个连字符 - 此命令隐含的段地址为DS的值。若未指定起始地址,则D命令从显示的最后一个单...

常用的电脑操作小技巧
14、 利用fc和>来分析注册表 例如,我们能在安装软件前份一次注册表(如:c:first.reg),安装后再导出注册表文件(c:second.red)然后再在MS-DOS方式(纯DOS方式也行)下执行下列命令: c:>fc first,reg second.reg>fc.txt (回车) 再打开fc,txt文件,即可查看该软件对注册表添加了哪些子项了。 注:重定向输入的...

操作系统有哪些功能?
若从键盘输入:abc def,则输出结果是:()。A) def def B) abc defC) abc d D) d d(50) 以下程序中函数f的功能是将n个字符串按由大到小的顺序进行排序。#include void f(char p[][10],int n){ char t[20]; int i,j;for(i=0;ifor(j=i+1;jif(strcmp(p[i],p[j])<0) { strcpy(t...

关于strlen
include <stdio.h> main(){ char a[5]="abcde";char b[5]="abcde";int alen,i;alen=strlen(a);printf("%d\\n",alen);\/\/a的字符串长度 for(i=0;i<alen;i++)printf("%c\\n",*(a+i));\/\/a的每个字符元素 printf("%d\\n\\n",a);\/\/a的首地址 alen=strlen(b);printf("%d\\n...

pascal函数过程表
DOS参数串长度PARAMSTR(N)FDOS参数串PIF圆周率的值pos(str1,str2)f测一个字符串中包含的另一个子串的开始位置pred(x)f求前驱ptr(i)f指针赋值randomf返回0~1之间的随机实数randomizep初始化随机数发生器read\/readln(f,x)p读入\/输入数据rename(f,str)p给一个外部文件改名reset(f)p打开文件,并将文件指针...

解释下面一个汇编程序每一行代码的意思功能.
另一个就是我们常规意义上的参数,如上面的9号调用需要的参数是 字符串的地址,对于中断来说,不同的中断调用,他所需要的参数类型以及参数所要放置的寄存器是不同的,这往往需要记忆,MOV AH,4CH INT 21H ;这两句是调用21H中断的4C功能。返回DOS操作系统!!CODES ENDS ;代码段结束 END START ;...

在C语言中“%c%c\\n”和“%d%d\\n“分别说明什么。。。??
c%c\\n和%d%d\\n出现在输出语句中具有如下意义:c%c\\n表示输出两个字符数据,%d%d\\n表示输出两个十进制整型数据。并且输出的数据是紧挨着的,如果想分开点,可以增加宽度,比如"%5d"就是按照5的宽度输出一个整型数据,或者在两个格式符中间加上空格,逗号,等其他字符也可以,比如"%d,%d"。

getchar和getch,getche接收键盘回车键的效果不一样
我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。例子中...

相似回答