汇编语言–64位乘法运算
前言
本文解决的问题:两个32位数据相乘,得到64位数据的过程。
一、采用的方法
代码原理:两个32位数据相乘,可以采用类似普通的乘法运算,先低16位和低16位相乘,和两个低16位和高16位相乘,在高16位和高16位相乘,原理可以看下图。这里 “+” 不是直接相加的意思,而是一个32位数据的意思,要注意各位相加的产生进位的问题,要注意程序运行过程中CF的变化。
提示:主要的问题就在这里
二、算法代码
1.算法代码
DATA SEGMENT
A1 DW 0D678H,0D678H;乘数
B1 DW 0D678H,0D678H;乘数
C1 DW 4 DUP (?) ;预留积
C2 DW 2 DUP (?)
DATA ENDS
STACK1 SEGMENT STACK
DB 100 DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START PROC FAR
PUSH DS ;压栈
MOV AX, 0 ;标准序
PUSH AX ;压栈AX
MOV AX, DATA ;DATA的地址赋给AX
MOV DS, AX ; DS的值改为DATA
MOV AX, A1;
MUL B1 ;两个低16位相乘
MOV C1, AX
MOV C1+2, DX ;结果储存在C1,32位
MOV AX, A1+2
MUL B1 ;A1高16位*B1的低16位
MOV C2, AX
MOV C2+2, DX ;结果存储在C2,32位
MOV AX, B1+2
MUL A1 ;B1的高16位*A1的低16位
ADD AX,C2 ;低位相加
ADC DX,C2+2 ;高位相加
PUSHF ;保留相加的进位结果
ADD C1+2,AX ;结果保留带C1
ADC C1+4,DX
MOV AX, A1+2
MUL B1+2 ;A1,B1的高16位相乘
POPF ;出栈FR
ADC C1+6,0 ;进位相加,清理进位
ADD C1+4,AX
ADC C1+6,DX
RET
START ENDP
CODE ENDS
END START
2.代码结果
总结
这个问题考察ADD,ADC,MUL等操作。同时理解汇编代码也有助于学习51单片机,希望大家一起进步啊。