x86 -- mnożenie macierzy [problem]

0

Mam problem: muszę napisać mnożenie macierzy pod x86 a w żaden sposób nie chce mi działać.
Bardzo proszę o pomoc... już nie mam pomysłów co tu można poprawić a muszę to wysłać przed północą :(

#include <iostream>
using namespace std;


int main()
{
	int mac1[4][4] = {{2, 5, 6, 12}, {3, -2, 2, 3}, {3, 5, 1, 8}, {0, 5, 1, 3}},
		mac2[4][4] = {{7, 1, 5, 21}, {9, 4, 12, 5}, {4, 7, 4, 5}, {3, 7, 2, 9}},
		wyn [4][4],
		sum = 0,
		n = 4*4,
		i = 4,  j = 4,  k = 4;



	__asm
	{
		lea edi, mac1
		lea esi, mac2
		lea edx, wyn

		mov ebx, n // wielkość tablicy mac1
		mov ecx, n // wielkość tablicy mac2
		mov ebp, n // wielkość tablicy wyn

		petla_i:
		
			petla_k:
			
				petla_j:
			
					mov eax, [edi + 4*ebx - 4]//mac1
					mul [esi + 4*ecx - 4]//mac2
					add sum, eax
					cmp j, 0
					dec j
					dec ebx
					dec ecx
				jne petla_j
			
				mov eax, sum
				mov [edx + 4*ebp - 4], eax
				mov eax, n
				mul i
				mov ebx, eax
				cmp k, 0
				dec ebp
				dec k
				mov sum, 0
			jne petla_k
			
			mov ecx, n
			sub ebx, 4
			cmp i, 0
			dec i
		jne petla_i
		}



	for (int i = 0;  i < n;  i++)
	{
		for (int j = 0;  j < n;  j++)
		{
			cout << wyn[i][j];
		}
		cout << endl;
	}
	return 0;
}
0

Bez czytania kodu Asemblerowego na razie:

int wyn [4][4];
n = 4*4; // 4 * 4 = 16

...

        for (int i = 0;  i < n;  i++) // i < 16
        {
                for (int j = 0;  j < n;  j++) // j < 16
                {
                        cout << wyn[i][j]; // wyn[i][j];
                }
                cout << endl;
        }

To nie ma prawa działać;

0

poprawione, ale problem, poważniejszy, jest w assemblerze :/

0

Zagadka, czym się różni twoje poprawione:

for (int i = 0;  i < n;  i++)
        {
                for (int j = 0;  j < n;  j++)
                {
                        cout << wyn[i][j];
                }
                cout << endl;
        }

Od niepoprawionego:

for (int i = 0;  i < n;  i++) // i < 16
        {
                for (int j = 0;  j < n;  j++) // j < 16
                {
                        cout << wyn[i][j]; // wyn[i][j];
                }
                cout << endl;
        }
0

Czy naprawdę nikt nie jest w stanie mi pomóc?
Siedzę nad tym od 6 rano i wiem, że już nic więcej mądrego nie wymyślę :(

0
anai napisał(a):

Czy naprawdę nikt nie jest w stanie mi pomóc?
Siedzę nad tym od 6 rano i wiem, że już nic więcej mądrego nie wymyślę :(

A próbowałeś debuggera użyć?

0

skoro mi się nawet już nie kompiluje... te cholerne rejestry
w C napisałam to w 20 min

0

No to włącz sobie takie magiczne okienko jak Disassembly i zobacz, jaki kod z tego napisanego w 20 minut zrobił kompilator?

1 użytkowników online, w tym zalogowanych: 0, gości: 1