С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.92
Mr. FourKing
1 / 1 / 1
Регистрация: 11.11.2010
Сообщений: 29
#1

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

19.11.2010, 00:30. Просмотров 6061. Ответов 6
Метки нет (Все метки)

Есть программа, выполняющая шейкерную сортировку. Функция сортировки представляет собой ассемблерную вставку. Проблема в том что при возврате в главную функцию возникает исключение. Не пойму, в чем его причина.

Вот код:
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 00:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ассемблерная вставка в Visual Studio (C++):

Ассемблерная вставка - C++
Всем доброй ночи!!! Я хочу попросить помощи в решении вот такой функции: Найти целое значение аргумента, при котором значение функции ...

Ассемблерная вставка - C++
Нужно заменить в русской строке похожие буквы латиницей. Ввод и вывод - на С++, всё остальное - на Ассемблере Помогите пожалуйста

Ассемблерная вставка на С++ - C++
Добрый день, уважаемые. Столкнулся с большой проблемой когда понадобилось для увеличения скорости на языке С++ воспользоваться вставкой с...

Ассемблерная вставка - C++
Доброго времени суток, пытаюсь пытаюсь узнать поддерживает ли мой процессор тепловые сенсоры код не компилируется ругается на конфликт...

Ассемблерная вставка на С++ - C++
Написал сегодня код. int x, y; //Исходные числа float res = 0; //Результат расчетов cin &gt;&gt; x &gt;&gt; y;//Вводи операнды ...

Ассемблерная вставка - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int x, y; cout &lt;&lt; &quot;Vvedite znachenie x, y: &quot; ; ...

6
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2010, 00:33 #2
ret точно не стоит писать, компилятор и так добавить пролог в функцию
0
Mr. FourKing
1 / 1 / 1
Регистрация: 11.11.2010
Сообщений: 29
19.11.2010, 01:01  [ТС] #3
хм... но без ret сортировка не проходит, программа выводит тот же массив что и был задан.

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

Не по теме:

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

0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.11.2010, 22:21 #7
зачем вообще пролог эпилог прописывать?
0
19.11.2010, 22:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2010, 22:21
Привет! Вот еще темы с ответами:

Ассемблерная вставка в c++ - C++
Как данный код написать между вставками __asm {} в c++??? Поскольку dw, db и тд не поддерживаются в c++ Сам код: GRUPP DB ...

Ассемблерная вставка в с++ - C++
С помощью логических операций реализуйте запись битов в данной ячейки памяти, размером в 2 байта, в обратном порядке. Вот моя,...

Ассемблерная Вставка - C++
Добрый день. начал изучать ассемблер(начал со вставок, на этом основание пишу здесь). Должен был написать программу, где на Си++ задается...

Ассемблерная вставка в С++ - C++
Когда в b у нас число больше 127 программа работает неправильно помогите исправить .. очень нужно #include&lt;stdio.h&gt; void main() {...


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

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

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