Форум программистов, компьютерный форум CyberForum.ru

Ассемблерная вставка в Visual Studio - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.92
Mr. FourKing
 Аватар для Mr. FourKing
1 / 1 / 1
Регистрация: 11.11.2010
Сообщений: 29
19.11.2010, 00:30     Ассемблерная вставка в Visual Studio #1
Есть программа, выполняющая шейкерную сортировку. Функция сортировки представляет собой ассемблерную вставку. Проблема в том что при возврате в главную функцию возникает исключение. Не пойму, в чем его причина.

Вот код:
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
const int n=5;
 
int cocktail_sort(int arr[])
  {
      int first=0;
      int last;
      last=n;
      int tmp;
      int i;
 
      /*for( --last; first < last; --last, ++first )
      {
          for(i = first; i < last; ++i )
              if ( arr[i + 1] < arr[i] )
              {
                  tmp=arr[i+1];
                  arr[i+1]=arr[i];
                  arr[i]=tmp;
              }
 
          for(i = last - 1; i > first; --i )
              if ( arr[i] < arr[i - 1])
              {
                  tmp=arr[i-1];
                  arr[i-1]=arr[i];
                  arr[i]=tmp;
              }
      }*/
__asm
{
            push        ebp  
            mov         ebp,esp 
            sub         esp,0FCh 
            push        ebx  
            push        esi  
            push        edi  
            lea         edi,[ebp-0FCh] 
            mov         ecx,3Fh 
            mov         eax,0CCCCCCCCh 
            rep stos    dword ptr es:[edi] 
 
            mov         dword ptr [first],0 
 
            mov         dword ptr [last],0Ah 
 
            mov         eax,dword ptr [last] 
            sub         eax,1 
            mov         dword ptr [last],eax 
            jmp         L 
L10:        mov         eax,dword ptr [last] 
            sub         eax,1 
            mov         dword ptr [last],eax 
            mov         ecx,dword ptr [first] 
            add         ecx,1 
            mov         dword ptr [first],ecx 
L:          mov         eax,dword ptr [first] 
            cmp         eax,dword ptr [last] 
            jge         L1 
 
            mov         eax,dword ptr [first] 
            mov         dword ptr [i],eax 
            jmp         L2 
L5:         mov         eax,dword ptr [i] 
            add         eax,1 
            mov         dword ptr [i],eax 
L2:         mov         eax,dword ptr [i] 
            cmp         eax,dword ptr [last] 
            jge         L3 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [i] 
            mov         esi,dword ptr [arr] 
            mov         eax,dword ptr [ecx+eax*4+4] 
            cmp         eax,dword ptr [esi+edx*4] 
            jge         L4
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [ecx+eax*4+4] 
            mov         dword ptr [tmp],edx 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [i] 
            mov         esi,dword ptr [arr] 
            mov         edx,dword ptr [esi+edx*4] 
            mov         dword ptr [ecx+eax*4+4],edx 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [tmp] 
            mov         dword ptr [ecx+eax*4],edx 
 
L4:         jmp         L5 
 
L3:         mov         eax,dword ptr [last] 
            sub         eax,1 
            mov         dword ptr [i],eax 
            jmp         L6 
L9:         mov         eax,dword ptr [i] 
            sub         eax,1 
            mov         dword ptr [i],eax 
L6:         mov         eax,dword ptr [i] 
            cmp         eax,dword ptr [first] 
            jle         L7 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [i] 
            mov         esi,dword ptr [arr] 
            mov         eax,dword ptr [ecx+eax*4] 
            cmp         eax,dword ptr [esi+edx*4-4] 
            jge         L8 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [ecx+eax*4-4] 
            mov         dword ptr [tmp],edx 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [i] 
            mov         esi,dword ptr [arr] 
            mov         edx,dword ptr [esi+edx*4] 
            mov         dword ptr [ecx+eax*4-4],edx 
 
            mov         eax,dword ptr [i] 
            mov         ecx,dword ptr [arr] 
            mov         edx,dword ptr [tmp] 
            mov         dword ptr [ecx+eax*4],edx
 
L8:         jmp         L9 
 
L7:         jmp         L10 
 
L1:        pop         edi  
pop         esi  
pop         ebx  
mov         esp,ebp 
pop         ebp  
ret      
    }
  }
 
int main()
{
    int arr[n];
 
    for(int i=0;i<n;i++)
        cin>>arr[i];
 
    for(int i=0;i<n;i++)
        cout<<' '<<arr[i];
    cout<<'\n';
 
    cocktail_sort(arr);
 
    for(int i=0;i<n;i++)
        cout<<' '<<arr[i];
 
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 00:30     Ассемблерная вставка в Visual Studio
Посмотрите здесь:

Ассемблерная вставка в с++ C++
Ассемблерная вставка C++
Ассемблерная вставка в c++ C++
Ассемблерная вставка в С++ C++
Ассемблерная вставка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.11.2010, 00:33     Ассемблерная вставка в Visual Studio #2
ret точно не стоит писать, компилятор и так добавить пролог в функцию
Mr. FourKing
 Аватар для Mr. FourKing
1 / 1 / 1
Регистрация: 11.11.2010
Сообщений: 29
19.11.2010, 01:01  [ТС]     Ассемблерная вставка в Visual Studio #3
хм... но без ret сортировка не проходит, программа выводит тот же массив что и был задан.

Добавлено через 24 минуты
может кто-нибудь предложить еще какие-то варианты?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.11.2010, 09:34     Ассемблерная вставка в Visual Studio #4
Mr. FourKing, не уверен на счет ret (всмысле нужен от тут или нет), но вы уверены, что к моменту выполнения ret в на вершине стека находится адрес возврата? При входе в функцию вы делаете 4 push'а, а на выходе 1 pop (вроде больше pop'ов я не заметил). Далее ret берет из стека верхнее значение и думает, что это адрес возврата, ну и соответственно программа продолжает работать с этого "адреса", т.е. не понятно где, и не факт, что такой адрес вообще существует.
Mr. FourKing
 Аватар для Mr. FourKing
1 / 1 / 1
Регистрация: 11.11.2010
Сообщений: 29
19.11.2010, 11:26  [ТС]     Ассемблерная вставка в Visual Studio #5
Цитата Сообщение от Kastaneda Посмотреть сообщение
При входе в функцию вы делаете 4 push'а, а на выходе 1 pop (вроде больше pop'ов я не заметил)
Все pop`ы присутствуют, просто конец функции не отредактирован
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.11.2010, 12:21     Ассемблерная вставка в Visual Studio #6
При входе в функцию попробуйте трассировкой до выхода дойти, верный способ отловить ошибку.
хм... но без ret сортировка не проходит, программа выводит тот же массив что и был задан.
ret не влияет на результат работы ф-ции, фактически она просто меняет EIP на значение из стека.

Не по теме:

Хм, странно, сейчас смотрю - все pop'ы на месте. Mr. FourKing, с утра же их небыло? Или я будучи в полусонном сосотянии их не заметил Вообще странно.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2010, 22:21     Ассемблерная вставка в Visual Studio
Еще ссылки по теме:

Ассемблерная Вставка C++
C++ Ассемблерная вставка на С++
C++ Ассемблерная вставка на С++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.11.2010, 22:21     Ассемблерная вставка в Visual Studio #7
зачем вообще пролог эпилог прописывать?
Yandex
Объявления
19.11.2010, 22:21     Ассемблерная вставка в Visual Studio
Ответ Создать тему
Опции темы

Текущее время: 05:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru