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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2017, 00:15   #11
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

В интернете нашёл:

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;


int main()
{
	int max, min, summa; //ИЗМЕНЕНО: вместо max2, переменная min; вместо multiplication, переменная summa
	int a[10] = { 6, 3, 4, -2, -14, -8, 7, 8, -2, 24 };
	_asm
	{
		; max element one
			cld  //ДОБАВЛЕНО: для установки направления поиска от меньшего адреса к большему
			//в твоем примере из-за отсутствия этой строки могли быть ошибки при исполнении

			//---эта часть - поиск максимума---
			lea esi, a //записываешь адрес массива в регистра ESI
			mov ebx, dword ptr[esi]  //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
			mov ecx, 10 //записываешь значение 10 (количество элементов массива) в регистр ECX
		M1:
		lodsd  //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
			cmp eax, ebx  //сравниваешь содержимое двух регистров
			jle M2  //условный переход: переходить если первый регистр (EAX) <= второму регистру (EBX)
			mov ebx, eax //сохраняешь большее значение из регистра EAX в регистре EBX
		M2 :
		loop M1 //цикл: уменьшение ECX на 1, переход на метку M1 если ECX не равен нулю
			mov max, ebx //сохраняем найденный максимум в переменной max
			//---эта часть - поиск максимума---

			//---эта часть - поиск минимума---
			lea esi, a  //записываешь адрес массива в регистра ESI
			mov ebx, dword ptr[esi]  //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
			mov ecx, 10  //записываешь значение 10 (количество элементов массива) в регистр ECX
		M3:
		lodsd  //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
			cmp eax, ebx  //сравниваешь содержимое двух регистров
			jge M4  //ИЗМЕНЕНО: условный переход: переходить если первый регистр (EAX) >= второму регистру (EBX)
			//            cmp eax, max  //УДАЛИТЬ
			//            je M4  //УДАЛИТЬ
			mov ebx, eax  //сохраняешь меньшее значение из регистра EAX в регистре EBX
		M4 :
		loop M3 //цикл: уменьшение ECX на 1, переход на метку M3 если ECX не равен нулю
			mov min, ebx  //ИЗМЕНИТЬ: сохраняем минимум в переменной min
			//---эта часть - поиск минимума---

			add ebx, max //ИЗМЕНИТЬ: операция сложения в EBX сейчас минимум прибавляем max
			mov summa, ebx  //ИЗМЕНИТЬ: сохранение сумм в переменной summa
	}
	cout << "Max: " << max << " Min : " << min << endl;
	cout << "Summa: " << summa;

	cin >> max; // чтобы консоль не закрывалась
	return 0;
}
ты сможешь его переделать под себя.
Расскажи отличия (для начала) в задании... Я видел там сумма ещё расчитывается, а тебе не надо... А в типах другие или пройдут.

Пиши, что думаешь.
ura_111 вне форума Ответить с цитированием
Старый 23.03.2017, 00:24   #12
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот вроде забацал (используя пример с интернета):

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int max, min; //ИЗМЕНЕНО: вместо max2, переменная min; вместо multiplication, переменная summa
	int a[5] = { 1, 7, 0, 2, 3};
	_asm
	{
		; max element one
			cld  //ДОБАВЛЕНО: для установки направления поиска от меньшего адреса к большему
			//в твоем примере из-за отсутствия этой строки могли быть ошибки при исполнении

			//---эта часть - поиск максимума---
			lea esi, a //записываешь адрес массива в регистра ESI
			mov ebx, dword ptr[esi]  //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
			mov ecx, 5 //записываешь значение 10 (количество элементов массива) в регистр ECX
		M1:
		lodsd  //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
			cmp eax, ebx  //сравниваешь содержимое двух регистров
			jle M2  //условный переход: переходить если первый регистр (EAX) <= второму регистру (EBX)
			mov ebx, eax //сохраняешь большее значение из регистра EAX в регистре EBX
		M2 :
		loop M1 //цикл: уменьшение ECX на 1, переход на метку M1 если ECX не равен нулю
			mov max, ebx //сохраняем найденный максимум в переменной max
			//---эта часть - поиск максимума---

			//---эта часть - поиск минимума---
			lea esi, a  //записываешь адрес массива в регистра ESI
			mov ebx, dword ptr[esi]  //читаешь значение по адресу указываемому регистром ESI, в регистр EBX
			mov ecx, 5  //записываешь значение 10 (количество элементов массива) в регистр ECX
		M3:
		lodsd  //читаем значение по указываемому регистром ESI, в регистр EAX, и увеличиваем ESI на 4
			cmp eax, ebx  //сравниваешь содержимое двух регистров
			jge M4  //ИЗМЕНЕНО: условный переход: переходить если первый регистр (EAX) >= второму регистру (EBX)
			//            cmp eax, max  //УДАЛИТЬ
			//            je M4  //УДАЛИТЬ
			mov ebx, eax  //сохраняешь меньшее значение из регистра EAX в регистре EBX
		M4 :
		loop M3 //цикл: уменьшение ECX на 1, переход на метку M3 если ECX не равен нулю
			mov min, ebx  //ИЗМЕНИТЬ: сохраняем минимум в переменной min
			//---эта часть - поиск минимума---
	}
	cout << "Max: " << max << " Min : " << min << endl;

	cin >> max; // чтобы консоль не закрывалась
	return 0;
}
ura_111 вне форума Ответить с цитированием
Старый 23.03.2017, 00:26   #13
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Скажи ты понимаешь, что там написано?
Например есть ключевые слова, которые у тебя нету. Например:
Код:
 dword
