Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42

Разделить массив на две части, поместив в первую элементы, большие среднего арифметического (ассемблерная вставка в C++)

17.10.2010, 15:19. Показов 7036. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую,нужен направляющий пинок по решению задачки)
задача в следующем
Разделить массив на две части, поместив в первую эле-менты, большие среднего арифметического их суммы, а во вторую - меньшие (части не сортировать).Обязательно использовать адресную арифметику

На языке высокого уровня естественно пишется за 5 строк кода,но тут надо на асме.

то есть есть метод,в который я передаю массив,предварительно введенный пользователем. далее начинается вставка и вот тут загвоздка. как в асме создать массив и крутить-вертеть его элементами?

Добавлено через 4 часа 15 минут
пока получилось вот что,а вот как дальше работать с элементами - не знаю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
void task1(){
    int arr[500];
    int len;
    cout << "Enter array's length" << endl;
    cin >> len;
    cout << "Enter the elements" << endl;
    for(int i = 0; i < len; ++i)
        cin >> arr[i];
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
   __asm{
        mov ecx,len
        xor eax,eax
        xor ebx,ebx
 
cycle1: 
        add eax,arr[ebx]
        add ebx,4
        loop cycle1;
 
        idiv eax,ecx
}
Добавлено через 29 минут
вот ,написал вроде бы логичный код на асме,но вот только не пашет он)

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
__asm{
        mov ecx,len //длинну храним в ecx
        xor eax,eax //обнуление регистров eax,ebx
        xor ebx,ebx
 
cycle1: 
        add eax,arr[ebx] //накапливаем сумму в eax
        add ebx,4 //увеличиваем счетчик
        loop cycle1;
 
        idiv eax,ecx
        mov edx,eax //помещаем среднее арифметическое в edx
cycle2:
        xor ebx,ebx
        mov eax,arr[ebx] 
        add ebx,4
        cmp eax,edx //сравниваем ср.арифм. и текущий элемент
 
        JG    point1 // если текущий элемент больше идем на метку 1
        JLE point2 // если текущий элемент меньше идем на метку 2
endcycle2:
        loop cycle2
 
        jmp quit
point1:
        mov narr[k1],eax //помещаем элемент в левую половину массива
        inc(k1) //смещаем индекс свободной позиции слева
        jmp endcycle2
point2:
        mov narr[k2],eax // помещаем элемент в правую половину массива
        dec(k2) // смещаем индекс свободной позиции спарава
        jmp endcycle2
 
quit:
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2010, 15:19
Ответы с готовыми решениями:

Разделить массив на две части,поместив в первую элементы,большие среднего арифметического массива, а во вторую-меньшие
Объясните пожалуйста,что не так,короче,задачу решил решать так:сначала создам массив,где элементы больше чем среднее арфм,потом сделаю...

Преобразовать массив так: в первой части элементы меньше среднего арифметического, а во второй части – элементы больше
Заполнить одномерный массив из N элементов случайными целыми числами. Преобразовать его в массив, в первой части которого будут элементы...

Выбрать элементы большие среднего арифметического и упорядочить получившийся массив по убыванию
Как можно заменить строчки с 8 по 12? Дан массив x1, x2,..., x20. Выбрать элементы большие среднего арифметического и упорядочить...

29
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
18.10.2010, 13:52  [ТС]
Студворк — интернет-сервис помощи студентам
вот что накатал,но вместо кодов втыкает = или >

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
        mov esi, [s]
        mov edi, [s2]
        mov ecx, n
cycle:
        lodsb
        cmp al,'A'
        jge cmp1
        jl notliteral
cont:
        loop cycle
        jmp quit
notliteral:
        stosb
        
        jmp cont
 
cmp1:
        cmp al,'Z'
        jle chg
        jg cmp2
        
cmp2:
        cmp al,'z'
        jle cmp3
        jg notliteral
 
cmp3:
        cmp al,'a'
        jge chg
        jl notliteral
chg:
        mov bl,al
        rol al,4
        and al,0Fh
        add al,'A'-10
        stosb
        mov al,' '
        stosb
        jmp cont
quit:
        mov al,0
        stosb
    }
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
18.10.2010, 14:11
честно говоря не понял алгоритм перевода. Он ведь в строчках
Assembler
1
2
3
rol al,4
and al,0Fh
add al,'A'-10
что вы хотели тут получить?
0
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
18.10.2010, 14:34  [ТС]
Assembler
1
2
3
4
5
6
7
rol al,4
        and al,0Fh
        cmp al,10
        jl less
        add al,'A'-10
less:
    add al,30h
Берем страшие 4 бита и переводим их в значение аски кода,или нет ?

