Указатель на встроенный блок __asm ​​в c ++ - PullRequest
3 голосов
/ 05 апреля 2011

Итак, я разбирался с блоком __asm ​​в VS2010 и не смог найти лучшего способа получить указатель на начало блока сборки.

Единственный способ, которым я знаю, как это сделать, - объявить функцию void. Одна из проблем заключается в том, что функция void будет иметь свою собственную сборку до и после моего блока сборки, и мне придется компенсировать это путем получения реального адреса функции и добавления смещения.

Пример:

C ++

void myfunc(){
    __asm{
        nop
        nop
        nop
        ret
    }
}  

Результатом сборки будет подобное:

push ebp
mov ebp,esp
add esp,8
nop
nop
nop
retn
mov esp,ebp
pop ebp
retn

myfunc (), скорее всего, будет ошибкой при выполнении.

1 Ответ

4 голосов
/ 05 апреля 2011

В основном вы хотите включить __declspec (naked) в своей функции, чтобы избежать сгенерированного компилятором пролога и эпилога.

См. Также: http://msdn.microsoft.com/en-us/library/h5w10wxs(v=vs.80).aspx

...