1、基本原理
如下图所示,设A、B为被乘数得高、低16位二进制数,C、D为乘数的高、低二进制数,则有:N1×N2=(A×2**16+B)×(C×2**16+D)=BD+AD×2**16+BC×2**16+AC×2**32
通过分析可知,其需要四次乘法运算,每次进行两个16位二进制数乘法,得到四个部分积,然后再求部分累加和。如下图所示:
64位积在内存中存放格式如下:
2、流程图
3、代码实现
test.asm
.global _c_int00
.bss x1,4
.bss x2,4
.bss y,8
.data
dat1: .word -1547316,123133 ;初始数据
.text
_c_int00:
MVKL.S2 0X00000000,B1
MVKH.S2 0X00000000,B1
MVC.S2 B1,AMR
MVK.S1 x1,A0
MVK.S1 x2,A1
MVK.S1 y,A2
MVK.S1 dat1,A4
NOP 5
LDW.D1 *A4++,A5 ;两数据分别存于A4和A5
NOP 5
STW.D1 A5,*A0 ;为x1于x2变量赋值
NOP 5
LDW.D1 *A4,A5
NOP 5
STW.D1 A5,*A1
NOP 5
LDW.D1 *A0,A4
NOP 5
CMPLT .L2 0,A4,B1 ;A4大于0时,B1置1
ABS .L1 A4,A4
NOP 5
CMPLT .L2 0,A5,B2 ;A5大于0时,B2置1
ABS .L1 A5,A5
NOP 5
MPYU.M1 A4,A5,A6 ;A4与A5的低16位相乘
NOP 5
MPYLHU.M1 A4,A5,A7 ;A4低16位与A5高16位相乘
NOP 5
MPYLHU.M1 A5,A4,A8 ;A4高16位与A5低16位相乘
NOP 5
MPYHU.M1 A4,A5,A9 ;A4与A5的高16位相乘
NOP 5
ADDU.L1 A7,A8,A13:A12
NOP 5
SHR.S1 A12,16,A11
NOP 5
ADD.L1 A9,A13,A9
ADD.L1 A9,A11,A13
NOP 5
SHL.S1 A12,16,A7
NOP 5
ADDU.L1 A6,A7,A9:A8
ADD.L1 A9,A13,A13
NOP 5
CMPEQ .L2 B1,B2,B0 ;B1与B2相等时,B0置1
NOP 5
[B0]B A
NOP 5 ;若为负数,取补码
NEG A8,A8
NOP 5
NEG A13,A13
NOP 5
ADD.L1 A13,-1,A13
A:
STW.D1 A8,*A2++
NOP 5
STW.D1 A13,*A2
NOP 5
.end
test.cmd
test1.obj
-o test1.out
MEMORY
{
PAGE 0: ROM0: ORIGIN=0x00003000,LENGTH=0200H
ROM1: ORIGIN=0x00004000,LENGTH=0020H
PAGE 1: RAM : ORIGIN=0x00005000,LENGTH=0020H
}
SECTIONS
{
.text :> ROM0 PAGE 0
.data :> ROM1 PAGE 0
.bss :> RAM PAGE 1
}
4、运行结果
我们将x1、x2、y存储在了连续的地址,如下图为运算仿真图: