Есть процедура. При её вызове ей сообщается:
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 = ", ")
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.