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

Posted

技术标签:

【中文标题】MASM:8086 中的 3X3 矩阵乘法有问题吗?【英文标题】:MASM: Problem in 3X3 matrix multiplication in the 8086? 【发布时间】:2020-10-17 10:00:03 【问题描述】:

我正在尝试将两个维度为 3x3 的矩阵相乘,并希望将结果存储在新的二维数组中。我非常清楚 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,00H
        DW 00H,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 

【问题讨论】:

【参考方案1】:

不要看太多 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 ARR1
  mov di, offset ARR2 + 2
  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 2nd column of ARR2
  dec cx
  jnz Sum
  mov [bx+2], bp ; Store in R(0,1)

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

  mov si, offset ARR1
  mov di, offset ARR2 + 4
  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 3rd column of ARR2
  dec cx
  jnz Sum
  mov [bx+4], bp ; Store in R(0,2)

您是否看到正在出现的模式? 现在的任务是将这些 sn-ps 组合成一个循环。可能需要推送/弹出一些寄存器和/或使用一些基于内存的变量!

稍后,您对结果矩阵的第 2 行和第 3 行重复该批次。

【讨论】:

非常感谢您的回答,能否请您完成您的代码,请在循环添加您编写的整个代码后,这对我很有帮助 实际上,我将存储执行循环的元素数量,这是我面临的主要问题,请您帮我解决这个问题

以上是关于MASM:8086 中的 3X3 矩阵乘法有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

具有位旋转技巧的快速整数矩阵乘法

如何在 C++ 中构建 3x3 平移矩阵

在 MASM 8086 程序集中读取多个文件

Eigen3 矩阵乘法性能

如何反转一个 3x3 矩阵,每个元素都是一个 3x3 矩阵?

8086汇编 程序编译