从键盘输入字符串并输出该字符串(汇编程序)_第1页
从键盘输入字符串并输出该字符串(汇编程序)_第2页
从键盘输入字符串并输出该字符串(汇编程序)_第3页
从键盘输入字符串并输出该字符串(汇编程序)_第4页
从键盘输入字符串并输出该字符串(汇编程序)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.从键盘输入字符串并输出该字符串(汇编程序) DATAS SEGMENTSTR DBplease input a string:$BUF DB 20 DB ? DB 20 DUP (?)CRLF DB 0AH,0DH,$;此处输入数据段代码DATAS ENDSSTACKS SEGMENT STACK DB 200 DUP(?) ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,1

2、0 LEA DX,BUF INT 21H LEA DX,CRLF MOV AH,9 INT 21H MOV CL,BUF+1 LEA SI,BUF+2NEXT: MOV DL,SI MOV AH,2 INT 21H INC SI DEC CL JNZ NEXT;此处输入代码段代码 MOV AH,4CH INT 21HCODES ENDS END START 以上是从键盘输入字符串并输出该字符串的简单汇编程序,我们老师的要求是将程序中的2号调用改成9号调用,本人还在思考中,有能解决此问题的请回复,谢谢! 如果我了解了该题答案,一定和大家共享。续一: 我们汇编老师的教学是先让我们看程序,写程序,再

3、讲基本指令,基本结构 学习汇编重要的是掌握CPU结构、程序结构以及熟练的掌握7种指令的运用。 以下是本人整理的对上面程序的部分解释: BUF:键盘缓冲区BUF。 DB:定义变量的类型为字节类型。DB 20:表示缓冲区能容纳20个字符。 DB 200 DUP(?)中的问号:不对分配的存储单元初始化。 DS:存放当前数据段的段地址。 CS:存放当前代码段的段地址。SS:存放当前堆栈段的段地址。 MOV:传送指令。 AX:存放接收到的数据或发送数据。 DX:使用间接寻址时存放端口地址。 LEA:取偏移地址。 CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。 SI:在存储器寻址时,作为

4、变址寄存器。在串操作中,作为源串指针。 DEC:decrement。 INC:increment。INT:interruput。续二:DATAS SEGMENTSTR DBplease input a string:$BUF DB 20 ;这里的20为指定存放字符的个数(理论上的) DB ? ;这的?可变,实际存放字符的个数(系统自动计算) DB 20 DUP (?) ;这里的20是你在数据段开辟的空间CRLF DB 0AH,0DH,$;回车换行;此处输入数据段代码DATAS ENDSSTACKS SEGMENT STACK DB 200 DUP(?) ;此处输入堆栈段代码STACKS END

5、SCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA DX,STR ;9号中断前提,给参数DX赋值,指定输出字符串所在的有效地址 MOV AH,9 INT 21H MOV AH,10 ;10号中断,接收输入字符串,此时DX为存放字符串的有效地址 LEA DX,BUF INT 21H LEA DX,CRLF MOV AH,9 INT 21H MOV CL,BUF+1 ;获取字符串中字符的个数 LEA SI,BUF+2 ;间接寻址NEXT: MOV DL,SI MOV AH,2 ;2号中

6、断输出单个字符 INT 21H INC SI ;输出一个地址往后加1 DEC CL ;顺便减少输出的次数 JNZ NEXT ;此处输入代码段代码 MOV AH,4CH INT 21HCODES ENDS END START续三: 2号调用是逐个显示字符,9号调用是一次完成字符串的显示,但结尾得加上$。最上面程序中用的2号调用,使用循环输出字符串。要将2号调用改为9号调用,必须改程序中的循环结构为顺序结构。很明显,程序中的NEXT:INC SIDEC CLJNZ NEXT都要去掉。所以问题简化为改MOV DL,SIMOV AH,2部分为9号调用,以及在9号调用后加上$。续last:以下是在编程爱

7、好者论坛上请教别人加上自己的整理得出的答案,并非最简。DATAS SEGMENTSTR DB please input a string:$BUF DB 20 DB ? DB 20 DUP (?)CRLF DB 0AH,0DH,$;此处输入数据段代码DATAS ENDSSTACKS SEGMENT STACK DB 200 DUP(?) ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV

8、 AH,10 LEA DX,BUF INT 21H LEA DX,CRLF MOV AH,9 INT 21H ;开始改的部分 mov bl,BUF+1 ;输出这里开始 mov bh,0 ; lea si,BUF+2 ;首地址 mov byte ptrsi+bx,$;结尾得加上 $ mov DX,si ; MOV AH,9 ; INT 21H ;结束 MOV AH,4CH INT 21HCODES ENDSEND START我和同学交流之后发现,程序中mov byte ptrsi+bx,$可以改为mov si+bx,$ ,mov bh,0也可以去掉,这样就得出最简答案了。终结:DATAS SEG

9、MENTSTR DB Please input a string:$BUF DB 20 DB ? DB 20 DUP(24H)CRLF DB 0AH,0DH,$ DATAS ENDSSTACKS SEGMENT DB 200 DUP(?)STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,10 LEA DX,BUF INT 21H LEA DX,CRLF MOV AH,9 INT 21H LEA DX

10、,BUF+2 MOV AH,9 INT 21H MOV AH,4CH INT 21HCODES ENDS END START现在已经真正理解DOS10号以及9号功能调用了,今天再次看这个题目又得到一个答案:DATAS SEGMENTSTR DB Please input a string:$BUF DB 20 DB ? DB 20 DUP(?)CRLF DB 0AH,0DH,$ DATAS ENDSSTACKS SEGMENT DB 200 DUP(?)STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX LEA DX,STR MOV AH,9 INT 21H MOV AH,10 LEA DX,BUF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论