Асссмовские вставки на делфи -> C++

Тема в разделе "WASM.ASSEMBLER", создана пользователем FashiST, 2 авг 2006.

  1. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    на делфи было так
    asm
    mov eax, Ring0Proc
    mov Ring0ProcAdr, eax
    mov eax, Param
    db $0ff, $01d // call far [FarCall]
    dd offset FarCall; //
    end;

    переписал на С++ так
    __asm
    {
    mov eax, Ring0Proc
    mov Ring0ProcAdr, eax
    mov eax, Param
    db 0ffh, 01dh// call far [FarCall]
    dd offset FarCall
    }
    в итоге две ошибки в предпоследней и последней строке
    error C2400: inline assembler syntax error in 'opcode'; found 'constant'
    warning C4405: 'offset' : identifier is reserved word
    error C2400: inline assembler syntax error in 'opcode'; found 'offset'

    Как с этим бороться???
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    _emit 0xFF
    _emit 0x1D

    последнюю по байтам вставлять аналогично.
     
  3. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    Можешь полностью написать???

    да и...

    typedef struct
    {
    DWORD Offset;
    WORD Selector;
    }FAR_CALL, *PFAR_CALL;

    FAR_CALL FarCall;

    и что означает _emit?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Microsoft Specific
    The _emit pseudoinstruction is similar to the DB directive of MASM.
     
  5. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    Это я уже прочитал.
     
  6. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    Только я всеравно не догоняю как записать
    dd offset FarCall
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    _emit вставляет только байты. Вставить дворд в VS, вроде, нельзя.

    Попробуй с модификацией кода:

    Код (Text):
    1. _asm
    2. {
    3.                 lea esi, lab
    4.                 mov eax, FarCall
    5.                 mov dword ptr [esi], eax
    6.                 mov eax, Ring0Proc
    7.                 mov Ring0ProcAdr, eax
    8.                 mov eax, Param
    9.                 _emit 0xFF
    10.                 _emit 0x1D
    11. lab:
    12.                 _emit 0x00
    13.                 _emit 0x00
    14.                 _emit 0x00
    15.                 _emit 0x00
    16. }
     
  8. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    _asm
    {
    lea esi, lab
    mov eax, FarCall

    //operand size conflict
    mov dword ptr [esi], eax
    mov eax, Ring0Proc
    mov Ring0ProcAdr, eax
    mov eax, Param
    _emit 0xFF
    _emit 0x1D
    lab:
    _emit 0x00
    _emit 0x00
    _emit 0x00
    _emit 0x00
    }

    Опять не получается
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    попробуй заменить
    mov eax, FarCall
    на
    lea eax, FarCall
     
  10. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    Вроде скомпилилось, но о результатах работоспособности сообщу позже.
    Спасибо.
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.331
    атрибуты секции .text поменять не забудь, иначе access violation получишь...

    #pragma comment(linker, "/SECTION:.text,RWX")

    вроде так.
     
  12. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    #pragma comment(linker, "/SECTION:.text,erw")

    Но всеравно иксэпшен по выходу((((
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    В косвенном call можно задавать адрес структуры m16:32 любым способом, например в регистре eax:
    lea eax, FarCall
    db 0xFF, 0x18 //call far [eax]
    Для прочих вариантов см.таблицу кодировок байта ModR/M в IA-32 v.2
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Код (Text):
    1. _emit 0xFF
    2. sbb eax,FarCall
     
  15. FashiST

    FashiST New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2006
    Сообщения:
    12
    в последней строке error C2443: operand size conflict

    Как правильно????? я уже ........
     
  16. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    а написать call fword ptr [FarCall] никто не пробовал? Или операцию на гландах нужно обязательно делать через задницу?