一位数乘法的汇编语言实现(一)

使用的是16位微程序设计,指令为TEC-2000 16位教学计算机的指令系统

要实现的功能:通过键盘键入一个数字,接收之后显示出来,然后自动补上*号,接着再次键入一个数字,然后自动补上=号,接着输出运算结果。

本文章实现的是,子程序:获得输入的一个数字的值,将该输入的值存放到R0寄存器中,如果按下的按键不是一个数字,则继续等待输入,直到键入的值为数字时,才结束程序。

这个子程序会使用R0寄存器存放键入的按键对应的数值,同时会改变R2和R3寄存器的值

代码功能简介

汇编语言指令 汇编指令的功能
MVRD DR,DATA DATA -> DR 或 DR = DATA 给寄存器DR赋值
IN PORT [PORT] -> R0 从外界设备输入
OUT PORT R0 -> [PORT] 将R0的值往外界设备输出
SHR DR DR/2 -> DR,C 将寄存器DR的值向右移动一位,移出的位存入C中
AND DR,SR DR and SR -> DR 将DR与SR的值做‘’且‘’操作
SUB DR,SR DR - SR -> DR 将DR - SR的值存入DR中
CMP DR,SR DR - SR (解释在文章稍后位置)
JRNC ADR C = 0 时跳转到地址ADR处继续执行程序
JRC ADR C = 1 时跳转到地址ADR处的位置继续执行程序
RET 表示程序结束,类似于return

注:DATA表示十六位进制的一个具体的数字
       DR、SR表示寄存器
       PORT为串行端口号
       ADR表示地址,绝对地址

CZVS:C表示进位位,Z表示是否为0,V表示是否溢出,S表示符号位。(具体含义请自行学习)

关键字解释

GOTO:并不是标准汇编语言,因为跳转的话需要写上绝对地址,而绝对地址并不是每一次都一样,但是又要将代码表达出来,则使用这种方式,表示要跳转的位置。



代码块功能介绍

代码块1:

IN 81		//检查串行输入口是否有按键被按下
SHR R0
SHR R0
JRNC GOTO:IN 81	//如果没有按键被按下的话,就向上回到IN 81那儿,循环检查是否有按键被按下
IN 80		//将串行输入口的数据,存入R0寄存器

此代码块实现从键盘接收一个按键的ASCII码的值。先由IN 81,将81串口的信息接收到R0,再通过SHR将R0的二进制值向右移动两位。*因为将二进制数整体向右移动,左边高位补0,而原二进制数的最低位将被遗失,这个遗失的值在汇编语言中会保存在C中。*通过判断第二次移动,所遗失的值,来得到键盘上是否有按键被按下。
如果第二次移动所遗失的值,为0,则表示没有按键被按下,这时候就跳转回IN 81的位置,继续等待按键按下。
如果遗失的值为1,则程序会继续向下执行,那么就会从80串口接收键盘按下的值,然后存到R0中,这个时候存入的值,是那个按键所对应的ASCII码的值,详情参见ASCII码表。


代码块2

MVRD R2,0030	//定义输入的下界 ASCII 0
MVRD R3,003A	//定义输入的上界 ASCII 9之后的那一个
CMP R0,R2
JRNC GOTO:IN 81	//如果输入的字符的ASCII码比0小,就回到IN 81那儿,重新等待输入
CMP R0,R3
JRC GOTO:IN 81	//如果输入的字符的ASCII码比9大,就回到IN 81那儿,重新等待输入

CMP DR,SR 指令表示进行运算 DR-SR,不会改变寄存器的值,而会改变C的值,而JRNC与JRC皆是根据C的值来进行操作的。如果DR>=SR,那么C的值就是1,如果DR<SR,那么C的值就是0。

这个代码块用来判断键入的值是否为数字的ASCII码,如果不是则重新等待键入,如果是则程序继续向下执行。

因为CMP只能判断大于等于和小于两种状态,所以下届用0,上界用9之后的那一个

代码总览

//获得输入的一个数字值的子程序,将获得的值存放在R0中,会改变R2和R3的值
CIN		//因为此程序为子程序,之后要在主程序中调用,所以人为的给一个名字
MVRD R0,0000
IN 81		//检查串行输入口是否有按键被按下
SHR R0
SHR R0
JRNC GOTO:IN 81	//如果没有按键被按下的话,就向上回去IN 81那儿,循环检查按键
IN 80		//将串行输入口的数据,存入R0

//可省略
MVRD R2,00FF
AND R0,R2	//清空R0中高八位的字节内容

MVRD R2,0030	//定义输入的下界 ASCII 0,0030为48的十六位进制表示法
MVRD R3,003A	//定义输入的上界 ASCII 9之后的那一个
CMP R0,R2
JRNC GOTO:IN 81	//如果输入的字符的ASCII码比0小,就回到IN 81那儿,重新等待输入
CMP R0,R3
JRC GOTO:IN 81	//如果输入的字符的ASCII码比9大,就回到IN 81那儿,重新输入
OUT 80		//输出读入的字符
SUB R0,R2	//将读入的字符ASCII码值换算成具体数值
RET

注:此代码不是标准的汇编语言代码,直接使用会报错

汇编语言在TEC-2000机上的代码截图展示
一位数输入

发布了17 篇原创文章 · 获赞 3 · 访问量 3107

猜你喜欢

转载自blog.csdn.net/qq_20179227/article/details/102883539