LC-3指令集 字符的输入与输出

LC-3是一个简单的指令集,字符的输入输出,也比较简单,即通过中断的方式,键盘输入产生中断,有一些标志位,标志着键盘是否可用,显示器是否可用,下面介绍LC-3中的输入输出

4个寄存器

要想异步的执行输入输出指令,那就离不开约定,即约定的标志位为特定状态,执行特定操作,下面介绍LC-3中为了输入输出而准备的4个寄存器

值得注意的是,这些寄存器都是模拟寄存器,即用内存来代替的

下面给出这些模拟寄存器的地址及功能

地址 映射的寄存器 解释 0xFE00 键盘状态寄存器KBSR 最高位为1表示从键盘接收到新字符 0xFE02 键盘数据寄存器KBDR 键盘输入数据ASCII码值存在其低八位 0xFE04 显示输出状态寄存器DSR 最高位为1表示可以向屏幕输出一个字符 0xFE06 显示输出数据寄存器DDR 向屏幕输出的字符的ASCII码存在其低八位

字符的输入

字符的输入又分为两个部分,一部分是键盘的输入,另一部分是数据的读取

键盘输入

键盘输入数据较为简单,值得注意的是数据的阻塞,即之后的输入都无效

    从键盘输入一个字符,系统触发中断 将输入的字符放到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输出数据,那么程序要这么做

  1. 死循环等待DSR最高位被置1
  2. 死循环结束,将要写的数据ASCII码写入DDR

基本输出程序

LOOP	LDI R0 DSR
		BRzp LOOP	; 轮询等待DSR最高位置1表示可以显示了

DSR		.FILL 0xFE04
DDR		.FILL 0xFE06

LC-3输入的读取思路

死循环一直轮询KBSR寄存器,如果高位为1(可以用BRzp判断),跳出死循环并且从KBDR读取字符,否则死循环等着

经验分享 程序员 微信小程序 职场和发展