![](https://img-blog.csdnimg.cn/52bee9ad7de5458ea8f9335a68a6ad8e.png)
![](https://img-blog.csdnimg.cn/cbe211306fed4a3cbe07bb1c02f858fb.png)
![](https://img-blog.csdnimg.cn/3fe8a96bbaeb424e9e47811d6d3e89ee.png)
①首先,我们要保存寄存器的内容,因为程序查询方式要完成内存和外部设备之间的数据输入输出,需要借助CPU当中的某一个寄存器对数据进行暂存。如果这个寄存器当中的数据是有用的,那我们要对这个寄存器当中的数据进行保存。你可以把它写入到某一个内存单元当中,把它压入到堆栈当中,或者是把它放到CPU当中的其他的闲置的寄存器当中保存。
②保存这个内容之后我们要设置计数器的值。设置计数器的值的目的是为了控制我们传输的数据量,这次内存和I/O之间进行数据传输,到底传输多大量的数据。计数值的设置有两种方式。
----第一种方式,如果我们要传输N个字,计数器的值我就把它设成N。每完成一个字的传输,计数器的值就减一,直到减到0为止就完成了这个数据的传输。
----另外一种设置方法是我们把这个计数器的值给它设成-N。并且这个负数我们用补码来表示,关于补码我们在第六章当中会进行介绍。每传输一个字,我们给计数器的值加1,直到计数器发生溢出,计数器当中的值变成零数据传输才会结束。
③设置了计数值之后,为了完成内存和io之间数据传输,我们要知道内存的这个块儿它的起始地址是什么。所以我们要设置主存缓冲区的地址。我们保存数据或者是读取数据就从这个缓冲区的起始地址或者首地址开始。
④这两个设置完我们就可以启动外部设备,让外部设备进行准备和进行数据传输。
⑤启动设备以后,因为我们是程序查询方式,CPU开始查询I/O接口的状态或者是设备的状态,看是否准备好。如果没准备好,CPU就通过这种原地踏步的方式反复的进行查询,一直到状态标志表明数据已经准备好了这个查询操作才会停止。
⑥开始进行数据传输,传送一个字。
⑦这个字传送完以后,我们前面设置的一些初始值要进行修改,比如说内存的地址。我们需要修改,加1或者减1,为输入或者输出下一个数据做准备。
⑧同时,为了表明我们还有多少数据需要进行传输,计数器的值也要进行修改,把它加1或者是减1。这个要看你这个计数值在寄存器当中是如何进行设置的。
⑨然后判断这批数据是不是已经传输完了。如果没有传输完,CPU要再一次启动外设,循环进行这个过程直到数据传输完,我们就结束这个I/O传输。
![](https://img-blog.csdnimg.cn/d7e46fc58e5d4879b4d57f4ece01dd6d.png)
![](https://img-blog.csdnimg.cn/140213081f314de1b2535aba3663c83b.png)