Компилируется ли VC ++ в машинный код Intel или промежуточный код? - PullRequest
1 голос
/ 07 октября 2011

Мне интересно, можно ли указатели функций в VC ++ указывать на предварительно инициализированный блок памяти, содержащий машинный код x86.Могу ли я затем выполнить код в этом месте, используя указатель функции?

т.е.

void (*functionPointerToStartOfCodeSegment)(void);

functionPointerToStartOfCodeSegment = 0x4A152;

*functionPointerToStartOfCodeSegment();

Будет ли продолжаться выполнение кода x86 в местоположении 0x4A152, или он захлебнется, потому что он ожидает промежуточногокод в этом месте?

1 Ответ

3 голосов
/ 07 октября 2011

Ваш вопрос высшего уровня: "Компилируется ли VC ++ в машинный код или промежуточный код?" Вы должны спросить MS.

Но, учитывая, что они нацелены на разные платформы (по крайней мере, CLR и родной x86), я думаю, компилятор работает поэтапно:

  • Parse VC ++
  • Создание высокоуровневого «промежуточного» представления кода C ++
  • а) Сгенерировать код CLR или б) сгенерировать собственный код x86

Я не уверен, что связь между вашим основным вопросом и подробным вопросом, но в любом случае ...

Да, вы должны быть в состоянии установить указатель функции VC ++, чтобы он указывал на произвольный блок кода x86, используя приведение. Вы должны убедиться, что код соответствует всем соглашениям вызова / возврата VC ++. Если код VC ++ скомпилирован как код CLR, соглашения о вызовах, вероятно, включают в себя способы обозначения того, что функция является либо кодом CLR, либо собственным кодом x86. Проверьте документацию MS для соглашений о вызовах.

...