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

Шейкерная сортировка (C++ с asm-вставками)

21.06.2013, 12:39. Показов 1728. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <iostream>
int* CreateDynMas (int size,int range_min,int range_max)
{ 
 
    int* Mas; 
    int rand100;
    Mas=new int[size];
    if (Mas!=NULL)
        {
            srand((unsigned)time(NULL));
            for (int i=0;i<size;i++)
                {
                rand100 = (double) rand() / (RAND_MAX+1) * (range_max - range_min) + range_min;
                Mas[i]=rand100;
                }
        }
    return Mas;
}
bool Order (int *Array, int n)
{
    for (int i=0; i<n-1; i++)
    {
        if (Array[i]>Array[i+1])
            return false;
    }
    return true;
}
void DirectInsertion(int *Array, int n)
{   
    _asm
    {
        mov eax,n
            add eax,eax
            add eax,eax//L
            dec eax
            dec eax
            dec eax
            dec eax
            mov esi,eax // Rt
            mov edx,0 // R
            mov ecx,0 //Lt
            mov ebx,Array
            
m1:     cmp edx,esi
            JE m12
            cmp eax,ecx          //while
            JE m12
            JMP m3
 
m3:     mov edi,ecx///edi=i i=Lt
            mov edx,esi //R=Rt
            JMP m4
 
m4:     cmp edi,edx // i<R
            JL m5
            JMP m7
 
m5:     mov ebp,[ebx+edi]   
            mov esp,[ebx+edi+4]
            cmp ebp,esp
            JG m6
            add edi,4
            JMP m4
 
m6:     mov [ebx+edi+4],ebp
            mov [ebx+edi],esp
            mov esi,edi      //Rt=i
            add edi,4
            JMP m4
 
m7:     cmp edx,esi //R!=r
            JNE m8
            JNP m1          
 
m8:     mov edi,esi //i=Rt  
            mov eax,ecx //L=Lt
            JNP m9
 
m9:     cmp edi,eax //i<L
            JG m10
            JMP m1
                    
m10:    mov ebp,[ebx+edi]
            mov esp,[ebx+edi-4]
            cmp ebp,esp
            JL m11
            dec edi
            dec edi
            dec edi
            dec edi
            JMP m9
 
m11:    mov [ebx+edi-4],ebp
            mov [ebx+edi],esp
            mov ecx,edi
            dec edi
            dec edi
            dec edi
            dec edi
            JMP m9
m12:
 
    }
}
void SheikerSort (int *Array, int n)
{   
    int Lt=0, R=0, L=(n-1), Rt=(n-1), k;
    while ((R!=Rt)&&(L!=Lt))
    {
        int i=Lt; 
        R=Rt;
        for (i; i<R; i++)
        {
            if (Array[i]>Array[i+1])
            {
                k=Array[i];
                Array[i]=Array[i+1];
                Array[i+1]=k;
                Rt=i;
            }
        }
        if (R!=Rt)
        {
            i=Rt;
            L=Lt;
            for (i; i>L; i--) 
            {
                if (Array[i]<Array[i-1])
                {
                    k=Array[i];
                    Array[i]=Array[i-1];
                    Array[i-1]=k;
                    Lt=i;
                }
            }
        }
    }
}
int main()
{
    int minimum,maximum,size;
     
    int *A; 
    clock_t start1, finish1,start2,finish2;
    printf("vvedite razmer\n");
    scanf_s("%d",&size);
    printf ("vvedite minimum\n");
    scanf_s("%d",&minimum);
    printf("vvedite maximum\n");
    scanf_s("%d",&maximum);
    A=CreateDynMas(size, minimum,maximum);
    
    for(int i = 0; i < size; i++){
        std::cout <<A[i]<< std::endl;
       }
    if (A)
        {
            start1 = clock();
            DirectInsertion(A, size);
            finish1 = clock();
                
    for(int i = 0; i < size; i++){
        std::cout <<A[i]<< std::endl;
       }
        
        if (Order(A, size))
        {
        
            printf("massiv  otsortirovan %f sec.\n", (float)(finish1-start1)/CLOCKS_PER_SEC);
        }
        else
            printf("Error.\n");
    }
    else
        printf("massiv ne sozdan\n");
 
    delete[] A;
    
    return 0;
}
в чем проблема в АСМ коде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2013, 12:39
Ответы с готовыми решениями:

Шейкерная сортировка массива
Задание №1 Часть 1. Дан числовой массив. Реализовать алгоритм шейкерной сортировки.

1)Бинарный поиск 2)Сортировка включением 3)Шейкерная сортировка 4)Сортировка разделением
1)В заданном массиве К(N) найти индексы элементов, которые кратны минимальному значению элемента...

Сортировка векторов методами: пузырька, Хоара, Шейкерная сортировка
Сортировка векторов методами: пузырька, Хоараб, Шейкерная сортировка Каждый отдельный алгоритм...

Pascal со вставками ASM диоды клавиатуры
Привет всем! Дали задание: По нажатию С - вкл диод CapsLock, N - NumLock, S - ScrollLock, пробел -...

