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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_33836580/article/details/50579017

;设计矩阵计算程序


;基本要求:


;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 的规模就不要太大,以免行列相乘、求和后,超出范围。



展开阅读全文

没有更多推荐了,返回首页