Assembler под Windows (MASM32). Не работает процедура произведения матриц

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Assembler под Windows (MASM32). Не работает процедура произведения матриц

Assembler под Windows (MASM32). Не работает процедура произведения матриц

StarCLike » 03 июн 2013, 11:44

Есть процедура. При её вызове ей сообщается:
  1. MAAd - адрес начала первой матрицы А
  2. MBad - адрес начала второй матрицы В
  3. MCad - адрес начала результирующей матрицы С
  4. RowA - количество строк в матрице А
  5. CalB - количество столбцов в матрице В
  6. СaRoAB - количество столбцов в матрице А или строк в В
Внутри регистрируются локальные переменные NeRA (i), NeCB (j) и NexCR (l), которые являются счетчиками для циклов.

Данная процедура должна совершать операцию произведения двух матриц и записывать результат в третью. Попутно заполняя некоторый буфер значениями ячеек результирующей матрицы, перемежаемыми запятыми.
Но данная процедура не работает, так как в буфере по завершению остается "0, ".

Подскажите, пожалуйста, где ошибка.

Код: Выделить всё

MatrProd proc MAAd: DWORD, MBAd: DWORD, MCAd: DWORD, 
             RowA: DWORD, CalB: DWORD, CaRoAB: DWORD 
 LOCAL NeRA: DWORD
 LOCAL NeCB: DWORD
 LOCAL NexCR: DWORD
 
 mov NeRA,0
 mov NeCB,0
 mov NexCR,0 
 .WHILE TRUE
   .WHILE TRUE; вычислить адрес и затем [],0
     ;---mov MCAd[NeRA*CalB+NeCB],0
     ;---МатрицаС[i,j]:=0
     ;---i=NeRA*CalB (номер строки на количество строк)
     ;---j=NeCB
  
     invoke IntMul, NeRA, CalB
     mov ebx, NeCB
     add eax, ebx
     mov ebx, DWORD PTR 4
     invoke IntMul, eax, ebx
     mov ebx, MCAd
     add eax, ebx
     mov [eax],DWORD PTR 0

     .WHILE TRUE
       ;mov eax, MBAd[NexCR*CalB+NeCB]
       invoke IntMul, NexCR, CalB
       mov ebx, NeCB
       add eax, ebx
       mov ebx, DWORD PTR 4
       invoke IntMul, eax, ebx
       mov ebx, MBAd
       add eax, ebx
       mov ebx, [eax]
       mov eax, ebx
   
       push eax
   
       ;mov ebx, MAAd[NeRA*CaRoAB+NexCR]
       invoke IntMul, NeRA, CaRoAB
       mov ebx, NexCR
       add eax, ebx
       mov ebx, DWORD PTR 4
       invoke IntMul, eax, ebx
       mov ebx, MAAd
       add eax, ebx
       mov ebx, [eax]
       
       pop eax
       invoke IntMul, eax, ebx
       push eax
   
       ;add MCAd[NeRA*CalB+NeCB],edx
       ;add MCAd[NeRA*CalB+NeCB],eax 
       invoke IntMul, NeRA, CalB
       mov ebx, NeCB
       add eax, ebx
       mov ebx, DWORD PTR 4
       invoke IntMul, eax, ebx
       mov ebx, MCAd
       add ebx, eax
       pop eax
       add [ebx],eax

       invoke dwtoa, eax, ADDR buf11
       invoke lstrcat,addr buf11,addr str11
   
       mov eax, NexCR
       mov ebx, CaRoAB 
       .BREAK .IF eax==ebx 
       inc NexCR
     .ENDW
     mov eax, NeCB
     mov ebx, CalB 
     .BREAK .IF eax==ebx 
     inc NeCB
   .ENDW
   mov eax, NeRA
   mov ebx, RowA 
   .BREAK .IF eax==ebx 
   inc NeRA
 .ENDW  
 ret
MatrProd endp

Код: Выделить всё

    invoke IntMul, NeRA, CalB ; IntMul - произведение целых, результат в eax
    mov ebx, NeCB
    add eax, ebx
    mov ebx, DWORD PTR 4
    invoke IntMul, eax, ebx
    mov ebx, MCAd
    add eax, ebx
Вот в таких блоках ведется поиск текущей ячейки, для последующего умножения, путем увеличения начального адреса матрицы на необходимую величину (перемещаем курсор указывающий ячейку на позицию NeRA*CalB+NeCB).

Код: Выделить всё

      invoke dwtoa, eax, ADDR buf11
      invoke lstrcat,addr buf11,addr str11
Здесь производится заполнение буфера только что рассчитанным значением и добавлением в него ", " (str11 = ", ")

Если необходимо приведен образец работы.

Вернуться к началу