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

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

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

本文章实现的,子程序:两个一位数的乘法子程序,将R1和R2中的一位数相乘,最后的结果会在R0中。

本程序要使用R1和R2寄存器,同时会改变R3和R0寄存器的值

代码功能简介

汇编语言指令 汇编指令功能
MVRD DR,DATA DATA -> DR 或 DR = DATA 给寄存器DR赋值
DEC DR DR - 1 -> DR 实现DR的自减功能
ADD DR,SR DR + SR -> DR
SHR DR DR/2 -> DR,C 将寄存器DR的值向右移动一位,移出的位存入C中
SHL DR DR*2 -> DR,C 将DR左移一位,移出的位存到C中
JR ADR 无条件跳转到ADR地址上
JRNC ADR C = 0 时跳转到地址ADR处继续执行程序
JRZ ADR Z = 1 时跳转到地址ADR处的位置继续执行程序
RET 表示程序结束,类似于return

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

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

关键字解释

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



代码块功能介绍

代码块1

MVRD R3,0005
DEC R3
JRZ GOTO:RET	//如果已经执行四次,则结束程序
SHR R2		//将R2中的二进制右移一位
JRNC GOTO:SHL R1	//如果移出的位为0,则移动到将R1移位的地方
ADD R0,R1
SHL R1		//将R1中的二进制数左移一位
JR GOTO:DEC R3	//回到DEC那儿,重复执行,实现循环

本代码块实现两个一位数的乘法,本质上可以实现两个0-15之间的数的乘法。
首先解释这个算法的原理
两个一位数,比如8和9
在寄存器中他们的保存格式为二进制
所以两个数在计算机看来就是,1000和1001。(十进制与二进制的转化请自行学习)
现在,R1存储8,即R1 1000;R2存储9,即 R2 1001
首先,右移R2,R2变成 0100,这个时候遗失的位就是1,那么C 就是 1
因为C为1,所以程序到JRNC处不会跳转,会继续执行
这个时候就执行R0 = R0 + R1,即R0为1000
然后将R1左移一位,R1   1 0000
因为R2为0100,右移一位C为0,所以R0值不变
这个时候R1要再一次左移,变为 10 0000
接着R2为0010,右移一位C依旧为0,所以R0的值还是不变
这时R1继续左移,变为100 0000

接着第四次将R1右移的时候,移出的位为1,
那么将执行R0 = R0 + R1,R0 1000 R1  100 0000
那么R0的值会变成 100 1000。
因为是第四次执行,所以程序就结束了
将0100 1000转化为十进制后,值就是72了。

因为此程序实现的是一位数的乘法,所以,最多只要右移四次,就可以将一个数的四个位都遍历一遍了。

至于为什么要将R3寄存器的值初始化为0005,而不是0004,大家可以简单的思考一下

代码总览

//两个一位数的乘法子程序,要将两个数分别存入R1和R2中,最后的结果会在R0中,同时会改变R3的值
MUL
MVRD R0,0000
MVRD R3,0005
DEC R3
JRZ GOTO:RET	//如果已经执行四次,则结束程序
SHR R2		//将R2中的二进制右移一位
JRNC GOTO:SHL R1	//如果移出的位为0,则移动到将R1移位的地方
ADD R0,R1
SHL R1		//将R1中的二进制数左移一位
JR GOTO:DEC R3	//回到DEC那儿,重复执行,实现循环
RET

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

TEC-2000 16位教学计算机汇编语言代码截图
一位数相乘
我们先把R1寄存器和R2寄存器的值更改为0008和0009,将R0的值置为无关的一个值
接着运行刚刚写的程序,会发现,R0的值已经变成了48,48就是72的十六进制值
虽然寄存器中存储的值都是16位进制的,但是因为0008和0009都是一位数,所以在写法上不会有什么区别。

在这里插入图片描述

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

猜你喜欢

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