运算类程序是指专门负责算术或逻辑运算的程序。在实际的程序设计中,经常会遇到一些数学计算类的程序,比如多字节数的加法、减法、乘法和除法,以及带符号数的运算等。由于51系列单片机的指令系统中,只提供了单字节和无符号数的算术运算指令,因此,需要自己编写这些子程序,这样可以方便以后使用。下面给出一些典型的运算类子程序,以方便读者学习使用。
实际的程序设计中,如果遇到需要处理带符号数的乘法,则需要编写带符号整数的乘法的子程序,因为51系列单片机中的乘法指令只适用于无符号数。
带符号数乘法需要完成的工作是:首先保存两个乘数的符号,求出整个乘积结果的符号;然后,两个数取绝对值进行相乘;最后,根据积的符号,对得到的结果进行处理。
本子程序中,参数的传递是这样的:被乘数和乘数分别保存在R1和R0中,供子程序使用;子程序结束时,将积的高8位和低8位分别保存在R3和R2中。8位带符号整数的乘法子程序代码示例如下:
在该程序中,积的符号使用位运算指令进行异或操作,即通过位的与、或运算来完成。正数的绝对值是其原码本身,负数的绝对值是通过求补码来实现的。本程序的流程图如图5-10所示。
同前面类似,如果遇到需要处理带符号数的除法,则需要编写带符号整数的除法的子程序,来克服指令集中的除法指令的限制,因为51系列单片机中的除法指令只适用于无符号数。8位带符号整数的除法子程序采用的方法是:将被除数和除数的绝对值进行相除,根据两数的符号来决定最后商的符号,另外,余数的符号要和被除数相同。
本子程序的参数传递情况是:被除数和除数分别保存在R1和R2中,供子程序使用,子程序执行完毕后,将商和余数分别保存在R1和R2中,即覆盖了原来的数据。8位带符号整数的除法子程序的流程图,如图5-11所示。
图5-10 8位带符号整数乘法流程图
图5-11 8位带符号整数除法流程图
程序代码示例如下:
在该程序中,使用了工作寄存器R4暂存被除数的符号,R5暂存除数的符号或商的符号。这里确定商的符号是采用字节的与运算、异或运算来确定商的符号,当然也可以采用上一个例子的方法来实现。