elizabethezova
@elizabethezova

Как поменять местами первую строчку и столбец матрицы в ассемблере?

Здравствуйте! Проблема такая: Задали задание, нужно написать программу, в которой главный модуль находится в языке С С++, а дополнительный модуль в языке Ассемблера. Программа обязательно должна состоять из 2 раздельный файлов, т.е Нельзя встроить код ассемблера в код С++. Из главного модуля передаю количество элементов матрицы, и указатель на первый елемент матрицы.

В ассемблере нужно: поменять местами элементы первого столбца и первой строчки в матрице, если сумма первого столбца = сумме первой строки.

Код написанный на С++:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <conio.h>

//extern "C" void asm_proc(int **a, int, int); // описание прототипа ASM-подпрограммы
using namespace std;

void Input(int** a, int n);
void Output(int** a, int n);
void Delete(int** a, int n);
void Obm (int** a, int n);
int main()
{
	setlocale(LC_ALL, "russian");
	srand(time(0)); // генерация случайных чисел
	int** a = new int* [3]; // 3 строки в массиве
	for (int count = 0; count < 3; count++)
		a[count]= new int[3]; // и 3 столбцов
	cout << "Задание: Если сумма элементов первой строки = сумме элементов первого столбца, " << endl << "обмнять элементы первой строки с элементами первого столбца " << endl<<endl;
	cout << "Введите элементы массива: " << endl;
	Input(a, 3);
	//asm_proc(a, 3);
	Obm(a, 3);
	cout << "Массив после оброботки: " << endl;
	Output(a,3);
	Delete(a, 3);
	getchar(); getchar();
	return 0;
}
void Obm(int** a, int n)
{
	int str = 0, stb = 0, d, i= 0, j =0;
va: 
		str += a[0][i];
		stb += a[i][0];
		i++;
		if (i != n)
			goto va;

	if (str == stb)
	{
vb:		
			d = a[0][j];
			a[0][j] = a[j][0];
			a[j][0] = d;
			j++;
			if (j != n)
				goto vb;
	}
}
void Input(int **a, int n)//функция заполнения массива с входными параметрами: массив и ограничение
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			cin >> a[i][j] ; // заполняем случайными числами
	}
}
void Output(int** a, int n)//функция вывода массива в консоль
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			cout << a[i][j] << "\t";//потоковый вывод
		cout << endl;//переход на следующую строку
	}
}
void Delete(int** a, int n)
{
	for (int i = 0; i < n; i++)
		delete[]a[i];
}


Помогите, пожалуйста написать код на Ассемблере. Что-то начала писать, но не знаю как должно это выглядеть и запуталась:
.586
.model flat, stdcall
option   casemap  :  none    
 
.data
 
A   dd  1,2,3,11,12,13,21,22,23
len_str  dd 0       
n_str   dd 3        
n_colum   dd 3      
 
.code
start:
 
mov eax,n_colum
shl eax,2
mov len_str,eax     
 
Xor esi,esi
Mov ecx,n_str           
    m2: Xor edi,edi
        Push ecx
        Mov ecx,   n_colum         
    m1: Mov eax,   A[esi][edi*4]    
        Inc edi             
        Loop  m1            
        add  esi,len_str            
                 
        Pop ecx         
        Dec ecx
        Jnz m2              
    end start


Или хотя бы напишете как должно выглядеть передача массива с С++ в ассемблер и возврат обратно отредактированного. Обработку напишу сама
  • Вопрос задан
  • 1482 просмотра
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Вместо ассемблера пишите сначала код на Си. Потом избавляетесь от циклов и переписываете их на goto. И вот уже потом переносите его в асм.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы