использование __emit

Тема в разделе "WASM.ASSEMBLER", создана пользователем Intercepter, 9 окт 2005.

  1. Intercepter

    Intercepter New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2005
    Сообщения:
    14
    Адрес:
    Russia
    в файл .c необходимо вставить несколько инструкций на асме. все было бы здорово в следующем примере:



    __asm

    {

    __emit 0xff

    __emit 0x1d

    };



    но нужно вставить адрес функции:

    __asm

    {

    __emit offset myfunc

    };



    не подходит, компилер ругается (illegal instruction size).



    пробовал и так:



    #define EMIT_DWORD(x) __asm __emit ((x) >> 0) & 0xff __asm __emit ((x) >> 8) & 0xff __asm __emit ((x) >> 16) & 0xff __asm __emit ((x) >> 24) & 0xff



    ...



    EMIT_DWORD(&myfunc)



    но и это не срабатывает (shr not constant expression in first operand).



    Как еще можно изловчиться, чтобы компилер (cl.exe от MS VC) меня понял?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Intercepter

    Разве на шаге компиляции известен адрес функции?
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Зачем far call в виндосе?

    Тем не менее, если это нужно, то:
    Код (Text):
    1. void foo() {}
    2.  
    3. #pragma pack(1)
    4. struct { void * eip; short cs; } f = { foo, 0x1b };
    5.  
    6. void bar()
    7. {
    8.     __asm call fword ptr f;
    9. }