Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2014, 14:52   #11
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Код написал.
Alexey Smirnov вне форума Ответить с цитированием
Старый 06.06.2014, 15:06   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это хорошо. Однако чтоб не быть голословным (я бы выложил раньше, но в условиях боевых действий инет чаще пропадать стал) всетки выложу свое решение:
Код:
// ddd.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <locale>
#include <conio.h>
using namespace std;

int n=3, m=3, nMin, nMax;		// размерность матрицы

void chg(int *from, int *to){
	__asm{
		mov ecx, [m];

		mov esi, from;
		mov edi, to;

		forA:
			mov edx, [esi+ecx*4];
			mov eax, [edi+ecx*4];
			mov [edi+ecx*4],edx
			mov [esi+ecx*4],eax
		loop forA
			mov edx, [esi];
			mov eax, [edi];
			mov [edi],edx
			mov [esi],eax
	}
}

int _tmain(int argc, _TCHAR* argv[])
{

	setlocale (LC_ALL, "Russian");
	int **A = NULL;	// матрица


			A=new int *[n];	//выделение памяти под новую матрицу
			for(int i=0;i<n;i++)
				A[i]=new int[n];
			for(int j=0;j<m;j++)
				A[j]=new int[m];

			for(int i=0;i<n;i++)	//Чтение матрицы с клавиатуры
				for(int j=0;j<m;j++)
					A[i][j]=i+j;

			for(int i=0;i<n;i++)    //печать матрицы на экран
					{
						for(int j=0;j<m;j++)
							cout<<setw(5)<<A[i][j];
						cout<<endl;
					}

			__asm
			{
				mov edi,dword ptr A	 //первая строка матрицы
				mov ecx,dword ptr n	 //число строк
				mov edx,edi	 //адрес строки с минимумом

				mov esi,dword ptr [edi] //адрес первого элемента строки
				mov ebx,dword ptr [esi] //самый первый элемент

				M0:
				//найдем строку с минимумом

				push ecx
				mov esi,dword ptr [edi] //очередная строка

				mov ecx,dword ptr m	//число столбцов

				M1:

				cmp ebx,dword ptr [esi]
				jl M2                   //если меньше
				mov ebx,dword ptr [esi] //очередной элемент меньше
				mov edx,edi	 //адрес строки с минимумом

				M2:

				add esi,4	//следующий элемент строки
				loop M1
				add edi,4	 //следующая строка
				pop ecx      //извлекаем из стека число строк
				loop M0
				sub edx,dword ptr A
				shr edx,2     //сдвиг на 2 элемента вправо
				add edx, 1   //Так как отсчет начинается с нуля, то прибавляем единицу к конечному результату
				mov nMin,edx //Номер строки, где хранится минимальный элемент

							}

					__asm
					{
					mov edi,dword ptr A	 //первая строка матрицы
				mov ecx,dword ptr n	 //число строк
				mov edx,edi	 //адрес строки с максимумом

				mov esi,dword ptr [edi] //адрес первого элемента строки
				mov ebx,dword ptr [esi] //самый первый элемент

				M3:
				//найдем строку с максимумом

				push ecx
				mov esi,dword ptr [edi] //очередная строка

				mov ecx,dword ptr m	//число столбцов

				M4:

				cmp ebx,dword ptr [esi]
				jg M5                   //если больше
				mov ebx,dword ptr [esi] //очередной элемент больше
				mov edx,edi	 //адрес строки с максимумом

				M5:

				add esi,4	//следующий элемент строки
				loop M4
				add edi,4	 //следующая строка
				pop ecx      //извлекаем из стека число строк
				loop M3
				sub edx,dword ptr A
				shr edx,2    //сдвиг на 2 элемента вправо
				add edx, 1   //Так как отсчет начинается с нуля, то прибавляем единицу к конечному результату
				mov nMax,edx //Номер строки, где хранится максимальный элемент

				}

					chg(A[nMin-1],A[nMax-1]);

			cout <<"nMin= "<<nMin<<endl;
			cout <<"nMax= "<<nMax<<endl;

					for(int i=0;i<n;i++)
					{
						for(int j=0;j<m;j++)
							cout<<setw(5)<<A[i][j]; //печать на экран преобразованной матрицы
						cout<<endl;
					}

			system ("pause");
			return 0;

}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2014, 15:21   #13
Alexey Smirnov
Пользователь
 
Регистрация: 16.11.2013
Сообщений: 33
По умолчанию

Спасибо. Идея такая же, но реализация без цикла у меня. Обмен местами (индексы) макс и минимума, а далее и вся строка изменится. Код не могу выложить, так как флешку отдал
Alexey Smirnov вне форума Ответить с цитированием
Старый 06.06.2014, 19:07   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Обмен местами (индексы) макс и минимума
А-а-а... Указатели поменял )))
От хитрый
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2014, 19:08   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Обмен местами (индексы) макс и минимума
А-а-а... Указатели поменял )))
От хитрый
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В матрице поменять местами строки с max элементом и min элементом: объясните код, где какие действия выполняются (Паскаль). КонстантинКонстант Помощь студентам 0 08.01.2014 13:38
Поменять местами i-строку с j-столбцом в матрице AZelensky Помощь студентам 0 16.12.2013 20:37
В целочисленной квадратной матрице наибольший элемент каждой строки поменять местами с элементом главной диагонали DesignGenius C# (си шарп) 0 18.10.2011 20:22
В матрице А поменять местами две строки с заданными номерами dimegusew Помощь студентам 0 11.05.2011 20:02
Задача на СИ в заданной матрице поменять местами первую строку и первый столбец %( defol-777 Помощь студентам 2 14.01.2009 09:59