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

Компьютеры программирование assembler

Есть процедура. При её вызове ей сообщается:
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 = ", ")
Ответы:
Мои соболезнования.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.