您的位置:首页 > 编程语言

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 的规模就不要太大,以免行列相乘、求和后,超出范围。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: