Немедленный вызов / jmp в встроенном ассемблере Visual C - PullRequest
3 голосов
/ 14 октября 2010

Когда я пытаюсь сделать немедленный вызов или перейти на встроенный ассемблер VC ++ 2010

_asm 
{
    call 00405B90h;
    jmp 00405B90h;
    jmp far 00405B90h;
}

выдает ошибку

C2415: improper operand type

Возможно ли это и как это сделать?

Пока у меня есть работа вокруг:

_asm 
{
    push 00405B90h; // This is a jump work around
    call 00405B90h;        
}

Ответы [ 2 ]

7 голосов
/ 14 октября 2010

в зависимости от того, что вы хотите вызвать, либо установите переменную для адреса и сделайте:

DWORD var = 0xDEADBEEF;
__asm jmp [var]

или, что я делаю:

__asm
{
    mov eax,ModuleBase
    add eax,RVA
    call eax ;obviously call can be jmp
}

, вы можете легко макрос этого(вероятно, хорошая идея добавить параметр регистра):

#define JMP_IMM(x) __asm mov eax,x \
                   __asm jmp eax

К сожалению, MASM не поддерживает относительные вызовы к абсолютным адресам, и другие ассемблеры, такие как NASM, не могут сделать это для объектных файлов COFFили.Поэтому ограничения цепочки инструментов вынуждают вас использовать этот менее эффективный машинный код с косвенным вызовом или jmp.

0 голосов
/ 16 октября 2010

__ asm jmp fword ptr cs: [00405B90h]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...