当前课程知识点:微机原理与接口技术 > 第8周 汇编语言程序设计 > 第34讲 系统功能调用 > 系统功能调用_02
第一个子功能我们叫单字符的输入
单字符输入当然
它的输入是什么?
就是键盘 我们都是从键盘输入的
所以对于这个子功能来讲 它没有入口参数
入口就是键盘
这个键盘这个功能它的功能号是1号
这个1必须事先送给AH
因为它没有入口参数
所以你功能号写完了以后
然后INT 21H 这两行语句执行完
屏幕上就会出现一个光标在闪烁
就提示你可以敲一下键
你敲得哪一个键呢?
敲完了这个键
键盘的扫描码它会进去转换成ASCII码
存储在哪里呢?
存储在的地方就是这个子程序的出口参数
也就是说你敲了一下键
敲到哪里去了?
敲到AL里头了
这就是这个子程序固定的保证你的出口
也就是说你敲得这下键
它所对应的ASCII码在AL中
这就是它的出口参数
好 我们下边来看一个例
比如这几行指令
头上这两行红颜色的
就是刚才我们说单字符输入的
调用单字符输入这个子程序的这样一个指令
好 这两行指令执行完以后
屏幕上现在就开始有光标闪
这个光标闪以后它就提示你输入
因为这是只能单字符输入
所以你只能敲一下键
下面我们来看一下底下这几行指令
第一行指令
就第三行指令
这里是CMP AL和大写的Y
大写字母Y来比较
那么也就是说刚才我们说
这两行单字符输入
调用单字符输入这个子功能的程序完了以后
它的出口参数在AL里
也就是说你敲得这个键
的ASCII码在AL里
所以下边它就用AL值和Y去比
如果相等 转到YES
如果不相等 它再去跟N比
如果相等 就会转到NO
如果既不是Y 也不是N
那么会干什么呢?
它无条件的返回到GET KEY
也就是让你重新去敲一下键
所以这个是什么呢?
这个就是我们经常看到的那种
屏幕上会弹出一个对话框让你选择YES or NO
所以这个是汇编程序实现的一个
交互式的一个对话框
单字符输入很简单 因为只能敲一下键
所以它的出口在AL里没有问题
但是经常情况下更多的时候
我们会输入一串字符
所以这种时候
我们不可能把输入的字符都放在寄存器里
而必须放在内存里
那么下边我们就来学第二个功能
就是字符串输入的一个功能
这个功能
可以用来接收键盘上输入的一串字符
而输入的这一串字符又必须放在内存里
放在内存的这个
就接收你输入字符的内存区域
我们称为字符输入缓冲区
因为字符串输入的这个子功能
是别人设计的 不是我们设计的
比如人家到底是怎么设计的我们也不知道
但是人家有一个非常明确的要求
就是这个字符输入缓冲区
必须要有一种固定的格式
所以调用这样的子功能的时候
请大家一定要注意这个
输入缓冲区它的一个格式
这个格式是这样 它由三个部分来组成
首先它要有一个字节
这一个字节里头放的是什么呢?
也就是这个N1是什么意思?
是你需要定义的字符输入缓冲区的大小
也就是说你准备输入100个字符
那么你就是需要定义100个单元 至少是这样
那么这个N1就等于100
那么这是第二个单元里头
它还要让你留出一个单元
这个单元里是你实际键入的字符个数
比如你现在希望输入几十个字符
那么你就定义了100个字符的存储空间
那么结果你敲了一下"HELLO"你就不想敲了
也就是说"HELLO"只有几个字符呢?
H E L L O 这只有5个字符
所以你实际敲得键实际上只有5个
那么这个实际的键入的个数
是系统自动去数的 根据你敲了几下键
它在N2这个位置上就填上几
那么从这到这里
是可以让你实际输入字符的存放处
比如你定义了10个字符空间
但是你最多只能敲9个字符
为什么 因为你敲完了之后我们必定要回车
而回车也是一个ASCII码
它一定要占用一个字节单元
所以这个整个才是你的缓冲区的大小
因此 这里的N1
一定要等于这个缓冲区的大小
也就是说缓冲区要定义10个字符
那么你这个N1就要等于10
缓冲区等于100个字符 N1就等于100
因为这个N1必须是字节
所以这个缓冲区最大只能是255
字符输入
字符串输入这个功能号是10号功能
缓冲区的定义格式
必须按照刚才我们那样的格式来定义
所以它的使用它的方法就是这样
首先 我们把10号功能10送进AL里
然后这个缓冲区
它要求你必须定义在数据段
缓冲区的首地址必须送给DX
这个请大家注意
DX不是我们第三章学的间指寄存器之一
我们在上一讲讲
在上一章里讲指令系统的时候
我们曾经讲到寄存器间接寻址里头
能够放进方括号里作为间指寄存器表示
操作数偏移地址的寄存器
也就是叫间指寄存器 只有四个
DX DP SI DI
没有这个DX
但是在这个功能号里头
它要求你这个缓冲区必须定义在数据段
而且这个偏移地址必须送给DX
这个没有办法 这是别人规定的
然后 我们INT 21H
我们也做一个简单的练习来说明
比如我们定义了这样一个字符串的
在数据段里定义了这样一个字符输入缓冲区
大家看这个缓冲区的格式
就是我们刚才说到的那三个部分
第一个部分是我准备定义的缓冲区的大小
就是20 现在是20
第二个我们可以用一个问号
你也可以写成0
你其实写成任何数字都不要紧
但是一定要把这个位置留下来
留下来干什么?
留给系统来数你敲了几下键
你敲了5 这里面就是5
你敲了6 就是6
请注意这个敲得几下键里头不包含
回车键
也就是说 比如你敲1 2 3 4 5
然后回车
那么问号这个地方会是5
会变成5 而不包括那个回车
那么第三部分就是你真正
输入的字符串所存放的地方
现在这个地方
必须要和前面你所希望定义的那个大小要一致
你希望它定义20
所以后边就是20个字节单元
用DUP这样的重复操作符来定义
这就是字符输入缓冲区的格式
请大家务必注意
这个是我们调用操作系统内核
INT 21H这个功能包里10号功能
它所要求的字符输入缓冲区的格式
我们一般意义上的缓冲区不需要这样的格式
在数据段里定义了一个这样的字符输入缓冲区之后
我们在代码段里就可以用这样三行语句
来接收字符串了
比如现在这三行语句第一行我们说
把这个缓冲区的首地址DAT1送给DX
第二行是功能号10送给AH
然后INT 21H
这三行指令执行完了以后
屏幕上也同样出现这样一个光标闪烁的界面
字符界面
这个时候你就可以在里面不仅敲一个字符了
你可以敲一串字符
当然你最多可以敲多少呢?
因为现在你定义的缓冲区的大小是20
所以你最多可以敲19个字符
然后是回车键
刚才我们定义的这样一个字符输入缓冲区
我们用内存这样一个图来看
就是这样的格式
第一个单元里将会是20所对应的
二进制或者十六进制的形式 就是14H
第二个单元里我这里给大家用了问号表示
当然实际上不可能显示成问号
就是一个随机值吧
等你开始敲键盘以后这个随机值马上就归零
根据你敲得这个个数 然后它填进去
然后只有在这个DX加2
也就是说从第三个单元开始
是你实际键入的字符所存放的地方
最后一个单元一定是回车符
所以刚才定义了20个字节单元的缓冲区的大小
现在你最多只能输入19个字符
这个就是字符输入
字符串输入的一个功能号
第三个我们来看一下单字符显示输出
我们刚才
单字符输入和字符串的输入我们都讲完了
那么像那两种输入
它整个调用的人家的子程序
它的入口参数 入口就是键盘
所以它没有一个明确的 没有一个入口了
没有入口参数的设置了
但是它的出口一定要有
对于单字符的输入它的
你敲了一下键出到哪里去了?
出到AL寄存器里
对于字符串的输入出到哪里去了?
出到你定义的那个字符输入缓冲区里了
但是字符的显示输出它的出口在哪里呢?
出口就是屏幕
所以它现在需要你设置入口
也就是说你要准备显示的东西放在哪里
然后它才会负责把你放到屏幕上去
那么对于单字符的显示输出
因为只显示一个字符
一个字符就是它对应的ASCII码
这个ASCII码就是8位的
所以它要求把你要显示的这个字符的ASCII码
送给DL寄存器
它的功能号是2号 然后INT 21H
这样子完了以后
你在DL里头的那个字符就会被显示在屏幕上了
比如我们执行这样子三行语句
我们功能号2送给AH
然后给DL里送了41H
这个41H是什么玩意呢?
是大写字母A的ASCII码
所以这三行指令执行完以后
屏幕上就会显示出一个大写字母A
这就是我们的第三个功能号
单字符的显示输出
可能你马上就会想到
你显示一个字符你可能还需要显示一串字符
所以我们下一个功能号就是
字符串的显示输出了
字符串显示输出的功能号是9
你写09H 写9都可以
就像刚才我们的字符串输入功能号是10
你写10 写0AH都没有问题
因为编译器都给你统统的翻译成二进制数了
字符串的显示输出同样的它的输出出口就是屏幕
所以它的入口就是字符
因为要显示输出的字符串在汇编程序里
要求你事先必须要定义好这个字符串
这个字符串的定义是这样
它要求你必须定义在数据段
而且这个首地址也必须由DX来标示
这个和字符串的输入是一样的
所以下边我们来说一下
就是怎么样来定义这个字符串
字符串的显示输出请大家要注意这么几点
首先我们回忆一下我们介绍的数据定义伪指令
我们定义的字符 字符串
必须用DB伪指令来定义
在汇编程序里头要求
字符串定义完了以后 后边需要加一个'$'
这个'$'是作为字符串结尾的一个标识
字符显示
字符串的显示输出
不能够接收那些不能显示的字符的ASCII码
所以你要想显示一定是要可显示的
如果你显示的字符串
希望能够有一些格式上的控制或者美观的话
那么会需要做一些简单的处理
请大家注意这种是我们操作系统最底层的东西
而且最是
刚才我们已经明确讲它是DOS
所以DOS的界面就是字符界面
不是我们今天WINDOWS的这种可视化的界面
所以我们今天在WINDOWS环境下
我们可以把我们的文本 文档处理的非常漂亮
我们要显示出来的东西都可以编辑的很好
这个实际上是借助了很多的工具软件
在字符界面下没有任何的工具软件
所以你希望把这些字符怎么处理
全部要靠这些你自己用语言去处理
好 下边我们先做一个最简单的介绍就是
怎么样能够实现你显示完了字符之后
光标不是在你最后一个字符的底下闪
而是会回车或者换行在你的下一行闪烁
我们用例子来说明
我们刚才说字符串的显示输出必须要
必须要事先定义你要显示的字符串
而且这个字符串又必须要定义在数据段里
所以下边我们假设现在这个DATA段就是数据段
在这里我们定义一个变量 名字叫MESS1
然后字符串定义必须用DB伪指令
然后定义了这样一个字符串
用双引号或者单引号括起来都是可以的
那么在这里我们
大家看我们准备要显示的这个字符串就是
'Input string:'
如果没有后面红颜色的这个0DH 0AH
可以 没有任何问题
就是'Input String:' 后面'$'
这就是一个完整的字符串的定义了
但是定义完了以后你接着如果执行这样
在代码段中执行这样三行指令
就是9号功能送给AH
然后MESS1的偏移地址送给DX
然后INT 21H这三行指令执行完了之后
屏幕上会显示的'Input String:'
就是如果没有红颜色的这个0D和0AH的话
光标就会在冒号底下闪烁
那么这句话的意思显然是提示你
接着可以再输入了
那么因为光标在冒号底下闪
所以你接着输入的会把冒号覆盖
而且会紧跟在这个String后边
就是那个'g'这个字母的后头
所以显然就有点不合适
那么0DH我们刚才已经看到
它是回车符的这个ASCII码
所以如果你有了回车符 有了0DH在后面的话
那么在执行这三行指令之后
这个光标就会在冒号的后边闪
那么这样子的话你可以接着
比如说写一个HELLO
那么这个HELLO看上去还比较协调
那么如果你希望输入的HELLO
在你这个'Input String:'的下一行来闪
那么这个时候你就要加上0AH
0AH是换行符的ASCII码
所以如果在你定义的这个字符串的后边
又定义了0DH和0AH的话
那么执行完下边这个三行指令
调用了字符串的显示输出功能号之后
屏幕上会是这样子的一种形式
也就是说光标会在下一行去闪烁
这是我们字符
单字符的输入和输出
以及字符串的输入和输出
这样四种基本功能子程序的介绍和它的使用
最后我们来介绍一个返回操作系统的功能号叫4CH
我们在这之前看到的所有程序
我们最后一行指令通常用的都是HLT
就是暂停执行的指令
实际上那条指令我们在正常程序运行的时候
我们通常不会用这条指令来结尾
因为这条指令结尾的话这个程序有可能会造成死机
它不能够正常的返回操作系统
而下边这个功能号会保证你的程序
无论有没有显示输出
就是说有没有在屏幕上有结果
它都一定能够正常的返回操作系统
这个功能号叫4CH
它的调用格式是这样
就是把4CH送给AH这是一样的
然后INT 21H
没有任何的参数 输入输出参数
因为它就是一种功能性的子程序
它就是保证程序执行完以后能够正常的返回系统
因此这两行指令在我们未来的程序设计中
都是要处于整个程序的最结尾处
也就是执行完这两行指令
你的程序就执行结束了
好 有关我们系统功能调用主要是
软中断 也就是类型码为21H的DOS软中断
子程序功能里边的5个子功能
我们就介绍完了
下边我们做个简单的小节
所有的DOS功能
DOS功能包 不管是它中断类型码为21H
还是20H 还是其他H
它都是通过中断指令来调用的
每一个功能 每一个类型码
对应着一个功能包
每一个功能包里都有若干个子功能
而对这些子功能的区分
都是通过功能号来区分的
所以要使用的时候不仅仅要
用INT指令后边要给出中断类型码
还必须要把功能号送给AH
请大家在使用的时候一定要注意每一个子功能
它对入口参数和出口参数的要求
因为这些子程序或者说整个的操作系统
微软公司都没有开源
所以我们不知道别人是怎么编的
但是实际的情况说明
我们现在学到的所有的子功能
它们的执行都会对AX寄存器产生影响
对AH寄存器的影响显而易见
因为你把功能号已经送给AH
但是在整个子程序的运行过程中
它们会对AX的值进行修正
所以 希望大家如果在调用这些子功能之前
AX的内容很重要的话
那么调用之前一定要通过
PUSH指令或者其他的方法
要把AX的内容保存了
然后你再去调用这些子功能
调用完了以后你自己再去把它恢复
好 有关系统功能调用我们就介绍到这里
-第1讲 关于本课程
--关于本课程
-第2讲 微型计算机系统
--微机系统_01
--微机系统_02
-第3讲 微型计算机一般工作过程
-第4讲 数制与编码
--计算机中的编码
-第5讲 计算机中数的表示与运算
--数的表示
--符号数的表示
--数的表示与运算
-第6讲 基本逻辑运算与逻辑电路
-第7讲 本周小结
--本周小结
-第1周 微型计算机基础概论--第一周单元测验
-第8讲 8088微处理器
-第9讲 8088 CPU主要引线及机构
-第2周 8088微处理器--第二周单元测验
-第10讲 实模式存储器寻址
-第11讲 8088系统总线
--8088系统总线
-第12讲 微处理器小结
--微处理器小结
-单元测验--作业
-第13讲 指令概述
--指令概述
-第14讲 寻址方式
--寻址方式
-第15讲 通用数据传送指令
-第16讲 地址传送指令
--地址传送指令
-第17讲 输入输出指令
--输入输出指令
-第4周 数据传送指令--第四周单元测验
-第18讲 算术运算指令
--加法运算指令
--减法指令
--乘除运算指令
-第19讲 逻辑运算指令
-第20讲 移位操作指令
--移位操作指令
-第5周 算术运算、逻辑运算与移位操作指令--第五周单元测验
-第21讲 关于串操作指令的说明
--串操作指令说明
-第22讲 串传送与串比较
--串传送与串比较
-第23讲 串扫描指令
--串扫描指令
-第24讲 串装入与串存储指令
-第六周单元测验--作业
-第25讲 程序控制指令说明
-第26讲 转移类指令
--无条件转移指令
--条件转移指令
-第27讲 循环控制指令
--循环控制指令
-第28讲 过程调用指令
--过程调用指令
-第29讲 中断指令
--中断指令
-第30讲 处理器控制指令
--处理器控制指令
-第31讲 指令系统小结
--指令系统小结
-第7周 程序与处理器控制--第七周单元测验
-第7周 程序与处理器控制--第七周作业
-第32讲 汇编语言源程序
-- 汇编语言源程序_01
-- 汇编语言源程序_02
-第33讲 伪指令
--数据定义伪指令
--其它伪指令
-第34讲 系统功能调用
-第35讲 汇编语言程序设计示例详解
--程序设计示例1
-第36讲 汇编语言程序设计小结
-第8周 汇编语言程序设计--第八周单元测验
-第8周 汇编语言程序设计--第八周作业
-第37讲 半导体存储器概述
--半导体存储器概述
-第38讲 内存单元编址
--存储单元编址
-第39讲 随机存取存储器RAM
-- RAM_01
--RAM_02
-第40讲 只读存储器ROM
--ROM_01
--ROM_02
-第九周单元测验--作业
-第41讲 半导体存储器扩展
--存储器扩展_2
-第42讲 半导体存储器小结
--半导体存储器小结
-第十周单元测验--作业
-第十周作业--作业
-第43讲 基本I/O接口
-第44讲 简单接口芯片
--简单接口芯片
-第45讲 基本输入输出方法
--基本I/O方法
-第46讲 简单I/O控制系统设计
-第47讲 中断技术
--中断技术1
--中断技术2
-第48讲 输入输出与中断技术小结
--本周小结
-第十一周单元测验--作业
-第49讲 可编程定时计数器
-第50讲 可编程并行接口
-第51讲 可编程接口小结
--本周小结_01
--本周小结_02
-第十二周单元测验
-第52讲 模拟量的输入输出
--模拟量的输入输出
-第53讲 D/A转换器
-第54讲 A/D转换器
-- A/D转换器_01
-第十三周单元测验--作业
-第55讲 I/O接口系统综合设计示例详解I
-第56讲 综合设计示例详解II
-第57讲 结束语
--结束语