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

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

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

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

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2017, 20:47   #1
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию Поиск минимального значения (C++ и Ассемблер)

Помогите найти минимальное значение
На вход идет массив цифр из 5 эл-тов , нужно найти max в ассемблере и вывести в C++
Код:
int _tmain(int argc, _TCHAR* argv[])
{
	
	signed short int mas[5]= {1,7,0,2,3};
	signed short int min = mas[0];
	signed short int max = mas[0];
	cout <<min<<endl;
	_asm{ 
		Mov ecx,5
	    lea edx,mas[0]
		lea ebx,min
oncemore:
		Mov eax,[edx]
		//
		cmp eax, ebx ; если меньше максимального
        Mov ebx,eax 
		//
		Add edx,4
		Loop oncemore
	}
	cout <<min;
	
	int q;
	cin  >> q;
	return 0;
}
Вот что есть на данный момент , мин не ищет
sham63 вне форума Ответить с цитированием
Старый 22.03.2017, 22:07   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Зачем тебе "max"?

У тебя пример для "max", а ты пытаешься сделать для "min"?
(покажи оригинал - пример).

а ещё, распиши, что делаешь в каждой строчке...
А то я ассемблер не знаю, но поправить попробую...
ura_111 вне форума Ответить с цитированием
Старый 22.03.2017, 22:15   #3
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Зачем тебе "max"?

У тебя пример для "max", а ты пытаешься сделать для "min"?
(покажи оригинал - пример).

а ещё, распиши, что делаешь в каждой строчке...
А то я ассемблер не знаю, но поправить попробую...
Ну max это для второй задачи , не столь важно какие имена
Нужно найти максимум и минимум в массиве чисел , именно в ассемблере.
Массив задаем в C++
Далее вставка ассемблера
Далее на выход две переменные в C++ (Максимум и минимум )
sham63 вне форума Ответить с цитированием
Старый 22.03.2017, 22:18   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я имел ввиду распиши, что ты делаешь в каждой строчке:

Код:
		Mov ecx,5
	    lea edx,mas[0]
		lea ebx,min
oncemore:
		Mov eax,[edx]
		//
		cmp eax, ebx ; если меньше максимального
        Mov ebx,eax 
		//
		Add edx,4
		Loop oncemore
(желательно в контексте решения, или хотя бы что означают).

это ты писал?
ura_111 вне форума Ответить с цитированием
Старый 22.03.2017, 22:20   #5
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Я имел ввиду распиши, что ты делаешь в каждой строчке:

Код:
		Mov ecx,5
	    lea edx,mas[0]
		lea ebx,min
oncemore:
		Mov eax,[edx]
		//
		cmp eax, ebx ; если меньше максимального
        Mov ebx,eax 
		//
		Add edx,4
		Loop oncemore
(желательно в контексте решения, или хотя бы что означают).

это ты писал?
Да , но дело в том что я сам толком не знаю

Сначала заносим в регистры адреса первого эл-та массива и минимальное значение
Код:
lea eax,mas[0]
		lea ebx,min
	    Mov ecx,5 ; кол -во циклов
Далее как то в цикле нужно пробежаться , но как я не знаю. Задача очень простая для тех кто шарит в Ассемблере
sham63 вне форума Ответить с цитированием
Старый 22.03.2017, 23:02   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 470
По умолчанию

Сколько бит в signed short int и сколько в ebx?
Почему в min запись один раз до цикла? Sorry - ваще нет записи в min!!!
FPaul на форуме Ответить с цитированием
Старый 22.03.2017, 23:07   #7
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:22.
ura_111 вне форума Ответить с цитированием
Старый 22.03.2017, 23:13   #8
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от FPaul Посмотреть сообщение
Сколько бит в signed short int и сколько в ebx?
Почему в min запись один раз до цикла? Sorry - ваще нет записи в min!!!
На сколько я знаю signed short int - 16 бит
sham63 вне форума Ответить с цитированием
Старый 22.03.2017, 23:34   #9
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:23.
ura_111 вне форума Ответить с цитированием
Старый 23.03.2017, 00:01   #10
sham63
 
Регистрация: 22.03.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Ты знаешь как получить доступ к элементу массива?
Вот это:
Код:
lea edx, mas[0]
только к 1-му элементу, а дальше?
Разве тут не адрес массива записывается ?
sham63 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 85 тыс рублей в месяц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск предыдущего минимального значения от задаваемой даты 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