Добавлено через 11 минут
вот,работает как надо вроде бы
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
60
61
62
63
64
65
66
    __asm{
        mov esi, [s]
        mov edi, [s2]
        mov ecx, n
cycle:
        lodsb
        cmp al,'A'
        jge cmp1
        jl notliteral
cont:
        loop cycle
        jmp quit
notliteral:
        stosb
        jmp cont
 
cmp1:
        cmp al,'Z'
        jle chg
        jg cmp2
        
cmp2:
        cmp al,'z'
        jle cmp3
        jg notliteral
 
cmp3:
        cmp al,'a'
        jge chg
        jl notliteral
chg:
          mov bl,al
          rol al,4
          and al,0Fh
          cmp al,10
          jl less1
          add al,'A'-10
          jmp next1
less1:
          add al,30h
next1:
          stosb
          mov al,bl
          and al,0Fh
          cmp al,10
          jl less2
          add al,'A'-10
          jmp next2
less2:
          add al,30h
next2:
          stosb
          mov al,' '
          stosb
          loop cycle
quit:
        mov al,0
        stosb
        
    }
 
 
 
        
    cout<<s2<<endl;
}
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
18.10.2010, 14:36
ага - так лучше. Надо в шестнадцатиричной вывести?
1
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
18.10.2010, 14:38  [ТС]
ну как бы в задании не сказано, я сделал в 16ричной,чтоб по 2 цифры на код
0
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
19.10.2010, 19:39  [ТС]
помогите ,пожалуйста еще с одним вопросом

нужно найти минимальный и максимальный элемент массива
мой код работает нормально,если только мин только не стоит на последней позиции,или наоборот мах на 1ой. видимо с индексацией ошибка,но вот где,отдебажить не могу

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
        xor ecx,ecx//обнуление регистров
        xor ebx,ebx //будем хранить минимальное значение тут
        xor eax,eax //будем хранить максимальное значение тут
        xor edx,edx
        mov ecx,n
        mov esi,[arr]
        mov ebx,[esi] //помещаем в еах первый элемент,по умолчанию минимум
        
        
cyclemin:
        cmp ebx,[esi] //сравниваем минимум и текущий элемени
        JG mini // если минимум > текущего элемента - переходим по метке
        add esi,4
        loop cyclemin
        jmp nxt
mini:
        xor ebx,ebx
        mov ebx,[esi] //помещаем новый минимум в еах
        add esi,4
        dec ecx
        jmp cyclemin
 
        xor edx,edx
 
 
nxt:
 
        mov ecx,n
        mov esi,[arr]
        mov eax,[esi]
 
        
cyclemax:
        cmp eax,[esi] //сравниваем максимум и текущий элемени
        JL maxi // если максимум < текущего элемента - переходим по метке
        add esi,4
        loop cyclemax
        jmp cycle
maxi:
        
        xor eax,eax
        mov eax,[esi] //помещаем новый максимум в ebx
        add esi,4
        dec ecx
        jmp cyclemax
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
20.10.2010, 08:59
по моему все можно сделать проще
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
void minmax(int *arr, int n, int &min, int &max)
{
    __asm
    {
//        xor ebx,ebx //будем хранить минимальное значение тут
//        xor edx,edx //будем хранить максимальное значение тут
        mov ecx, n
        mov esi, [arr]
        mov edx, [esi]
        mov ebx, edx
cycle:
        lodsd
        cmp eax, edx
        ja _max
        cmp eax, ebx
        jb _min
_inc:
        loop cycle
        jmp _q
_max:
        mov edx, eax
        jmp _inc
_min:
        mov ebx, eax
        jmp _inc
_q:
        mov eax, min
        mov [eax], ebx
        mov eax, max
        mov [eax], edx
    }
}
 
int main()
{
    int mas[5];
    mas[0]=2; mas[1]=5; mas[2]=12; mas[3]=10; mas[4]=17;
    int min, max;
    minmax(mas, 5, min, max);
    return 0;
}
тока правильно будет работать при unsigned int- со знаковыми немного переделать
1
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
20.10.2010, 12:57  [ТС]
спасибо,а без цепочечных команд возможно реализовать это,используя только адресную арифметику?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
20.10.2010, 13:12
ну lodsb заменить на
mov eax, dword ptr [esi]
add esi, 4

Добавлено через 19 секунд
lodsd то есть
1
2 / 2 / 1
Регистрация: 04.12.2008
Сообщений: 42
20.10.2010, 13:23  [ТС]
да,именно так и сделал) спсибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2010, 13:23

Выбрать элементы массива, большие среднего арифметического, и упорядочить получившийся массив по убыванию
Дан массив x1, x2,..., x20. Выбрать элементы большие среднего арифметического и упорядочить получившийся массив по убыванию. Использовать...

Выбрать элементы массива, большие среднего арифметического, и упорядочить получившийся массив по убыванию
Дан массив x1, x2,..., x20. Выбрать элементы большие среднего арифметического и упорядочить получившийся массив по убыванию. Использовать...

Все элементы, большие среднего арифметического значения MAX и MIN элементов перенести в другой массив
Задание №1 В одномерном массиве найти максимальный (MAX) и минимальный (MIN) элементы. Все элементы, большие среднего арифметического...

Дан массив, состоящий из N элементов.Обнулить все элементы, большие среднего арифметического всех элементов массива
Дан массив, состоящий из N элементов. Обнулить все элементы, большие среднего арифметического всех элементов массива.

В массиве заменить все элементы большие 7 на 7 и посчитать их количество (ассемблерная вставка в delphi)
Есть код на фасме задачки : В массиве заменить все элемента большие 7 на 7 и посчитать их кол-во. Не могу понять как в delphi занести адрес...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru