Привет. Нужно с масма кусок кода портировать в Visual Studio 2008 Есть вот такой код в масме Код (Text): xor eax, eax global_data db 4000h dup (90h) mov eax, [global_data+4] Я хочу в студии оформить его асм-вставкой Делаю так Код (Text): _asm { xor eax, eax global_data: // вот тут нужно как-то зарезервировать место размером 4000h // малое число байт резервируется через _emit без проблем. // а как поступить в моем случае? Я же не впихну 4000h эмитов. // А если нужно будет мегабайт зарезервировать? // Помогите советом или макросом. Заранее спасибо! mov eax, dword ptr [global_data+4] }
А если до _asm вставить Код (Text): unsigned char global_data[0x4000]; ? Да и вообще, сделай его глобальным.
Неа. Нужно именно статический буфер именно в том месте. Между теми двумя опкодами. Если вставить до асм но после начала функции - тогда буфер будет в стеке. А если до начала функции, то в секции rdata. Такое мне не подходит.
Мне нужно, чтобы в конкретном месте кода было 4000h nop-ов. Это не просто буфер. Сюда будут вставлен нужный мне код в будущем.
я обычно делаю в виде массивов, только надо опкоды знать для этого: Код (Text): BYTE Code[0x4005]; for(DWORD t = 0; t < 0x4000; t++) { Code[t] = 0x90; } // nop *(BYTE*)&Code[0x4000] = 0xB8; // mov eax, x *(DWORD*)&Code[0x4001] = (DWORD)&Code[0]; // где 0 - там указать номер байта, на который нужно передать управление // забыл про ксор, добавишь сам в начало массива (опкод - 0xC033)
__declspec(naked) void pStorage(void) { __asm { nop nop .. Или так, если байты произвольны: __declspec(naked) void exe(void) { __asm { __emit 0x4e __emit 0x5b ..
Тогда изврат: 1. Создавай отдельный модуль, в который выноси кучу нопов: Код (Text): __declspec(naked) void pStorage(void) { __asm { nop nop .. 2. Делай две процедуры в основном модуле : Код (Text): __declspec(naked) void BeforeStorage(void) { __asm { xor eax,eax .. } } __declspec(naked) void AfterStorage(void) { __asm { mov eax, [pStorage+4] .. } } Дальше в настройках Linker->Optimization->Function Order создаёшь файл, в котором перечисляешь порядок следования функций в конечном файле (подродности в msdn). Соответственно делаешь так: BeforeNops pStorage AfterNops Получишь читаемость и буфер в нужном месте.
Код (Text): #define NOP_1 __asm nop; #define NOP_4 NOP_1 NOP_1 NOP_1 NOP_1 #define NOP_16 NOP_4 NOP_4 NOP_4 NOP_4 #define NOP_64 NOP_16 NOP_16 NOP_16 NOP_16 #define NOP_256 NOP_64 NOP_64 NOP_64 NOP_64 #define NOP_1024 NOP_256 NOP_256 NOP_256 NOP_256
хе-хе... да... в Boost.Preprocessor таких зачетных вещей много... особенно понравился там эмулятор рекурсии)))
для тех кто по сёрчу сюда попадет Код (Text): __asm { _emit 0x90 _emit 0x90 _emit 0x90 _emit 0xсс } 4-е байта "выделит". Как с массивом поступать = хз(