тип массива другой
lodsd 
cld
Может быть надо искать замену?

Последний раз редактировалось ura_111; 23.03.2017 в 00:31.
ura_111 вне форума Ответить с цитированием
Старый 23.03.2017, 00:37   #14
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Ещё не понятно, как быть без знаковыми и с знаковыми числами...
Где-то мелькнуло, что это чуть-чуть отличается...
ura_111 вне форума Ответить с цитированием
Старый 23.03.2017, 05:40   #15
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Поиск минимального..
Элементы массива размером DWORD (32-бит):
Код:
_asm { 
      mov   ecx,5          ; ЕСХ = всего элементов
      lea   esi,mas        ; ESI = адрес массива
      mov   ebx,[esi]      ; EBX = первый элемент
find: lodsd                ; ЕАХ = очередной элемент массива
      cmp   eax,ebx        ; сравниваем..
      jae   miss           ; переход, если больше
      xchg  ebx,eax        ; иначе: обменять местами
miss: Loop  find           ; промотать ЕСХ-раз..
      mov   [min],ebx      ; запомнить мин. в переменной
     }
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.03.2017, 08:52   #16
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

Примажусь к славе. Только будет lea esi,a

Код:
#include "stdafx.h"
#include <iostream>

int main()
{
	int max, min;
	int a[5] = { 11, 7, 5, 2, 3 };
	_asm
	{
		mov   ecx, 5 // ЕСХ = всего элементов
		lea   esi, a // ESI = адрес массива
		mov   ebx, [esi]// EBX = первый элемент
		find : lodsd // ЕАХ = очередной элемент массива
			   cmp   eax, ebx // сравниваем..
			   jae   miss // переход, если больше
			   xchg  ebx, eax //иначе: обменять местами
			   miss : Loop  find // промотать ЕСХ - раз..
					  mov [min], ebx // запомнить мин.в переменной
	}
	std::cout << "Min. element = " << min << std::endl;
	system("pause");
}
Мановар вне форума Ответить с цитированием
Старый 23.03.2017, 09:08   #17
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Мановар, значит работает это? Ато я набросал не тестируя..
sham63, чтобы найти не мин., а макс. - измени JAE на JBE
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.03.2017, 09:54   #18
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

Работает. Да и пример из интернета рабочий. Только у тебя надо jae на jge заменить, чтобы с отрицательными числами в массиве можно было работать. А то так не прокатывает.

Последний раз редактировалось Мановар; 23.03.2017 в 10:01.
Мановар вне форума Ответить с цитированием
Старый 23.03.2017, 11:14   #19
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

На счёт отрицательных - согласен, только это уже пусть ТС уточняет задание, т.к. в этом случае порог максимального числа уменьшится вдвое: с 0хFFFFFFFF до 0х80000000
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.03.2017, 13:21   #20
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
Мановар, значит работает это? Ато я набросал не тестируя..
sham63, чтобы найти не мин., а макс. - измени JAE на JBE
А для максимума вот так ?
Код:
	_asm
	{
		mov   ecx, 5 // ЕСХ = всего элементов
		lea   esi, a // ESI = адрес массива
		mov   ebx, [esi]// EBX = первый элемент
		find : lodsd // ЕАХ = очередной элемент массива
			   cmp   eax, ebx // сравниваем..
			   jbe   miss // переход, если больше
			   xchg  ebx, eax //иначе: обменять местамиs
			   miss : Loop  find // промотать ЕСХ - раз..
					  mov [max], ebx // запомнить мин.в переменной
	}
sham63 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск предыдущего минимального значения от задаваемой даты Klevin081085 Microsoft Office Excel 1 19.04.2015 13:14
Поиск минимального значения и замена Artem_85 Microsoft Office Excel 15 09.01.2013 16:54
(Псевдо)Рандомный массив и поиск минимального значения в нем Zero&One Помощь студентам 0 30.09.2011 15:39
Поиск максимального и минимального значения в массиве WIN32APIist Общие вопросы C/C++ 5 28.12.2010 00:24
поиск ближайшего минимального значения на sql nuevegramodelamor Помощь студентам 7 11.05.2010 20:21