MSVC x64 зарезервировать место внутри метода
От: nen777w  
Дата: 06.07.19 05:09
Оценка:
Добрый час!
В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?

з.ы.
В одном из своих проекто для меня это является преградой перейти на с MinGW (где старый добрый gcc поддерживает такое что для x32 что для x64) на MSVC компилятор...
Re: MSVC x64 зарезервировать место внутри метода
От: Conr Россия  
Дата: 06.07.19 08:20
Оценка: +1
Здравствуйте, nen777w, Вы писали:

N>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.

N>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
__nop?
Re[2]: MSVC x64 зарезервировать место внутри метода
От: nen777w  
Дата: 06.07.19 09:08
Оценка:
N>>В связи с тем что _asm вставки cl компилятор больше не поддерживает для x64 сборок, а следовательно и _asm _emit тоже стало не доступно.
N>>Может есть все таки какой то способ зарезервировать или даже "положить" в метод необходимую мне последовательность байтов?
C>__nop?

Спасибо. Действительно генерирует nop на месте вызова.
Гм... А ест способ получить адрес метки? (Для 32битного копилятора это __asm { mov dword ptr to, offset lbl }.
Отредактировано 06.07.2019 9:43 nen777w . Предыдущая версия . Еще …
Отредактировано 06.07.2019 9:40 nen777w . Предыдущая версия .
Отредактировано 06.07.2019 9:13 nen777w . Предыдущая версия .
Re[3]: MSVC x64 зарезервировать место внутри метода
От: nen777w  
Дата: 06.07.19 10:38
Оценка:
Здравствуйте, 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 байт длинной?
Отредактировано 06.07.2019 10:39 nen777w . Предыдущая версия .
Re[4]: MSVC x64 зарезервировать место внутри метода
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 06.07.19 11:04
Оценка: 4 (1)
Здравствуйте, nen777w, Вы писали:

N>могу ли я расчитывать смещение 8 байт.


Нет, конечно. Вряд ли хоть какой-то компилятор гарантирует определенную длину пролога.

Если хотите, чтобы работало надежно — вызывайте из этой точки вспомогательную функцию, которая добудет адрес возврата через _ReturnAddress. Ну а размер команды перехода нужно или смотреть по реализациям, обычно MS VC++ достаточно сообразителен, чтобы ставить jmp short.
Re: MSVC x64 зарезервировать место внутри метода
От: IID Россия  
Дата: 06.07.19 12:54
Оценка: +1
Здравствуйте, nen777w, Вы писали:

N>з.ы.

N>В одном из своих проекто для меня это является преградой перейти на с MinGW (где старый добрый gcc поддерживает такое что для x32 что для x64) на MSVC компилятор...

Сделай *.asm файл для x64
kalsarikännit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.