Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
46 / 38 / 15
Регистрация: 28.09.2012
Сообщений: 818
1

Ассемблерная вставка. Найти минимальный и максимальный элементы в массиве и их сумму

12.12.2014, 03:06. Показов 3597. Ответов 5
Метки нет (Все метки)

как мне переделать на то что бы находило минимальный елемент и максимальный, с массива и узнать суму его.
Что то вобще с условиями в асемблере не розобрался))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    int max, max2, multiplication;
    int a[10] = { 6, 3, 4, -2, -14, -8, 7, 8, -2, 24 };
    _asm
    {
        ; max element one
            lea esi, a
            mov ebx, dword ptr[esi]
            mov ecx, 10
        M1:
        lodsd
            cmp eax, ebx
            jle M2
            mov ebx, eax
        M2 :
        loop M1
            mov max, ebx
 
            lea esi, a
            mov ebx, dword ptr[esi]
            mov ecx, 10
        M3:
        lodsd
            cmp eax, ebx
            jle M4
            cmp eax, max
            je M4
            mov ebx, eax
        M4 :
        loop M3
            mov max2, ebx
            imul ebx, max
            mov multiplication, ebx
    }
    cout << "Max 1 : " << max << " Max 2 : " << max2 << endl;
    cout << multiplication;
}
Добавлено через 1 час 1 минуту
ех

Добавлено через 36 минут
Есть кто живой?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2014, 03:06
Ответы с готовыми решениями:

В двухмерном массиве найти максимальный и минимальный элементы и их координаты в массиве
&quot;В двухмерном массиве, размещенном в куче и заполненном случайными вещественными значениями,...

Найти в массиве максимальный и минимальный элементы в массиве и их количество
Помогите, пожалуйста, начал осваивать c++...Не могу справиться с такой задачей: Написать...

Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого диапазона, не встречающихся в данном массиве
Найти в массиве минимальный и максимальный элементы. Вывести последовательность значений из этого...

Найти в массиве максимальный и минимальный элементы и поменять их местами
Помогите разобраться Дан массив целых чисел. Найти в нем максимальный и минимальный элементы и...

