Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll с __asm вставкой 
:(
    Опции темы
dinoel
Дата 19.10.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.10.2007

Репутация: нет
Всего: нет



Есть dll, написанная на VC++ , в которой используется __asm вставка  (происходит сортировка массива)

Код

BOOL __stdcall APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
[color=red]вот моя функция[/color]
extern "C" __declspec(dllexport) public int __stdcall Sort(int * Mas, int Len){
__asm{
dec   Len
CycleExt:
  xor   ebx,ebx
  mov   ecx,Len
  mov   esi,0
CycleIn:
  mov   edi,Mas[esi]
  cmp   edi,Mas[esi+4]
  jg    Exchange
  add   esi,4
  loop  CycleIn
  jmp   Check
Exchange:
  mov   ebx,Mas[esi+4]
  mov   Mas[esi+4],edi
  mov   Mas[esi],ebx
  add   esi,4
  loop  CycleIn
Check:
  cmp   ebx,0
  je    Exit
  jmp   CycleExt
Exit:
}
return Len;
}

Build проходит успешно. Затем мне нужно подключить эту dll к проекту на C#
Код

 [DllImport("12.dll")]

       unsafe public static extern int Sort(int*mas,int x);

       int razmer; int Len; int[] rez = new int[4];

        unsafe public void M1()
        {
           
            rez[0] = 5;
            rez[1] = 4;
            rez[2] = 1;
            rez[3] = 3;
             razmer= rez.Length;
             MessageBox.Show(razmer.ToString());
            fixed (int* rez1 = rez)
            {
                 Len = Sort(rez1, razmer);
            }
          
        }

Тоже всё запускается, но при вызове функции Sort (которая находится в dll), программа просто закрывается и не выдаёт при этом никаких ошибок.
если я упрощаю код в dll и превращаю свою функцию в
Код

extern "C" __declspec(dllexport) public int __stdcall Sort(int * Mas, int Len){
__asm{
dec   Len
}
return Len;
}

то всё корректно работает и Len уменьшается на единицу (т.е. получается что asm вроде как работает)

Помогите понять (и исправить) вчём же проблема, когда я пытаюсь обработать массив? Где я косячу, в самом использовании __asm вставки, или в неправильном написании кода ассемблера (я в этом слабоват) ? Или может проблема уже кроется в самом вызове в C# ?
 

P.S. извиняюсь что так много настрочил, я просто хотел чтобы вы сразу поняли что я хочу спросить
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0401 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.