Как в студии в код втулить статический буфер нужного мне размера?

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 22 авг 2010.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Привет. Нужно с масма кусок кода портировать в Visual Studio 2008

    Есть вот такой код в масме

    Код (Text):
    1.  xor eax, eax
    2.  global_data db 4000h dup (90h)
    3.  mov eax, [global_data+4]
    Я хочу в студии оформить его асм-вставкой
    Делаю так

    Код (Text):
    1. _asm
    2. {
    3.  xor eax, eax
    4.  
    5. global_data:
    6.  // вот тут нужно как-то зарезервировать место размером 4000h
    7.  // малое число байт резервируется через _emit без проблем.
    8.  // а как поступить в моем случае? Я же не впихну 4000h эмитов.
    9.  // А если нужно будет мегабайт зарезервировать?
    10.  // Помогите советом или макросом. Заранее спасибо!
    11.  
    12.  mov eax, dword ptr [global_data+4]
    13. }
     
  2. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    А если до _asm вставить
    Код (Text):
    1. unsigned char global_data[0x4000];
    ?
    Да и вообще, сделай его глобальным.
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    db через emit нужно как-то делать..
     
  4. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Неа. Нужно именно статический буфер именно в том месте. Между теми двумя опкодами.

    Если вставить до асм но после начала функции - тогда буфер будет в стеке. А если до начала функции, то в секции rdata.
    Такое мне не подходит.
     
  5. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Т.е. тебе надо что б в секции кода было?
     
  6. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Мне нужно, чтобы в конкретном месте кода было 4000h nop-ов.
    Это не просто буфер. Сюда будут вставлен нужный мне код в будущем.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я обычно делаю в виде массивов, только надо опкоды знать для этого:
    Код (Text):
    1. BYTE Code[0x4005];
    2. for(DWORD t = 0; t < 0x4000; t++)
    3. { Code[t] = 0x90; } // nop
    4. *(BYTE*)&Code[0x4000] = 0xB8; // mov eax, x
    5. *(DWORD*)&Code[0x4001] = (DWORD)&Code[0]; // где 0 - там указать номер байта, на который нужно передать управление
    6. // забыл про ксор, добавишь сам в начало массива (опкод - 0xC033)
     
  8. jkilimov

    jkilimov New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2008
    Сообщения:
    15
    __declspec(naked) void pStorage(void)
    {
    __asm
    {
    nop
    nop
    ..

    Или так, если байты произвольны:
    __declspec(naked) void exe(void)
    {
    __asm
    {
    __emit 0x4e
    __emit 0x5b
    ..
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    4000h нопов в листинге кода... красотища)))
     
  10. jkilimov

    jkilimov New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2008
    Сообщения:
    15
    Тогда изврат:

    1. Создавай отдельный модуль, в который выноси кучу нопов:
    Код (Text):
    1. __declspec(naked) void pStorage(void)
    2. {
    3.     __asm
    4.     {
    5.         nop
    6.         nop
    7. ..
    2. Делай две процедуры в основном модуле :
    Код (Text):
    1. __declspec(naked) void BeforeStorage(void)
    2. {
    3.     __asm
    4.     {
    5.        xor eax,eax
    6. ..
    7.     }
    8. }
    9. __declspec(naked) void AfterStorage(void)
    10. {
    11.     __asm
    12.     {
    13.       mov eax, [pStorage+4]
    14. ..
    15.     }
    16. }
    Дальше в настройках Linker->Optimization->Function Order создаёшь файл, в котором перечисляешь порядок следования функций в конечном файле (подродности в msdn). Соответственно делаешь так:
    BeforeNops
    pStorage
    AfterNops

    Получишь читаемость и буфер в нужном месте.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. #define NOP_1 __asm nop;
    2. #define NOP_4 NOP_1 NOP_1 NOP_1 NOP_1
    3. #define NOP_16 NOP_4 NOP_4 NOP_4 NOP_4
    4. #define NOP_64 NOP_16 NOP_16 NOP_16 NOP_16
    5. #define NOP_256 NOP_64 NOP_64 NOP_64 NOP_64
    6. #define NOP_1024 NOP_256 NOP_256 NOP_256 NOP_256
     
  12. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    n0name
    Зачётно ;)
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хе-хе... да... в Boost.Preprocessor таких зачетных вещей много... особенно понравился там эмулятор рекурсии)))
     
  14. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    для тех кто по сёрчу сюда попадет
    Код (Text):
    1.     __asm {
    2.     _emit 0x90
    3.     _emit 0x90
    4.     _emit 0x90
    5.     _emit 0xсс
    6.     }
    4-е байта "выделит". Как с массивом поступать = хз(