Добрый час!
В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
з.ы.
В одном из своих проекто для меня это является преградой перейти на с MinGW (где старый добрый gcc поддерживает такое что для x32 что для x64) на MSVC компилятор...
Здравствуйте, nen777w, Вы писали:
N>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
N>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
__nop?
N>>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
N>>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
C>__nop?
Спасибо. Действительно генерирует nop на месте вызова.
Гм... А ест способ получить адрес метки? (Для 32битного копилятора это __asm { mov dword ptr to, offset lbl }.
Здравствуйте, nen777w, Вы писали:
N>>>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
N>>>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
C>>__nop?
N>Спасибо. Действительно генерирует nop на месте вызова.
N>Гм... А ест способ получить адрес метки? (Для 32битного копилятора это __asm { mov dword ptr to, offset lbl }.
Отвечу сам себе, и заодно спрошу:
Мне по сути нужен только адресс начала этого зарезервированного блока. По идее я наверно могу получить его вот так:
#pragma optimize( "", off )
void test_func()
{
goto l;
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();
l:
uint64_t r = reinterpret_cast<uint64_t>(&test_func);
char *p = reinterpret_cast<char*>(r);
p += 8; //<-- Вопрос.. могу ли я расчитывать на это смещение?
int v = *(int*)p; //<-- Содержит: 0x90909090
}
#pragma optimize( "", on )
Вопрос.. могу ли я расчитывать смещение 8 байт. Понятно что для короткго jmp это опкод из 2-х байтов длинной.
А вот если __nop() будет больше то тут уже будет не 8 а другая константа.
Пролог у этой функции всегда будет 6 байт длинной?
Здравствуйте, nen777w, Вы писали:
N>з.ы.
N>В одном из своих проекто для меня это является преградой перейти на с MinGW (где старый добрый gcc поддерживает такое что для x32 что для x64) на MSVC компилятор...
Сделай *.asm файл для x64