Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 3 / 3
Регистрация: 05.09.2019
Сообщений: 51
1
C/C++

Определить минимум в первой половине массива и максимум во второй

25.02.2021, 11:50. Показов 1811. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет! Не могу понять, как ограничить итерации цикла на середине массива?
Задание: Определить минимум в 1 половине массива и максимум во 2.
Таким образом произвожу поиск(Язык Си):
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 <stdio.h>
#define n 6
 
int main()
{
    int masOne[n] = { 5, 2, 9, 4, 5, 6 };
    int mid = n / 2, minValue = 10, maxValue;
    printf("Massiv:\n");
    for (int i = 0; i < n; i++)
        printf("%d ", masOne[i]);
 
    __asm
    {
        lea esi, masOne; //Загружаю эффективный адрес массива
        mov ecx, n; //Счетчик размера массива
    c1:
        mov ebx, [esi]; //ebx = masOne[i]
        cmp ebx, minValue; //Сравниваю ebx с текущим минимумом(10)
        jl min; //Переход, если меньше или равно текущему минимуму
        cmp ebx, maxValue; //Сравнение 
        jg max; //Переход, если больше
        jmp increment; //Переход на метку инкремента
    min:
        mov minValue, ebx; //Перемещаю в minValue значение из ebx
        jmp increment;
 
    max:
        mov maxValue, ebx; //Перемещаю в maxValue значение из ebx
 
    increment:
        add esi, 4; //Инкремент
        loop c1; //Повтор цикла c1
        
    //chk:
    //  cmp mid, ecx; //Сравниваю ecx и середину массива
    //  jg c2; //Если > середины, то переходим на метку c2
    //c2:
    //  mov ebx, [esi]; //ebx = masOne[i]
    //  cmp ebx, -1; //Сравниваю ebx с текущим максимумом
    //  jg max; //Переход, если больше, чем текущий максимум
    //  jmp incrementc2; //Переход на метку инкремента
    //incrementc2:
    //  add esi, 4; //Инкремент
    //  loop c2; //Повтор метки c2
    }
 
    printf("\nMin: %d", minValue);
    printf("\nMax: %d", maxValue);
    _getch();
    return 0;
}
Добавлено через 2 минуты
Откровенно говоря, не до конца понимаю как работают регистры, поэтому на вопрос почему я использую счётчик "ecx" или вроде того, я не отвечу)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2021, 11:50
Ответы с готовыми решениями:

Найти максимальный элемент в первой половине массива и минимальный - во второй половине массива
Здравствуйте, помогите пожалуйста сделать программу. Задание: Дан массив А размерностью k. Найти...

В первой половине массива найти максимальный элемент, во второй половине минимальный
Дан одномерный массив размером N. Заполнить массив случайными элементами. В первой половине массива...

Выполнить реверс отдельно в первой половине и второй половине массива
Массив имеет четное число элементов,заполните массив случайными числами и выполнить реверс отдельно...

Выполнить реверс массива отдельно в первой половине и второй половине
Массив имеет четное число элементов. Заполнить массив случайными числами и выполнить реверс...

4
Модератор
Эксперт по электронике
8505 / 4360 / 1646
Регистрация: 01.02.2015
Сообщений: 13,530
Записей в блоге: 8
25.02.2021, 12:32 2
Вы сможете решить эту задачу на "C"?
1
4 / 3 / 3
Регистрация: 05.09.2019
Сообщений: 51
25.02.2021, 12:45  [ТС] 3
ФедосеевПавел, Да, конечно, но мне нужно решить её с использованием встроенного ассемблера!)

Добавлено через 8 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#define n 6
 
int main()
{
    int masOne[n] = { 5, 2, 9, 4, 5, 6 };
    int mid = n / 2, minValue = 10, maxValue = -1;
    printf("Massiv:\n");
    for (int i = 0; i < n; i++)
        printf("%d ", masOne[i]);
    for (int i = 0; i <= mid; i++)
        if (masOne[i] < minValue)
            minValue = masOne[i];
    for (int i = 4; i != n+1; i++)
        if (masOne[i] > maxValue)
            maxValue = masOne[i];
    printf("\nMin: %d", minValue);
    printf("\nMax: %d", maxValue);
    _getch();
    return 0;
}
0
Модератор
Эксперт по электронике
8505 / 4360 / 1646
Регистрация: 01.02.2015
Сообщений: 13,530
Записей в блоге: 8
25.02.2021, 12:51 4
Лучший ответ Сообщение было отмечено r00kzy_ как решение

Решение

Я к тому, что на "C" все могут решить, а как только возникает слово "ассемблер", так и ноги становятся ватными, руки дрожат и даже алгоритм решения из головы вылетает.

Ну вот и решите на своём "C":
C
1
2
3
4
min=a[0];
for(int i=1; i<n/2 ; i++)
  if(min>a[i])
    min=a[i];
Теперь отходим от индексов к указателям
C
1
2
3
4
5
6
7
8
min=a[0];
int *ptr=a;
for(i=1; i<n/2; i++)
{
  int temp=(*ptr++);
  if(min>temp)
    min=temp;
}
Assembler
1
2
3
4
5
6
7
8
9
lea esi, [a]
mov ebx, [esi]
mov ecx, [n]
shr ecx, 1
__for:
  lodsd     ;//  int temp=(*ptr++);
  cmp ebx, eax  ;//if....
  cmovg ebx, eax  ;//min=temp
loop __for
Дальше задачи будут сложнее, поэтому есть смысл взять в руки любую книжку по ассемблеру и начать читать.

Хотя можете гордиться, что не желаете учиться - ассемблер это только то, что можно скопировать с форума, там ведь больше не изучается...
1
4 / 3 / 3
Регистрация: 05.09.2019
Сообщений: 51
25.02.2021, 13:28  [ТС] 5
ФедосеевПавел, я себя не оправдываю, вы правы. Большое спасибо, за решение! Я лишь не понимал как работают итерации и как ограничить количество повторений цикла, а этот форум источник поиска информации как StackOverflow или любой другой. Я к сожалению не родился со всеми этими знаниями, есть много людей, которые даже это сделать не в состоянии, но это уже совсем другая история...
0
25.02.2021, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2021, 13:28
Помогаю со студенческими работами здесь

Найти наименьший элемент массива и определить, в какой половине массива он находится – в первой или второй
Дан линейный массив из N целых чисел (N=10). Найти наименьший элемент массива и определить, в...

Определить, в какой половине массива больше нулей - в первой или во второй
3. Определить, в какой половине массива больше нулей - в первой или во второй. использовать функцию...

В массиве найти в первой половине массива наибольший,а во второй половине-наименьший элемент и поменять их местами
В произвольном массиве A,состоящем из 60 целых чисел,принадлежащих промежутку ,найти в первой...

Определить, в какой половине массива сумма элементов больше - в первой или во второй
8. Определить, в какой половине массива сумма элементов больше - в первой или во второй....

Определить первый и второй максимум, принадлежащих первой трети массива
.определить первый и второй максимум принадлежащих перовй трети массива Добавлено через 41...

Найти максимум среди элементов первой половины массива и минимум среди второй половины массива, которые поменять местами
Люди... Как составить прогу для PascalABC? Не могу разбить массив на две половины... Ввести...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru