Dodawanie dwóch macierzy C++ i wstawka asemblerowa

0

Witam,
Mam na studiach ćwiczenia z programowania niskopoziomowego i jest tam oczywiście ukochany asembler :)
Na szczęście wprowadzanie danych i ich wyświetlanie można realizować za pomocą c++ ale same obliczenia mają się wykonywać we wstawce asemblerowej.

Program ma za zadanie dodawać do siebie dwie macierze. Niestety podczas wykonywania programu występuje wyciek pamięci.
Sprawdzanie rejestrów za pomocą VS i wyniki wychodzą dobre.

Może ktoś ma jakiś pomysł co może być źle, może błąd jest prozaiczny typu jakaś gwiazdka za dużo lub za mało a ja po prostu już tego nie widzę ;)

Z góry dzięki za pomoc !

// MatrixAdd.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;

int** matrix_suma(int w, int k, int **tab1, int **tab2, int **tab3)
{
	__asm {
		
		//xor eax, eax; // czyszczenie rejestru;
		push eax;
		push ebx;
		push ecx;
		push edx;
		
		mov ebx, tab3;
		mov ecx, w;

	petla1:
		mov esi, tab2;
		mov esi, [esi + 4 * ecx - 4];

		mov edi, tab1;
		mov edi, [edi + 4 * ecx - 4];

		push ecx;
		push ebx;

		mov ebx, 0;
		mov ebx, k;

	petla2:
		mov eax, [esi + 4 * ecx - 4];
		mov edx, [edi + 4 * ecx - 4];
		add eax, edx;
		

		loop petla2;
		mov eax, ebx;
		pop ebx;
		pop ecx;
		mov[ebx + 4 * ecx - 4], eax;
		
		loop petla1;
		mov tab3, eax;
		
		pop edx;
		pop ecx;
		pop ebx;
		pop eax;
		


	}
	
	return tab3;
}

int main()
{
	int **tab1, **tab2, **tab3, k, w;
	cout << "Podaj liczbe wierszy tablicy: ";
	cin >> w;
	cout << "Podaj liczbe kolumn tablicy: ";
	cin >> k;
	tab1 = new int *[w];
	tab2 = new int *[w];
	tab3 = new int *[w]; //tablica wynikowa
	for (int i = 0; i < w; i++)
	{
		tab1[i] = new int[k];
		tab2[i] = new int[k];
		tab3[i] = new int[k];
	}
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			cout << "Podaj wartosc elementu [" << i << "][" << j << "] tablicy1" << endl;
			cin >> tab1[i][j];
			cout << "Podaj wartosc elementu [" << i << "][" << j << "] tablicy2" << endl;
			cin >> tab2[i][j];
		}
	}
	cout << "Suma macierzy wynosi " << endl;
	tab3 = matrix_suma(w, k, tab1, tab2, tab3);

	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			cout << tab3[i][j] << endl;
		}
	}
	delete[] tab1;
	delete[] tab2;
	delete[] tab3;
	system("PAUSE");
	return 0;
}
 
0

Policz ile razy robisz w tym programie new a ile razy robisz delete. Podpowiem że powinno być tyle samo a nie jest. Z asm nie ma to nic wspólnego. Nie umiesz napisać kodu w c++

3

Nie używaj nagich new i delete¹, to antyidiomy w C++. W tym przypadku użyj kontenerów, np. std::vector.

¹ szczególnie delete, dla new jeszcze można czasem znaleźć uzasadnienie

0

Niestety problem nie wynika chyba z alokacji pamięci w C++

Przedstawiam niżej poprawiony kod, dalej dobrze dodaje do siebie rejestry w EAX jest poprawny wynik ale kiedy próbuje go wpisać do tab3 poleceniem MOV to w debugerze po ustawieniu break pointów wyskakują na tab3 " unable to read memory "

// MatrixAdd.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;

int** matrix_suma(int w, int k, int **tab1, int **tab2, int **tab3)
{
	__asm {	
		//xor eax, eax; // czyszczenie rejestru;
		push eax;
		push ebx;
		push ecx;
		push edx;
		push esi;
		
		mov ebx, tab3;
		mov ecx, w;

	petla1:
		mov esi, tab2;
		mov esi, [esi + 4 * ecx - 4];

		mov edi, tab1;
		mov edi, [edi + 4 * ecx - 4];

		push ecx;
		push ebx;

		mov ebx, 0;
		mov ebx, k;

	petla2:
		mov eax, [esi + 4 * ecx - 4];
		mov edx, [edi + 4 * ecx - 4];
		add eax, edx;

		loop petla2;
		mov eax, ebx;
		pop ebx;
		pop ecx;
		mov[ebx + 4 * ecx - 4], eax;
		
		loop petla1;
		mov tab3, eax;
		
		pop esi;
		pop edx;
		pop ecx;
		pop ebx;
		pop eax;

	}
	return tab3;
	
}
int main()
{
	int **tab1, **tab2, **tab3, k, w;
	cout << "Podaj liczbe wierszy tablicy: ";
	cin >> w;
	cout << "Podaj liczbe kolumn tablicy: ";
	cin >> k;
	tab1 = new int *[w];
	tab2 = new int *[w];
	tab3 = new int *[w]; //tablica wynikowa
	for (int i = 0; i < w; i++)
	{
		tab1[i] = new int[k];
		tab2[i] = new int[k];
		tab3[i] = new int[k];
	}
	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			cout << "Podaj wartosc elementu [" << i << "][" << j << "] tablicy1" << endl;
			cin >> tab1[i][j];
			cout << "Podaj wartosc elementu [" << i << "][" << j << "] tablicy2" << endl;
			cin >> tab2[i][j];
		}
	}
	cout << "Suma macierzy wynosi " << endl;
	tab3 = matrix_suma(w, k, tab1, tab2, tab3);

	for (int i = 0; i < w; i++)
	{
		for (int j = 0; j < k; j++)
		{
			cout << tab3[i][j] << endl;
		}
	}
	for (int i = 0; i < w; i++)
	{
		delete[] tab1[i];
	}
	delete[] tab1;
	tab1 = NULL;

	for (int i = 0; i < w; i++)
	{
		delete[] tab2[i];
	}
	delete[] tab2;
	tab2 = NULL;

	for (int i = 0; i < w; i++)
	{
		delete[] tab3[i];
	}
	delete[] tab3;
	tab3 = NULL;
	
	system("PAUSE");
	return 0;
}
 
1

Nie no tu chyba robisz jakieś jaja sobie. Najpierw napisałeś o wycieku pamięci a teraz piszesz o ZUPEŁNIE innym problemie. Może więc dla jasności podaj :

  1. Co robisz (kroki do reprodukcji błędu)
  2. Czego się spodziewasz
  3. Co się dzieje
    Bo inaczej to się nie dogadamy...

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