有一个题目,要求用汇编语言编写矩阵计算的程序。
题目链接:百度知道。
基本要求:
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 位数的范围,造成错误的结果。
--本文完--