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

如果大家将我前面写的代码直接在TEC-2000 16位教学机真机上运行,就会发现和我所展示的东西不相符合。但是如果仔细查看,可以看出,在执行G 2060之后,寄存器R1与R2中的数值是没错的,也就是数据没错,但是输出的结果出了问题。
这个问题是因为真机在执行out输出指令的时候,并不是一瞬间就完成输出的,而是有延时的,如果你的代码在真机out输出延时的时候又有了一个out的输出函数,那么就会导致新的out输出函数将原本的out输出的值替换掉,导致输出方面的缺失。
所以在真机上所运行的程序,都要在out输出函数之后加上这样一个代码段

OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81

这段代码的意思就是,将R0中的内容,输出到屏幕上,然后通过IN 81获取当前系统的一些状态,将这个状态存入R0中,接着使用SHR将R0右移一位,这被移出的一位存入到C中,然后判断C的值,若为0,则继续获取当前系统状态。一直到从81接口读取的值的第一位为1时,继续执行程序。

也就是说,通过81接口获取的系统状态,从低位往高位看,第一位表示是否完成输出操作,第二位表示是否有键盘的按键按下,即输入缓冲区中是否有字符,因为程序若想要接收到键盘的信息,系统要先从键盘接收到信息,然后存入到缓冲区中,然后程序再去获取。

所以要给原代码的所有OUT输出函数之后加上如上代码段。

这里有个小坑,就是如果单纯的在OUT输出函数之后加上那段代码段,执行操作,输出没问题,但是最后的结果会不一样,这是因为在第一个函数2000中,这个函数实现了从键盘上接收一个数字键值所对应的数字值,并将这个数字值存入到R0中。接着要输出这个值。如果这个时候加上了如上代码段,会导致R0中的内容发生改变,从而读不到正确的值。

可以先将R0的值放到R3中,然后使用如上代码段之后,再将值还给R0即可。

如下是更改之后的2000位置的函数CIN代码
补

而主函数中的内容就大同小异。

还有一个小bug就是,无论你最后算出的值是多少,最后输出的时候都一定是两位数,即使是3X2=06,或者0X6=00,这种情况。这样的情况也容易消除,就是在主函数要输出最后结果的时候,判断一下R1中的值是否为0,若为零则直接跳到输出个位数的地方。
这一小段代码可以这样实现

MVRR R0,R1
MVRD R3,0030
SUB R1,R3
JRZ GOTO:MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面紧接着的IN 81
MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面紧接着的IN 81

或者使用这种方式

MVRR R0,R1
SHR R1
JRNC GOTO:MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面紧接着的IN 81
MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面紧接着的IN 81
发布了17 篇原创文章 · 获赞 3 · 访问量 3102

猜你喜欢

转载自blog.csdn.net/qq_20179227/article/details/103069411
今日推荐