SHR R0 ;
JRNC 2028 ;未完成, 则循环等待
POP R0 ;已完成, 准备输出下一字符并从堆栈恢复 R0的值
INC R0 ;得到下一个要输出的字符
JR 2024 ;转去输出字符
(202E) RET
这个程序只使用基本汇编语句。理解中的一个难点, 是程序当中判串行口是否完成一个字符的输出过程并循环等待的三个汇编语句。具体解释见有关串行接口讲解部分的内容。
该程序的执行码放在 2020 起始的连续内存区中。若送入源码的过程中有错, 系统会进行提示, 等待重新打入正确汇编语句。在输入过程中, 在应打入语句的位置直接打回车则结束输入过程。接下来可用 G 2020 命令运行该程序。
思考题: 当把 IN 01, SHR R0, JNC, 2029 三个语句换成 4 个 MVRR R0,R0 语句, 该程序执行过程会出现什么现象? 试分析并实际执行一次。
类似的, 若要求在终端屏幕上输出'A'到'Z'共 26 个英文字母, 应如何修改例 1 中给出的程序? 请验证之。
例子3: 从键盘上连续打入多个属于'0'到'9'的数字符并在屏幕上显示, 遇非数字符结束输入。
A 2040
(2040)MVRD R2, 0030` ; 用于判数字符的下界值
MVRD R3, 0039 ; 用于判数字符的上界值
(2044) IN 81 ; 判键盘上是否按了一个键,
SHR R0 ; 即串行口是否有了输入的字符
SHR R0
JRNC 2044 ; 没有输入则循环测试
IN 80 ; 输入字符到 R0
MVRD R1, 00FF
AND R0, R1 ;清零 R0 的高位字节内容
CMP R0, R2 ; 判输入字符≥字符'0'否
JRNC 2053 ; 为否, 则转到程序结束处
CMP R0, R3 ; 判输入字符≤字符'9'否
JRC 2053 ; 为否, 则转到程序结束处 ,想一想做这步有什么用!!
OUT 80 ; 输出刚输入的数字符
JMPA 2044 ; 转去程序前边 2044 处等待输入下一个字符
(2053) RET
思考题, 本程序中为什么不必判别串行口输出完成否? 设计打入'A'~'Z'和'0'~'9'的程序, 遇其它字符结束输入过程。
从地址 2040开始输入下列程序:
例子 4: 计算 1 到10 的累加和。
A 2060
(2060)MVRD R1, 0000 ; 置累加和的初值为 0
MVRD R2, 000A ; 最大的加数
MVRD R3, 0000