MASM:8086中的3X3矩阵乘法是否有问题?

问题描述

我正在尝试将维度为3x3的两个矩阵相乘,并将结果存储在新的2d数组中。我对C ++中的算法非常了解,但是对我来说主要的问题是迭代三个循环并在8086情况下设置指针

In c++,below will be the simple code
   for(int i=0;i<3;i++)
   { 
      for(int j=0;j<3;j++)
     {
        for(int k=0;k<3;k++) 
           mat3[i][j]+=(mat1[i][k]*mat2[k][j]);
     }
   }

但是用MASM编码上面的代码似乎非常困难,请帮助我如何处理MASM(8086)中的编码部分 下面是我编写的代码,下面是示例数组,实际上,我知道下面的代码是不完整的,但是我无法考虑如何在有限的寄存器内容数量的情况下走得更远(也许会有一个好的方法但我对此的了解有限)

ASSUME CS:CODE,DS:DATA
DATA SEGMENT
ARR1 DW 01H,02H,03H
     DW 05H,06H,07H
     DW 08H,09H,02H
ARR2 DW 03H,04H,05H
     DW 06H,07H,08H
     DW 10H,11H,12H
ARR RES DW 00H,00H,00H
        DW 00H,00H
DATA ENDS
CODE SEGMENT
START:
   MOV AX,DATA
   MOV DS,AX
   MOV SI,OFFSET ARR1
   MOV DX,OFFSET ARR2
   MOV AX,OFFSET RES3
   MOV CL,00H
   MOV CH,03H
   MOV BL,03H
   MOV BH,00H
LOOP1:
    
    LOOP2:
    LOOP3:

    ADD CL,03H
    SUB CL,09H
    JZ END
    JMP LOOP1
CODE ENDS
END START
;DOUBTS
;HOW TO USE INTIALIZE THE STARTING ADDRESS OF THE 2D ARRAY WITH SO MYCH
;LIMITED REGISTERS 

解决方法

不要过多看C ++代码。

  mov bx,offset ARR3

以下研究如何通过将 ARR1 的第一行与 ARR2 的第一列相乘来计算R(0,0)元素:

  mov si,offset ARR1
  mov di,offset ARR2
  mov cx,3
  xor bp,bp
Sum:
  mov ax,[si]
  mul word ptr [di]
  add bp,ax
  add si,2    ; Next element on 1st row of ARR1
  add di,6    ; Next element in 1st column of ARR2
  dec cx
  jnz Sum
  mov [bx],bp ; Store in R(0,0)

以下研究如何通过将 ARR1 的第一行与 ARR2 的第二列相乘来计算R(0,1)元素:

  mov si,offset ARR2 + 2
  mov cx,6    ; Next element in 2nd column of ARR2
  dec cx
  jnz Sum
  mov [bx+2],1)

以下研究如何通过将 ARR1 的第一行与 ARR2 的第三列相乘来计算R(0,2)元素:

  mov si,offset ARR2 + 4
  mov cx,6    ; Next element in 3rd column of ARR2
  dec cx
  jnz Sum
  mov [bx+4],2)

您看到一种新模式吗?
现在的任务是将这些片段合并为一个循环。可能需要压入/弹出一些寄存器和/或使用一些基于内存的变量!

稍后,对结果矩阵的第二行和第三行重复很多操作。