使用的是16位微程序设计,指令为TEC-2000 16位教学计算机的指令系统
要实现的功能:通过键盘键入一个数字,接收之后显示出来,然后自动补上*号,接着再次键入一个数字,然后自动补上=号,接着输出运算结果。
本文章实现,子程序:将一个两位数以内的数(两位数或者一位数),转化为两个一位数(十位数和个位数),其中要转换的数是R0,转换之后的十位数为R1,个位数为R2。
本程序会使用到,R0、R1、R2、R3寄存器
代码功能简介
汇编语言指令 | 汇编指令的功能 |
---|---|
MVRD DR,DATA | DATA -> DR 或 DR = DATA 给寄存器DR赋值 |
MVRR DR,SR | SR -> DR 将寄存器SR中的值赋给DR寄存器 |
SUB DR,SR | DR - SR -> DR 将DR - SR的值存入DR中 |
INC DR | DR +1 -> DR 实现DR的自增 |
CMP DR,SR | DR - SR (解释在文章稍后位置) |
JR ADR | 无条件跳转到ADR地址上 |
JRNC ADR | C = 0 时跳转到地址ADR处继续执行程序 |
JRC ADR | C = 1 时跳转到地址ADR处的位置继续执行程序 |
RET | 表示程序结束,类似于return |
CMP DR,SR 指令表示进行运算 DR-SR,不会改变寄存器的值,而会改变C的值,而JRNC与JRC皆是根据C的值来进行操作的。如果DR>=SR,那么C的值就是1,如果DR<SR,那么C的值就是0。
CZVS:C表示进位位,Z表示是否为0,V表示是否溢出,S表示符号位。(具体含义请自行学习)
关键字解释
GOTO:并不是标准汇编语言,因为跳转的话需要写上绝对地址,而绝对地址并不是每一次都一样,但是又要将代码表达出来,则使用这种方式,表示要跳转的位置。
代码块功能介绍
代码块1MVRD R3,000A //将R3的值设置为10,用来区分一位数和两位数
MVRD R1,0000 //将记录十位数值的寄存器初始化
CMP R0,R3 //比较R0与R3,看看R0是否为两位数
JRNC GOTO:MVRR R2,R0 //如果R0是一位数,则直接转移到下面的MVRR R2,R0
SUB R0,R3 //如果R0为两位数,则减去10
INC R1 //将记录R0十位数值的寄存器加一
JR GOTO:CMP R0,R3 //跳回CMP,看看R0减过10之后,是否还是两位数
MVRR R2,R0 //此时R0已经是一位数,直接将R0的值给R2即可
此代码块实现,将一个两位数或者一位数,拆分为十位数和个位数。要拆分的数存入R0中,拆分之后的十位数存入R1,个位数存入R2。
例如,R0当前为25
首先判断其是否大于10
结果为真,所以将其减去10,得到R0为15
接着会将R1自增,R1为1
然后程序会跳回CMP R0,R3;继续比较大小
得到R0还是大于R3,则再将其值减去10,得到R0为5
然后R1自增,为2
再一次判断的时候,R0不大于R3,即R0已经是一位数了,那么程序就会跳到MVRR R2,R0
将R0的值赋给R2,这个时候R2就是5
这样最后的时候,R1中就是2,R2中就是5,实现拆分。
代码总览
//将R0中的两位数(十进制),拆分,转化为R1中十位数,R2中个位数;会改变R3的值
SPLIT
MVRD R3,000A //将R3的值设置为10,用来区分一位数和两位数
MVRD R1,0000 //将记录十位数值的寄存器初始化
CMP R0,R3 //比较R0与R3,看看R0是否为两位数
JRNC GOTO:MVRR R2,R0 //如果R0是一位数,则直接转移到下面的MVRR
SUB R0,R3 //如果R0为两位数,则减去10
INC R1 //将记录R0十位数值的寄存器加一
JR GOTO:CMP R0,R3 //跳回CMP,看看R0减过10之后,是否还是两位数
MVRR R2,R0 //此时R0已经是一位数,直接将R0的值给R2即可
RET
注:此代码不是标准的汇编语言代码,直接使用会报错
可以看到,将R0的值初始化为000F,即十六进制的15,R1和R2置无关值
然后执行感刚刚编好的程序,就成功的将这个数拆分为两个数,R1为十位数,R2为个位数。