12
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
21.06.2013, 12:45 2
Mikl___ выкладывал код.
0
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 42
21.06.2013, 12:47  [ТС] 3
я не хотел бы использовать чужую программу!если можно посмотреть где у меня ошибка,если это можно...потому что код вроде бы правильный,не понятно в чем ошибка мне...
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
21.06.2013, 13:16 4
Честно говоря ассемблерный код не очень похож на то, что написано в сишной версии. Да ещё и JNP (переход если сумма битов младшего байта результата нечётна) весьма сомнительно там смотрится.
1
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 42
21.06.2013, 13:38  [ТС] 5
спасибо ,первая ошибка=) сейчас проверю результат...м а мне казалось что я делал прям по тому коду что ниже..причем лоб в лоб=)ибо магии АСМ не обучен...

Добавлено через 3 минуты
к сожалению исправление не дало того результата ...программа после запуска выводит ошибку=(
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
21.06.2013, 14:13 6
Ты портишь регистр ebp - подумай чему станет равен eip после выхода из функции?

Вобщем стандартная обёртка функции (если не указано naked)
Assembler
1
2
3
4
5
6
7
8
push ebp
mov  ebp,esp
...
//тут какой-то код
...
mov  esp,ebp
pop  ebp
ret
И запомни по всем соглашениям принято сохранять регистры ebx, edi, esi, ebp. Компилятор именно на это и рассчитывает.
1
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 42
21.06.2013, 19:58  [ТС] 7
спасибо!сейчас попробую разобраться ...понял где косячу,не понял как исправляется...

Добавлено через 28 минут
все равно мало понятно где и что менять...

Добавлено через 5 часов 1 минуту
@murderer, можно пожалуйста по подробнее объяснить...а то что ...не догоняю
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
22.06.2013, 06:25 8
Цитата Сообщение от amor94 Посмотреть сообщение
murderer, можно пожалуйста по подробнее объяснить...а то что ...не догоняю
murderer,
это просто эталон IT-пикапа, развести отвечающего на написание программы за ТС'а
0
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
24.06.2013, 10:47 9
Непонятно, если писать на вставках, то писать все, в том числе и менюшки, и прочее, а иначе проще на чистом Си написать. Здесь только одна функция на вставках реализована, и та коряво - даже я вижу.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
24.06.2013, 10:54 10
Ded_Vasilij,
непонятно, для чего вообще писать сортировку вручную если qsort это встроенная в операционную систему функция, только преподаватели об этом пока не догадываются
0
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
24.06.2013, 11:28 11
@Mikl___, это то как раз понятно - изобретать велосипед не нужно, но знать как он устроен - обязательно, и при необходимости изобрести "козу на лисапеде с квадратными колесами"
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
24.06.2013, 12:27 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
void SheikerSortASM (int *Array, int n)
{   
    int _Lt=0, R=0, L=(n-1), Rt=(n-1), k;
    __asm{
        mov eax,[Array]
        while:mov ecx,[_Lt]
              mov edx,[Rt]
              mov [R],edx
                                                //for (i; i<R; i++) 
              Right:mov    edx,[eax+ecx*4]    
                    cmp    edx,[eax+ecx*4+4]    //if (Array[i]>Array[i+1])
                    jl m1
                        xchg edx,[eax+ecx*4+4]  //k=Array[i]; Array[i]=Array[i+1]; Array[i+1]=k;
                        mov  [eax+ecx*4],edx    
                        mov  [Rt],ecx           //Rt=i;
                    m1:
                    inc ecx
                    cmp ecx,[R]
              jl Right
        
              mov ecx,[R]
              cmp ecx,[Rt]                       //if (R!=Rt)
              jz m2
                  mov ecx,[Rt]
                  mov edx,[_Lt]
                  mov [L],edx
                                                 //for (i; i<L; i++)
                  Left:mov    edx,[eax+ecx*4]    
                       cmp    edx,[eax+ecx*4+4]  //if (Array[i]<Array[i+1])
                       jnle m3
                           xchg edx,[eax+ecx*4+4]//k=Array[i]; Array[i]=Array[i+1]; Array[i+1]=k;
                           mov  [eax+ecx*4],edx    
                           mov  [_Lt],ecx        //Lt=i;
                       m3:
                       dec ecx
                       cmp ecx,[L]
                  jnle Left
              mov edx,[L]
              cmp edx,[_Lt]
        jnz while                                //while ((R!=Rt)&&(L!=_Lt))
        m2:
    }
}
1
0 / 0 / 0
Регистрация: 21.06.2013
Сообщений: 42
24.06.2013, 19:29  [ТС] 13
боже да написал уже спасибо=)
0
24.06.2013, 19:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2013, 19:29
Помогаю со студенческими работами здесь

Блок схема.Сортировка «Пузырьком», Сортировка методом «Последовательных перестановок», Сортировка «Вставками»
Помогите, нужны блок схемы Сортировка «Вставками» Program Vstavka; uses dos; Type mass=array ...

Шейкерная сортировка
Отсортировать строки массива целых чисел по убыванию. Шейкерная сортировка.

Шейкерная сортировка
Объясните пожалуйста суть шейкерной сортировки. Уже минут 30 пытаюсь разобраться, никак не могу. ...

Шейкерная сортировка
Отсортировать строки массива целых чисел по убыванию. Шейкерная сортировка. Решите пж.


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

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