MASM: Проблема с умножением матриц 3X3 в 8086?

Я пытаюсь умножить две матрицы размером 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,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 

person Ankur    schedule 17.10.2020    source источник


Ответы (1)


Не смотрите слишком много на этот код C++.

  mov bx, offset ARR3

Изучите ниже, как вычислить элемент R(0,0), умножив 1-ю строку ARR1 на 1-й столбец ARR2:

  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)

Изучите ниже, как вычислить элемент R(0,1), умножив 1-ю строку ARR1 на 2-й столбец ARR2:

  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)

Изучите ниже, как можно вычислить элемент R(0,2), умножив 1-ю строку ARR1 на 3-й столбец ARR2:

  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)

Видите ли вы закономерность?
Теперь нужно объединить эти фрагменты в один цикл. Может потребоваться нажатие/выталкивание нескольких регистров и/или использование некоторых переменных, основанных на памяти!

Позже вы повторяете жребий для 2-й и 3-й строк полученной матрицы.

person Sep Roland    schedule 18.10.2020
comment
Большое спасибо за ответ, не могли бы вы дополнить свой код, после добавления всей кучи кода, который вы написали в цикле, пожалуйста, это мне очень поможет - person Ankur; 20.10.2020
comment
На самом деле, где я буду хранить количество элементов для выполнения цикла, это основная проблема, с которой я сталкиваюсь, не могли бы вы помочь мне в этом. - person Ankur; 20.10.2020