LC-3指令集 字符的输入与输出
LC-3是一个简单的指令集,字符的输入输出,也比较简单,即通过中断的方式,键盘输入产生中断,有一些标志位,标志着键盘是否可用,显示器是否可用,下面介绍LC-3中的输入输出
4个寄存器
要想异步的执行输入输出指令,那就离不开约定,即约定的标志位为特定状态,执行特定操作,下面介绍LC-3中为了输入输出而准备的4个寄存器
值得注意的是,这些寄存器都是模拟寄存器,即用内存来代替的
下面给出这些模拟寄存器的地址及功能
字符的输入
字符的输入又分为两个部分,一部分是键盘的输入,另一部分是数据的读取
键盘输入
键盘输入数据较为简单,值得注意的是数据的阻塞,即之后的输入都无效
-
从键盘输入一个字符,系统触发中断 将输入的字符放到KBDR寄存器中,然后将KBSR寄存器最高位置1表示有新数据读进了,待取 将键盘禁用,阻塞之后所有字符的输入
数据读取
键盘数据的读取,其实就是读取KBDR寄存器,然后解除键盘的锁定,可以开始接收新数据,分为以下几个步骤:
-
检测KBSR最高位是否为1,即是否有输入待取 读取KBDR中的输入数据 将KBSR最高位置0,即重置标志位 使能键盘中断即KBSR的第14位置1,即解除键盘的锁定
基本输入程序
LOOP LDI R0 KBSR BRzp LOOP ; 轮询等待KBSR最高位置1表示可以读取 LDI R0 KBDR ; 从KBDR加载数据到R0 KBSR .FILL 0xFE00 KBDR .FILL 0xFE02
字符的输出
设备准备
如果显示器准备好输出一个字符,那么DSR寄存器最高位置1,表示:可以输出字符啦
输出数据
当显示器准备好输出了,即DSR寄存器最高位为1,这时候输出数据,系统操作(系统自动的操作)分为以下几个步骤:
-
系统将首先将DSR置0,因为现在要输出了,不是就绪状态 系统将DDR寄存器里保存的数据以ASCII码输出到屏幕 显示完成,将DSR重新置1,表示可以输出
值得注意的是,在DSR置0时,任何新写入DDR寄存器的字符将被忽略,因为现在显示器忙,不能输出
如果是程序操作,即操作DSR和DDR输出数据,那么程序要这么做
- 死循环等待DSR最高位被置1
- 死循环结束,将要写的数据ASCII码写入DDR
基本输出程序
LOOP LDI R0 DSR BRzp LOOP ; 轮询等待DSR最高位置1表示可以显示了 DSR .FILL 0xFE04 DDR .FILL 0xFE06
LC-3输入的读取思路
死循环一直轮询KBSR寄存器,如果高位为1(可以用BRzp判断),跳出死循环并且从KBDR读取字符,否则死循环等着