Старый 15.03.2011, 07:15   #1
NetSter
 
Аватар для NetSter
 
Регистрация: 06.07.2010
Сообщений: 24
Репутация: 1
Exclamation [ASM / C++] превращение DLL )

Всем привет.
Вот наткнулся на проблемку) надеюсь тут мне раздуплят)
есть необходимость писать кучу разных ДЛЛ для основного проекта.
основное требование написание на С++ со вставками АСМ кода.
в итоге должна получатся структура на подобии этой (тупо рандомный пример, показать как по стандарту должно быть)
Код:
#include "stdafx.h"

int Calc(int *mas,int imax,int jmax,int j)
{
    int res, step=4,source,teg;
    _asm{
                finit
                mov eax,0
                mov eax,j
                dec eax
                mul step
                mov esi,eax
                mov eax,0
                mov eax,jmax
                mul step
                mov source,eax
                mov eax,0 
                mov ebx,mas
                add ebx,esi
                mov ecx,imax
        label:    mov eax,[ebx]
                mov teg,ecx
                mov ecx,0
                mov ecx,7h
                div ecx
                cmp edx, 0
                jz yes    
                jmp post
        yes:    inc res                    
        post:    add ebx,source
                mov edx,0
                mov ecx,teg        
                loop label
        }
    return res;
}
теперь самое сладенькое
асм я не шарю а длл все равно нужно писать)
что я делаю
пишу длл на С++ и потом дезасемблирую.
вот пример кода либы на С++

Код:
#include "stdafx.h"
#include <conio.h>

int calc (int *mas, int m)
{
	int min=mas[0];
	for (int i=1;i<m;i++)
    if (min>mas[i])  min=mas[i];
  return min;
}
Код:
LIBRARY      "MyDll"
DESCRIPTION 'This library has one function'
EXPORTS
  calc @1
после скормления IDA получили подобие либы на асме, но ясен пень нерабочее)
вот оно

Код:
#include "stdafx.h"
#include <conio.h>

int calc (int *mas, int m)
{
	_asm{
//=====================================================

; int __cdecl calc(int *, int)
public ?calc@@YAHPAHH@Z
?calc@@YAHPAHH@Z proc near

arg_0= dword ptr  4
arg_4= dword ptr  8

mov     ecx, [esp+arg_0]
mov     eax, [ecx]
xor     edx, edx
inc     edx
cmp     [esp+arg_4], edx
jle     short locret_10001021
push    esi
loc_10001010:
mov     esi, [ecx+edx*4]
cmp     eax, esi
jle     short loc_10001019
mov     eax, esi
loc_10001019:
inc     edx
cmp     edx, [esp+4+arg_4]
jl      short loc_10001010
pop     esi
locret_10001021:
retn
?calc@@YAHPAHH@Z endp
//====================================================
}
}
вот пацаны опишите кто шарит плиз как мне умудрится делать либы с помощью рабочих либ на С++ и IDA ?
Заранее очень благодарен)
NetSter вне форума   Ответить с цитированием
Старый 15.03.2011, 20:05   #2
paranoidchaos
Banned
 
Регистрация: 02.09.2010
Сообщений: 59
Репутация: -6
По умолчанию

а g++ -S не поможет ?
у вашего компилятора должна быть опция -S которая говорит ему чтобы он не создавал обджек файл а просто сохранил асм код полученный компилятором
paranoidchaos вне форума   Ответить с цитированием
Старый 15.03.2011, 20:06   #3
paranoidchaos
Banned
 
Регистрация: 02.09.2010
Сообщений: 59
Репутация: -6
По умолчанию

и ваще какой в этом смысл если вы не разбираетесь в асм ?
paranoidchaos вне форума   Ответить с цитированием
Старый 15.03.2011, 20:47   #4
M@ZAX@KEP
 
Аватар для M@ZAX@KEP
 
Регистрация: 24.07.2010
Сообщений: 139
Репутация: 5
По умолчанию

Цитата:
и ваще какой в этом смысл если вы не разбираетесь в асм ?
Включаем экстрасенсорные способности... задание в универе у него такое. Иначе такие извраты не объяснить))
M@ZAX@KEP вне форума   Ответить с цитированием
Старый 15.03.2011, 20:53   #5
paranoidchaos
Banned
 
Регистрация: 02.09.2010
Сообщений: 59
Репутация: -6
По умолчанию

может вы на асм лучше напишите чем это сделает компилятор ?
paranoidchaos вне форума   Ответить с цитированием
Старый 16.03.2011, 00:08   #6
1nt
 
Регистрация: 21.10.2010
Сообщений: 19
Репутация: 0
По умолчанию

я конечно не знаю, может тс опустил это специально, однако болванка длл отличается от того, что он скинул.
в точке входа сразу же вешается обработчик событий, который выясняет что сделали с либой, и в соответствии с этим выполняет определенные действия:
Код:
#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
Соответственно, чтобы библиотека была рабочей, функцию calc нужно описать и использовать в DLL_PROCESS_ATTACH. Асм код получается без проблем ключом "-s", описанным выше.
1nt вне форума   Ответить с цитированием
Ответ

Метки
asm, c++, dll, ida

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot