80x86汇编语言编程:两个矩阵相乘
2016-01-25 12:03
603 查看
;设计矩阵计算的程序
;基本要求:
;1、显示矩阵;
;2、实现两个矩阵的乘法 C = A * B;
;3、换行、输出并显示矩阵相乘的结果。
;题目链接:http://zhidao.baidu.com/question/561817776
;做而论道编写的程序如下:
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 PRINT_AX
CALL TAB_09
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
;=========================================
程序的执行结果如下:
c:\masm510>M_M
11 12 13 14
21 22 23 24
31 32 33 34
11 21 31 33 15
12 22 32 42 25
13 23 33 43 35
14 24 34 44 45
630 1130 1630 2042 1550
1130 2030 2930 3662 2750
1630 2930 4230 5282 3950
换一下矩阵的内容,见下面的两个矩阵:
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
执行后,输出如下:
1 2 3 4
5 6 7 8
9 10 11 12
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
100 90 80 70 60
300 274 248 222 196
500 458 416 374 332
这组数据,比较小一些,便于用人工计算进行验证,不知是否有人愿意验证一下。
本程序,矩阵 MC 中的元素,采用了 16 位数。因此,矩阵 MA、MB 的规模就不要太大,以免行列相乘、求和后,超出范围。
;基本要求:
;1、显示矩阵;
;2、实现两个矩阵的乘法 C = A * B;
;3、换行、输出并显示矩阵相乘的结果。
;题目链接:http://zhidao.baidu.com/question/561817776
;做而论道编写的程序如下:
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 PRINT_AX
CALL TAB_09
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
;=========================================
程序的执行结果如下:
c:\masm510>M_M
11 12 13 14
21 22 23 24
31 32 33 34
11 21 31 33 15
12 22 32 42 25
13 23 33 43 35
14 24 34 44 45
630 1130 1630 2042 1550
1130 2030 2930 3662 2750
1630 2930 4230 5282 3950
换一下矩阵的内容,见下面的两个矩阵:
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
执行后,输出如下:
1 2 3 4
5 6 7 8
9 10 11 12
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
100 90 80 70 60
300 274 248 222 196
500 458 416 374 332
这组数据,比较小一些,便于用人工计算进行验证,不知是否有人愿意验证一下。
本程序,矩阵 MC 中的元素,采用了 16 位数。因此,矩阵 MA、MB 的规模就不要太大,以免行列相乘、求和后,超出范围。
相关文章推荐
- 51 汇编编程:8×8 点阵驱动
- 51 汇编编程:倒计时交通灯
- 51 汇编编程:多路延时开关
- 51 汇编编程:中断的现场保护与恢复
- 51 汇编编程:一种单片机抢答器
- 51 汇编编程:停留保持的流水灯
- 80x86汇编语言编程:求两个单元中,有多少个对应的位是不同的
- 80x86汇编语言编程:求素数
- C# socket编程实践——简单聊天室
- 80x86汇编语言编程:输入0到9,输出hello world
- 80x86汇编语言编程:宏指令
- 80x86汇编语言编程:二进制输入、十进制输出
- 80x86汇编语言编程:查找字符串中的最大、最小值
- 80x86汇编语言编程:三个数字进行比较
- C编程中阻止程序退出的方法
- 80x86汇编语言编程:在屏幕上显示彩色 ASCII 码
- Matlab入门学习(矩阵、函数、绘图的基本使用)
- 80x86汇编语言编程:在屏幕上模拟升旗的过程
- 80x86汇编语言编程:排序与显示
- 80x86汇编语言编程:求 10000 以内的《完数》