5
1 / 1 / 1
Регистрация: 20.10.2013
Сообщений: 13
12.12.2014, 04:42 2
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "stdafx.h"
#include <iostream>
#define SIZE 10
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int arr[10] = { 6, 1, 0, 9, 1, 5, 1, 3, 9, 2 };
    cout << "You enter: ";
    for (int i = 0; i < SIZE; i++)
        cout << arr[i] << "|";
    cout << endl;
    int res = 0;
    __asm
    {
            
            mov edx, arr                       //                edx == arr
            mov esi, 0h                        //                esi == i = 0, i - счетчик для массива
            mov eax, dword ptr[arr + esi]      //                eax == min = arr[0]
            mov edi, eax                       //                ecx == min2 = arr[0
            mov cx, 0                          //                cx  === k = 0            
        cikl :                                 //                Основной блок
        cmp cx, SIZE                           //                  while (k<N)
            jge the_end                        //                  {
            cmp dword ptr[arr + esi], eax      //                     if (arr[i]<=min)
              jle ifblock                      //                        {
                                               //                            Переходим в ifblock
                                               //                        }
            cmp dword ptr[arr + esi], edi      //                     else if (arr[i]<=min2)
            jle elseblock                      //                        {
                                               //                            Переходим в elseblock
                                               //                        }
            add esi, 4h                        //                       k++
            inc cx                             //                       i++
            add edx, 4                         //                       ...
            jmp cikl                           //                   }
                                               //                       ...
            elseblock :                        //                      else if (arr[i]<=min2)
                 mov edi, dword ptr[arr + esi] //                          min = arr[i] 
                 add esi, 4h                   //                          k++
                 inc cx                        //                          i++
                 add edx, 4                    //                       ...
                 jmp cikl                      //                  Возвращаемся в основной блок
                                               //                       ...
            ifblock:                           //                      if (arr[i]<=min){
                 mov edi, eax                  //                         min2 = min
                 mov eax, dword ptr[arr + esi] //                         min = arr[i] }
                 add esi, 4h                   //                      k++
                 inc cx                        //                      i++
                 add edx, 4                    //                       ...
                 jmp cikl                      //                  Возвращаемся в основной блок
        the_end :                              //                  Цикл закончился
            add eax, edi                       // сумма
            mov res, eax                       // копируем в переменную
    }
    cout << "Result: " << res << endl;
    system("PAUSE");
    return 0;
}
Вот я писал лабу, для нахождения суммы двух минимальных элементов. Поменяй немножко алгоритм для находжения минимального и максимального
1
46 / 38 / 15
Регистрация: 28.09.2012
Сообщений: 818
12.12.2014, 05:49  [ТС] 3
Цитата Сообщение от Looter Посмотреть сообщение
Вот я писал лабу, для нахождения суммы двух минимальных элементов. Поменяй немножко алгоритм для находжения минимального и максимального
Спасибо) Ну я даже не шарю где тут условия и как нам проверять ли число больше или меньше от текущего в массиве
0
46 / 38 / 15
Регистрация: 28.09.2012
Сообщений: 818
14.12.2014, 02:55  [ТС] 4
Цитата Сообщение от Looter Посмотреть сообщение
Вот я писал лабу, для нахождения суммы двух минимальных элементов. Поменяй немножко алгоритм для находжения минимального и максимального
Не подскажешь где мне поменять? что бы искало минимум а потом максимум?(
Совсем не шарю
0
35 / 17 / 10
Регистрация: 13.12.2014
Сообщений: 107
14.12.2014, 04:23 5
Лучший ответ Сообщение было отмечено Lynatik001 как решение

Решение

Вот твой код с комментариями:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
int main()
{
    int max, max2, multiplication;
    int a[10] = { 6, 3, 4, -2, -14, -8, 7, 8, -2, 24 };
    _asm
    {
        ; max element one
//---эта часть - поиск максимума---
            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  //сравниваешь содержимое двух регистров
            jle M4  //условный переход: переходить если первый регистр (EAX) <= второму регистру (EBX)
            cmp eax, max  //сравниваешь EAX с уже найденным максимумом
            je M4  //условный переход: переходить если равны
            mov ebx, eax  //сохраняешь большее значение из регистра EAX в регистре EBX
        M4 :
        loop M3
            mov max2, ebx  //сохраняем второй найденный максимум в переменной max2
//---эта часть - поиск второго максимума, неравного первому---
 
            imul ebx, max //умножение двух максимумов
            mov multiplication, ebx  //сохранение произведения в переменной multiplication
    }
    cout << "Max 1 : " << max << " Max 2 : " << max2 << endl;
    cout << multiplication;
}
Добавлено через 12 минут
Его нужно изменить следующим образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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;
}
0
46 / 38 / 15
Регистрация: 28.09.2012
Сообщений: 818
14.12.2014, 13:22  [ТС] 6
Цитата Сообщение от AleksRazgul Посмотреть сообщение
Его нужно изменить следующим образом:
Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2014, 13:22

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Найти в массиве минимальный и максимальный элементы и поменять их местами
Помогите пожалуйста, пришёл с армии восстановился забыл многое Найти в массиве G минимальный и ...

Найти максимальный и минимальный элементы массива и их сумму.
Дан массив х(10).найти максимальный и минимальный элементы массива и их сумму.

Найти минимальный и максимальный элементы заданного массива; найти сумму всех элементов
Дано массив a, найти минимальный и максимальный элемент массива, суму всех элементов массива,...

Найти минимальный и максимальный элементы в массиве, поменять их местами (код не всегда работает)
Найти мини и максим элементы в массиве, поменять их местами меняет не всегда, работает в небольших...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.