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

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



代码块功能介绍

代码块1
MVRD 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为个位数。

在这里插入图片描述

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

猜你喜欢

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