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;
}