на делфи было так 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' Как с этим бороться???
Можешь полностью написать??? да и... typedef struct { DWORD Offset; WORD Selector; }FAR_CALL, *PFAR_CALL; FAR_CALL FarCall; и что означает _emit?
_emit вставляет только байты. Вставить дворд в VS, вроде, нельзя. Попробуй с модификацией кода: Код (Text): _asm { lea esi, lab mov eax, FarCall 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 }
_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 } Опять не получается
атрибуты секции .text поменять не забудь, иначе access violation получишь... #pragma comment(linker, "/SECTION:.text,RWX") вроде так.
В косвенном call можно задавать адрес структуры m16:32 любым способом, например в регистре eax: lea eax, FarCall db 0xFF, 0x18 //call far [eax] Для прочих вариантов см.таблицу кодировок байта ModR/M в IA-32 v.2
а написать call fword ptr [FarCall] никто не пробовал? Или операцию на гландах нужно обязательно делать через задницу?