📄 mul_sign.c
字号:
#include <p18f4610.h>
#include "mul.h"
void main()
{
int a;
unsigned long temp_u;
signed long temp_s;
temp_s=mul_sign_16(-460,460);
}
//***********16位有符号乘法********************
//入口参数为signed int nmb1_s和signed int nmb2_s
//入口参数的取值范围[-32766,32767]
//带一个返回值(MUL_RESULT全局变量),值为乘法的积。
//积的取值范围[-1073643522,1073676289]
//*********************************************
signed long int mul_sign_16(signed int nmb1_s,signed int nmb2_s)
{
SULTOR.SULTOR_S=nmb1_s;
SULND.SULND_S=nmb2_s;
_asm
MOVF 0x008,0,0
MULWF 0x00a,0
MOVFF PRODH,0X005
MOVFF PRODL,0X004
MOVF 0x00b,0,0
MULWF 0x009,0
MOVFF PRODH,0X007
MOVFF PRODL,0X006
MOVF 0x008,0,0
MULWF 0x00b,0
MOVF PRODL,0,0
ADDWF 0X005,1,0
MOVF PRODH,0,0
ADDWFC 0X006,1,0//06单元内容+乘积(008单元内容*00b单元内容)的高位+(005单元到006单元的)进位
CLRF 0X0FE8,0 //清W寄存器
ADDWFC 0X007,1,0 //(006单元到007单元的)进位
MOVF 0x009,0,0
MULWF 0x00a,0
MOVF PRODL,0,0
ADDWF 0X005,1,0
MOVF PRODH,0,0
ADDWFC 0X006,1,0//06单元内容+乘积(009单元内容*00a单元内容)的高位+(005单元到006单元的)进位
CLRF 0X0FE8,0 //清W寄存器
ADDWFC 0X007,1,0//(006单元到007单元的)进位
BTFSS 0x009,7,0
BRA 4 //判断nmb2符号,pc+1+4
MOVF 0x00a,0,0
SUBWF 0X006,1,0
MOVF 0x00b,0,0
SUBWFB 0X007,1,0
BTFSS 0x00b,7,0
BRA 4 //pc+1+4
MOVF 0x008,0,0
SUBWF 0X006,1,0
MOVF 0x009,0,0
SUBWFB 0X007,1,0
_endasm
return MUL_RESULT;
}
//16位有符号乘法计算E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -