2013-05-27 4 views
3

Я хочу использовать встроенную сборку в визуальной студии, чтобы перейти к определенному адресу. Я попытался это:Visual Studio inline assembly прямой прыжок

_asm { 
    jmp 0x12345678 
} 

Но компилятор говорит: «Опкод не использует операнды этого типа.»

Как я могу сделать прямой прыжок?

+0

Будет ли место памяти всегда находиться в одном месте? Разумеется, местоположение будет вычисляться при запуске подпрограммы и использует любую память на компьютере. Относительный jmp использует код E9. В 32-разрядном режиме x86 переход на один прыжок вперед (выраженный как длинный прыжок) - это машинный код E9 01 00 00 00. A dd 01E9 и db 0 могут реплицироваться (dw 0 мне нужно). Относительные короткие прыжки не всегда срабатывают. Правильно, или окна идут бум. – ady

ответ

1

Насколько я понимаю, MASM не поддерживает этот тип прыжка. У вас есть несколько вариантов:

mov eax, 12345678h 
jmp eax 

или

push 12345678h 
ret 

Первый использует регистр, второй снижает производительность, так как он гремит оптимизации сопряжению CALL/RET в CPU. Я думаю, вы также можете использовать типизированную константу или локальную переменную - это также потребляет несколько лишних байтов. Я не думаю, что есть какой-либо другой способ, ни прямые, однолинейные средства для такого прямого перехода, как в MASM.

caveat: предполагается, что вы работаете в коде x86. Ваш OP предлагает столько же от размера аргумента jmp, но если это x64, тогда ответ, очевидно, будет другим.

+0

Nice. mov eax, 12345678 - push eax - ret работает для моего встроенного x86 asm. – ady

+0

@ady Любопытно, почему вы объединили бы эти и использовали регистр - почему бы просто не обходить eax и сделать прямой push/ret (как второй пример)? –

+0

Моя первоначальная прога была mov eax, место, чтобы увидеть, что произошло в eax. Mov eax, location jmp [eax] не работал для меня. (jmp eax did) – ady

0

Попробуйте установить вар по адресу:

unsigned int var = 0x12345678; 
_asm { 
    jmp [var] 
} 
+0

ok Это косвенный скачок памяти. Но, похоже, это самое близкое, что я могу получить с MASM :( – user2252343

+0

Я не эксперт, но, возможно, MASM ((Microsoft Assembler) не поддерживает абсолютные прыжки. Попробуйте [FASM] (http://flatassembler.net/) вместо этого. –

0

Если вы используете опции компоновщика/DYNAMICBASE: NO/ИСПРАВЛЕНО/BASE: 0x [ваш базовый адрес] для вашего модуля, вы можете использовать:

_asm 
{ 
    jmp label1 + 0xFFFFFF 
label1: 
} 

Что в разборке компилирует:

_asm 
    { 
     jmp label1 + 0xFFFFFF 
040117DC E9 FF FF FF 00  jmp   050117E0 
    label1: 
    } 

Затем вы можете поиграть, чтобы получить прыжок E9 на ваш целевой адрес.

Смежные вопросы