汇编源程序——字符串输入输出ppt课件_第1页
汇编源程序——字符串输入输出ppt课件_第2页
汇编源程序——字符串输入输出ppt课件_第3页
汇编源程序——字符串输入输出ppt课件_第4页
汇编源程序——字符串输入输出ppt课件_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、5.3 字符串输入输出方法 5.3.1 字符串输出 【入口参数】AH 9,是DOS的子功能号 DS:DX 待输出字符串的首字符的逻辑地址 【说明】 (1)被输出的字符串的长度不限,但必须连续存放在内存的某个地方,且以ASCII值为24H的字符$结束,中间可以含有回车符、换行符、响铃符等特殊功能符号,存放字符串的起始逻辑地址必须放在指定的寄存器DS和DX中。,1,(2)$符本身不输出到屏幕。 (3) 调用结果是把字符串中的各个字符从光标当前所在位置起,依次显示在屏幕上,直至遇到$为止,光标停在最后一个输出符号的后面。 (4)如果程序中需要输出$,只能用2号子功能实现。 (5)9号子功能调用将影响

2、AL的内容,不改变其余寄存器及标志寄存器的值。,2,【例5.5】分析下面的程序,写出程序执行后的结果。 data SEGMENT buf1 DB Hello, ,13,10, this is an example.$ ,13,10 buf2 DB - END -$ data ENDS code SEGMENT ASSUME CS:code,DS:data main:MOV AX,data MOV DS,AX,3,LEA DX,buf1 MOV AH,9 INT 21H MOV DX,OFFSET buf2 INT 21H MOV AX,4C00H INT 21H code ENDS END m

3、ain 【解】执行结果如下: Hello, this is an example.- END -,4,分析一下例5.5的程序: (1)程序包括两个段,data段中只有变量定义,是数据段,code段中是指令序列,是代码段。 (2)ASSUME伪指令只用来说明code段中定义的各标识符(实际只有标号main)以CS为缺省段寄存器,data段中的各标识符(两个变量)以DS为缺省段寄存器。ASSUME伪指令本身并没有对CS和DS赋值的功能,所以代码段的最前面两条指令就是用来对DS赋值,因为后面的字符串输出要求把输出串的段地址放到DS中。,5,(3)程序中没有类似的指令对CS赋值。这是因为操作系统DOS

4、把该程序调进内存后,会把机器的控制权交给该程序,这是通过修改CS和IP的值的方法实现的。也就是说,DOS在移交控制权时就已经把CS和IP都放好了正确的值,而不需要用户程序进行处理。 (4)程序中的第1次INT 21H调用前,用LEA指令把变量buf1的偏移地址取到寄存器 DX中,用MOV指令把AH赋值为子功能号9,而在此之前DS已被赋值为buf1所在的data 段的段地址。 (5)变量buf1中的第1个字符是字母H,9号子功能从该字母开始,逐个显示后续字符,遇到13和10分别进行回车换行处理,直到遇到$符为止,$本身并不出现在屏幕上,此时的输出情况是:,6,Hello, this is an

5、example. 并且光标停在了第2行输出的最后一个符号.的后面。虽然buf1的定义中在$后面还有内容,这些内容都不会被输出。 (6)由于9号子功能调用的结果并不改变除了AL以外的其它寄存器的值,故调用完后AH中仍然是9,所以第2次调用INT 21H时只对DX重新赋了值,取的是buf2的偏移地址,因而第2次INT 21H调用仍然是9号,从光标所在位置输出buf2的内容直到$,于是得到前面的输出结果。,7,【例5.6】对例5.5的程序稍做修改成为下面的情况,写出程序执行后的结果。 data SEGMENT buf1 DB Hello, ,13,10, this is an example. ,1

6、3,10 buf2 DB - END -$ data ENDS code SEGMENT ASSUME CS:code,DS:data main:MOV AX,data MOV DS,AX LEA DX,buf1 MOV AH,9,8,INT 21H MOV AX,4C00H INT 21H code ENDS END main 【解】执行结果如下: Hello, this is an example. - END -,9,5.3.2 字符串输入 【入口参数】AH 0AH,是DOS的子功能号10 DS:DX 输入缓冲区的起始逻辑地址 输入缓冲区有特定的要求,其内存图如图5.3所示。,len1,

7、len2,DS:DX,允许输入的最大字符数,实际输入的字符数,输入串的各个字符,图5.3 用DOS的10号子功能进行字符串输入的缓冲区要求,10,【出口参数】由DOS的10号子功能在输入缓冲区中填写实际输入情况,即根据键盘输入情况,对图5.3中的“实际输入字符数”和“输入串的各个字符”部分进行填写。 【说明】 (1)输入缓冲区是一段连续的内存区,首地址必须在调用10号子功能前放到指定的寄存器DS和DX中。 (2)10号子功能在调用时等待操作员从键盘上按键,直到按下回车键为止,按键情况会显示在屏幕上,最后按下的回车键会导致回车操作。如果在按回车键之前发现输入有错误,可以使用退格键或向左的箭头进行

8、修改。,11,(3)输入缓冲区的最前面一个字节(图5.3中len1处)的值由用户程序填写,用以指出允许输入的最大字符数。该值是字节型无符号数,有效范围是0255,最后按的回车键也计算在内。当已输入len11个字符后就只能按回车键了,按其它键都会被认为是不正确的输入而不被机器认可,并且喇叭还会发出“嘀”的一声响以示警告。如果len1=1,表示只能按1个键,这个键只能是回车键,按其它键都会有“嘀”的一声警告;如果len1=0,表示一个键都不能按,包括回车键在内的任何按键都会被拒绝并且发出“嘀”的警告声,但机器又在等待输入,这一矛盾将导致无限期等待,即死机。,12,(4)输入缓冲区的次字节(图5.3

9、中len2处)是由DOS的10号子功能填写的。在调用前用户程序可把它设为任意值,用户程序填写的这个值对10号子功能调用没有任何影响。 (5)子功能调用完成后,输入的字符串以ASCII的形式从输入缓冲区的第3个字节起连续存放,最后一个字符是回车键(0DH)。第2个字节中放的是输入字符串的有效长度(最后的回车键不计算在内)。用户程序可以从缓冲区的第2字节起取得输入字符串的串长及各个字符。,13,【例5.7】设有数据段定义如下: d SEGMENT buf DB 10,11 DUP(0) d ENDS 画出数据段的内存图,然后执行下面的程序段, 设buf的缺省段寄存器为DS。 MOV AX,d MOV DS,AX MOV AH,10 LEA DX,buf INT 21H 假设执行时键盘上的输入情况是在按A1B2后按回车键,画出程序段执行后的数据段的内存图。,14,【解】见图5.4(a)和(b)。,0A 00 00 00 00 00 00,00,0000 0001 0002 0003

温馨提示

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

评论

0/150

提交评论