Ошибка компиляции при использовании asm-вставок

Тема в разделе "LANGS.C", создана пользователем Zlyden, 4 май 2011.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Делаю подмены функций в памяти. Последнее время делаю так: записываю вместо инструкций переход на мою функцию, а в моей функции - точное копирование этих самых инструкций+кое-что от себя. Раньше всё работало нормально, до сегодняшнего дня. Я записал переход на мою функцию в конце другой функции, вместо инструкций:
    Код (Text):
    1.     pop     ebx
    2.     mov     eax, 1          ; adr_GetPacketEnd
    3.     add     esp, 1Ch
    4.     retn
    В функции на которую осуществляется переход, я просто скопировал эти же инструкции (для теста):
    Код (Text):
    1. void Hook_Sys_GetPacket_ded(){
    2.     _asm{
    3.         pop     ebx
    4.         mov     eax, 1          ; adr_GetPacketEnd
    5.         add     esp, 1Ch
    6.         retn
    7.     }
    8. }
    И... Ошибка во время работы. Дизассемблирую свою dll, и вместо моей функции вижу следующий сюрприз:
    Код (Text):
    1.         push    ebx
    2.         pop ebx
    3.         mov eax, 1          ; adr_GetPacketEnd
    4.         add esp, 1Ch
    5.         retn
    6.         pop ebx
    7.         retn
    Компилятор почему-то решил по бокам моей функции разместить инструкции push ebx и pop ebx, а т.к. в моей асм-вставке присутствует retn, происходит ошибка. Собственно, вопрос - есть ли какой-нибудь способ избежать таких "подарков" от компилятора, чтобы он в точности компилировал функцию? VC2005.
     
  2. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Код (Text):
    1. __declspec(naked)
    2. void Hook_Sys_GetPacket_ded(){
    3.     _asm{
    4.         pop     ebx
    5.         mov     eax, 1          ; adr_GetPacketEnd
    6.         add     esp, 1Ch
    7.         retn
    8.     }
    9. }
     
  3. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    __declspec(naked) перед функцией.
     
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    О, круто, то что надо :)
    А я label в начале ассемблерной вставки использую вместо имени функции *shy*.
     
  5. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Cr4sh
    Большое спасибо
     
  6. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Не буду создавать второй темы.
    Скажите, при юзании асм-вставок, студийный оптимизатор их трогает или нет?
    Т.е. есть шанс, что оптимизатор похерит мою асм-вставку?
     
  7. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Не трогает.
    Скорее наоборот: асм-вставка похерит оптимизацию.