VC++ и базонезависимый код

Тема в разделе "WASM.SOFTWARE", создана пользователем hello_world, 19 дек 2006.

  1. hello_world

    hello_world New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2003
    Сообщения:
    55
    Адрес:
    москва
    Может кто знает, как заставить компилер Visual C++ 2003
    инициализировать все локальные строки кодом?

    Например, вот здесь:
    Код (Text):
    1. void myproc()
    2. {
    3. char buf[] = "string";
    4. printf("%s\n",buf);
    5. }
    строка будет инициализирована так:
    Код (Text):
    1. _DATA   SEGMENT
    2. $SG74453 DB 'string', 00H
    3. ...
    4.     mov eax, DWORD PTR $SG74453
    5.     mov DWORD PTR _buf$[ebp], eax
    6.     mov cx, WORD PTR $SG74453+4
    7.     mov WORD PTR _buf$[ebp+4], cx
    8.     mov dl, BYTE PTR $SG74453+6
    9.     mov BYTE PTR _buf$[ebp+6], dl
    но если написать ту же строку через одинарные скобки:
    char buf[] = {'s','t','r','i','n','g',0};

    то все данные проинициализируются "правильно":
    Код (Text):
    1.     mov BYTE PTR _buf$[ebp], 115        ; 00000073H
    2.     mov BYTE PTR _buf$[ebp+1], 116      ; 00000074H
    3.     mov BYTE PTR _buf$[ebp+2], 114      ; 00000072H
    4.     mov BYTE PTR _buf$[ebp+3], 105      ; 00000069H
    5.     mov BYTE PTR _buf$[ebp+4], 110      ; 0000006eH
    6.     mov BYTE PTR _buf$[ebp+5], 103      ; 00000067H
    7.     mov BYTE PTR _buf$[ebp+6], 0
    Можно ли как-то заставить компилер класть все текстовые строки
    сразу в стек, а не в секцию данных?
     
  2. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Наврятли. РЕгистры баваю же разные и я не думаю что в регистр ax влезет целая строка. т.е в него входит тока по символу.
     
  3. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> РЕгистры баваю же разные и я не думаю что в регистр ax влезет целая строка. т.е в него входит тока по символу.
    причём здесь регистры, человеку нужно чтоб строка хранилась в стеке вместе с локальными переменными =)

    по сабжу:
    имхо, врядли... разве что какой-то макрос написать типа char str[] = INTO_STACK("shit"), чтоб он str инициализировал как {'s', 'h', 'i', 't', '\0'}, ито хз, реально ли...
     
  4. hello_world

    hello_world New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2003
    Сообщения:
    55
    Адрес:
    москва
    Cr4sh
    Во-первых, стандартный препроцессор C++ поддерживает только
    тупую макроподстановку, поэтому такой макрос просто не напишешь.
    Во-вторых, это не решает проблемы со строками, которые инициализируются
    при вызове функций (например, myproc("mystring");).

    Пока я вижу только 2 выхода: или прогонять сорец перед компиляцией через
    свой собственный препроцессор, или искать другой компилятор.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    или юзать masm/fasm :)
     
  6. hello_world

    hello_world New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2003
    Сообщения:
    55
    Адрес:
    москва
    Asterix
    это для лохов. настоящий программер все пишет в машкодах
     
  7. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    hello_world
    Хорошо ты себя обласкал. Ты же пишеш на С++.
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    hello_world
    если new/delete юзать?
     
  9. opennetworks

    opennetworks New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    436
    Смотря под что:)

    Если бы не сроки сдачи проектов -- я бы на асме писал:)
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    А как вири на си пишут? Может кто-нибудь исходник кинуть? И что с netlux-ом?