80x86汇编语言编程:两个矩阵相乘

有一个题目,要求用汇编语言编写矩阵计算的程序。
题目链接:百度知道

基本要求:
 1、开窗口输入并显示矩阵;
 2、实现两个矩阵的相乘 MC = MA * MB;
 3、换行输出并显示矩阵相乘的结果。

由于,在题目中,已经给定了矩阵 MA 和矩阵 MB。所以,就不需要在现场输入了。
只要开出窗口,显示三个矩阵 MA、MB、MC 即可。

做而论道编写的程序如下:

;=================================
DATA	SEGMENT
;-----------------------------
  MA	DW   11, 12, 13, 14
    	DW   21, 22, 23, 24
    	DW   31, 32, 33, 34
  HA	EQU  3		;行数
  LA	EQU  4		;列数
;-----------------------------
  MB	DW   11, 21, 31, 33, 15
    	DW   12, 22, 32, 42, 25
    	DW   13, 23, 33, 43, 35
    	DW   14, 24, 34, 44, 45
  HB	EQU  4
  LB	EQU  5
;-----------------------------
  MC	DW   HA * LB  DUP(?)
  HC	EQU  HA
  LC	EQU  LB
  HH	DW   ?
  LL	DW   ?
;-----------------------------
DATA	ENDS
;=================================
CODE	SEGMENT
	ASSUME	CS:CODE, DS:DATA
START:
	MOV 	AX, DATA
	MOV 	DS, AX
	CALL	CR_LF
	MOV 	BX, OFFSET  MA
	MOV 	CX, LA
	MOV 	DX, HA
	CALL	PRINT_M
	CALL	CR_LF
	MOV 	BX, OFFSET  MB
	MOV 	CX, LB
	MOV 	DX, HB
	CALL	PRINT_M
	CALL	CR_LF
	CALL	MUL_AB
	MOV 	BX, OFFSET  MC
	MOV 	CX, LC
	MOV 	DX, HC
	CALL	PRINT_M
EXIT:
	MOV 	AH, 4CH
	INT 	21H
;==================================
PRINT_M:		;矩阵输出
	PUSH	CX
PR2:
	MOV 	AX, [BX]
	CALL	TAB_09
	CALL	PRINT_AX
	ADD 	BX, 2
	LOOP	PR2
	POP 	CX
	CALL	CR_LF
	DEC 	DX
	JNZ 	PRINT_M
RET
;==================================
PRINT_AX:
	PUSH	BX
	PUSH	CX
	PUSH	DX
	MOV 	BX, 10
	MOV 	CX, 0
P_LOP1:
	MOV 	DX, 0
	DIV 	BX
	INC 	CX
	PUSH	DX
	CMP 	AX, 0
	JNZ 	P_LOP1
	MOV 	AH, 2
P_LOP2:
	POP 	DX
	ADD 	DL, '0'
	INT 	21H
	LOOP	P_LOP2
	POP 	DX
	POP 	CX
	POP 	BX
RET
;=================================
CR_LF:
	PUSH	AX
	PUSH	DX
	MOV 	AH, 2
	MOV 	DL, 13
	INT 	21H
	MOV 	DL, 10
	INT 	21H
	POP 	DX
	POP 	AX
RET
;=================================
TAB_09:
	PUSH	AX
	PUSH	DX
	MOV 	AH, 2
	MOV 	DL, 9	;','
	INT 	21H
	POP 	DX
	POP 	AX
RET
;=================================
MUL_AB:			;矩阵相乘
	MOV 	DI, 0
	MOV 	HH, 0
MUL_0:
	MOV 	LL, 0
;-------------------------
MUL_1:
	MOV 	BX, HH
	ADD 	BX, HH
;---------------------
	MOV 	SI, LL
	ADD 	SI, LL
	MOV 	CX, LA
MUL_2:
	MOV 	AX, MA[BX]
	MOV 	DX, MB[SI]
	MUL 	DX
	ADD 	MC[DI], AX
	ADD 	BX, 2
	ADD 	SI, 2 * LB
	LOOP	MUL_2
;---------------------
	ADD 	DI, 2
	INC 	LL
	CMP 	LL, LB
	JNZ 	MUL_1
;-------------------------
	ADD 	HH, LA
	CMP 	HH, HA * LA
	JB  	MUL_0
RET
;=================================
CODE	ENDS
	END 	START

本程序的执行结果截图如下:

还可以换别的矩阵再试试。

例如,把 MA、MB 两个矩阵的内容,做如下修改:
  MA   DW   01, 02, 03, 04
       DW   05, 06, 07, 08
       DW   09, 10, 11, 12
       
  MB   DW   20, 19, 18, 17, 16
       DW   15, 14, 13, 12, 11
       DW   10, 09, 08, 07, 06
       DW   05, 04, 03, 02, 01

更换了矩阵内容之后,再执行程序,输出的截图如下:

后来改动这两个矩阵 MA、MB,其中的元素,都比较小一些,这就便于用人工计算进行验证。感兴趣的朋友,可以把这两个截图中的数值,验证一下吧。

在本程序中,矩阵 MC 中的元素,选用了 16 位二进制数。因此,矩阵 MA、MB 的规模就不要太大,以免行列相乘、求和之后,超出 16 位数的范围,造成错误的结果。

--本文完--


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值