db в MSVSC

Тема в разделе "WASM.BEGINNERS", создана пользователем JCronuz, 5 май 2010.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Ассемблерный код
    Код (Text):
    1. LL   db "LoadLibraryA",0
    2. GP         db "GetProcAddress",0
    3. EP   db "ExitProcess",0
    4. U32  db "user32",0
    5. MB   db "MessageBoxA",0
    Как его записать в MSVSC в виде ассембленой вставки? Знаю что используется _emit, но не нашел как использовать.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    JCronuz
    разбивать на буквы:
    Код (Text):
    1. #define DB __asm _emit
    2. __asm{
    3.    DB 'L' DB 'o' DB 'a' ....
    можно сделать DD и писать сразу по 4: 'Load' 'Libr' ...
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    GoldFinch
    Спасибо, а есть варианты написать макрос, что бы писать строчкой, а не по отдельности символы?

    Что то типа такого:

    Код (Text):
    1. APIs:
    2. DB "LoadLibraryA" DB 0
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    JCronuz
    свой препроцессор
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    В MASM есть директива повторения, а в сях имеется?
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    нет. там вообще ничего для данных нет
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ассемблерные вставки Visual C++ не предназначены для этого.
    Выносите в отдельный модуль .asm, компилируйте ассемблером (точнее сказать, ассемблируйте ассемблером) и линкуйте вместе с другими сишными модулями.
     
  8. UnderCtl

    UnderCtl New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2010
    Сообщения:
    16
    Можно fasm юзать для генерации MSCOFF obj ...
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    UnderCtl
    о чем я и написал
     
  10. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Имелось в виду
    Код (Text):
    1. // IN: x - строка которая будет представлятся по-символьно
    2. #define DB(x) int i = strlen(x);\
    3.     for (int j=0; j<i; j++){\
    4.     char ch=x[i];\
    5.     _asm _emit ch\
    6.      }\
    7.     _asm _emit 0
    8. [...]
    9. DB ("LoadLibraryA")
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    JCronuz
    надеюсь ты не собрался юзать код который счя написал?)
     
  12. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    GoldFinch
    Естественно,это псевдокод, возможно подобное написать?
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    foo(){
    char* str = "некая строка";

    __asm {
    mov eax,str
    ...
    }


    если планируется менять строку прямо по месту, то в С коде непохо хоть одну запись в нее произвести. на всякий
     
  14. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Да так наверное нельзя делать, потому что мой код базонезависимый, думаю что просто строку всталять в стуб не правильно.
     
  15. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >>Имелось в виду
    чуть подстул не упал, больше такого не пишите ;)))
     
  16. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Не могу понять, что происходит? что там во псевдокоде вас удивляет? я как получше объяснить пытаюсь изобрел. Сам принцип я думаю уловили. На счет выноса асмового модуля и линковки, так сейчас пробую.

    По символьно отдельно можно значит через
    Код (Text):
    1. _emit 'L'
    2. _emit 'o'
    3. _emit 'a'
    4. _emit 'd'
    5. _emit 'L'
    6. _emit 'i'
    7. _emit 'b'
    8. _emit 'r'
    9. _emit 'a'
    10. _emit 'r'
    11. _emit 'y'
    12. _emit 'A'
    А к строке через массив нельзя?

    Код (Text):
    1. // IN: x - строка которая будет представлятся по-символьно
    2. #define DB(x) int i = strlen(x);\
    3.     for (int j=0; j<i; j++){\
    4.     char ch=x[i];\
    5.     _asm _emit ch\
    6.      }\
    7.     _asm _emit 0
    8. [...]
    9. DB ("LoadLibraryA")
    Почему?
     
  17. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    JCronuz
    есть мысль, которую где-то слышал, что может не db а тип из цэ/це плус плус подобрать типа стринг что-ли который эквивалентен db

    EvilsInterrupt
    под стол - я еще понимаю, но под стул - я там просто не помещусь :))))
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    а ся знает, что код включающий вашу асм вставку базонезависимый?

    ну, напишите

    foo(){
    char str[] = "строка";

    по идее, оно должно массив создать в стеке и в стеке же его и залить строкой. вы б дизасм посмотрели вместо гадать на пальцах, что наверно можно, а что нет
     
  19. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    qqwe
    Не обязательно. Массив-то в стеке, а вот строка-инициализатор может быть и в глобальных данных. что-то типа такого:
    Код (Text):
    1. .data
    2. str db "строка", 0
    3. foo:
    4.     sub esp, 8
    5.     lea esi, [str]
    6.     lea edi, [esp]
    7.     mov ecx, 7
    8.     rep movsb
    9.     ...
    На коротких строках такое вряд ли будет, насколько я знаю MSVC, скорее MOV'ом константы накидает, а вот на длинных - вполне. Тогда базонезависимости не будет :dntknw:
     
  20. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    *
    Код (Text):
    1. .data
    2. str ...
    3. .code
    4. foo:
    5.    ...
    зараза, как же несподручно без редактирования :dntknw: