Почему удаётся создать массив только с 46-ю элементами?

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

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья!
    Это прикол, наверное, у разработчиков такой. Очень смешно, ничего не скажешь.

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8.  
    9. .code section
    10.  bufer db 1 dup  (\
    11.  04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, \
    12.  004h, 000h, 000h, 000h, 0ffh, 0ffh, 000h, 000h, \
    13.  000h, 0b8h, 000h, 000h, 000h, 000h, 000h, 000h, \
    14.  000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h, \
    15.  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, \
    16.  000h, 000h, 000h, 000h, 000h, 000h)
    17.  
    18. .code
    19.  
    20.  start:
    21.  invoke ExitProcess, 0
    22. end start
    Видите? Создаю секцию, а вней массив из 46-ти элементов. Но попробуя я туда приписать ещё один, то выскакивает ошибка!

    А если задать размер, то ещё смешнее, блин. Если так написать:

    Код (Text):
    1.  bufer db 80 dup  (\
    2.  04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h, \
    3.  004h, 000h, 000h, 000h, 0ffh, 0ffh, 000h, 000h, \
    4.  000h, 0b8h, 000h, 000h, 000h, 000h, 000h, 000h, \
    5.  000h, 000h, 040h, 000h, 000h, 000h, 000h, 000h, \
    6.  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, \
    7.  000h, 000h, 000h, 000h, 000h, 000h)
    То получится 80, но не элементов, а массивов! 80 массивов. Очень смешно.
    Ладно, пробую по-другому, вот так:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8.  
    9. .code section
    10.  bufer db 0dh, 0ch,  04dh, 05ah, 090h, 000h, 003h, 000h, \
    11.  000h, 000h, 004h, 000h, 000h, 000h, 0ffh, 0ffh, \
    12.  000h, 000h, 000h, 0b8h, 000h, 000h, 000h, 000h, \
    13.  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, \
    14.  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, \
    15.  000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    16.  
    17. .code
    18.  
    19.  start:
    20.  invoke ExitProcess, 0
    21. end start
    Всё компилится и создаётся буфер из 48-ми элементов. Но не из 49! Припиши я хоть ещё один байт и выскакивает ошибка компиляции.

    ...Ребята, что за цифры магические- 46 байт, 48 байт... Мне надо большой массив инициализировать, несколько тыщ элементов. В С без проблем было...
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    А обязательно весь массив в одном операторе инициализировать?
    Можно, например, так сделать:
    Код (Text):
    1. bufer:
    2.         db 0dh, 0ch,  04dh, 05ah, 090h, 000h, 003h, 000h
    3.         db 000h, 000h, 004h, 000h, 000h, 000h, 0ffh, 0ffh
    4.         db 000h, 000h, 000h, 0b8h, 000h, 000h, 000h, 000h
    5.         db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    6.         db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    7.         db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    8.         db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
    P.S. В фасме нет ограничения на размер оператора. :derisive:
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да нет, конечно, главное, чтобы байты подряд все шли. ПОлучиось спасибо. Вы извините, я в асме не очень, в С больлше.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    300 символов ограничение что ли получается:?
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Ustus
    может даже 256
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Rockphorr
    Не, там явно больше, если конечно текст точно скопирован...
     
  7. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    Масмовские тараканы?
    Венда - зло:)
     
  8. Mankubus

    Mankubus New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2009
    Сообщения:
    76
    Rockphorr,Ustus

    Вы не совсем правы.

     
  9. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mankubus
    Спасибо, не знал...
    действительно,
    5+46*2+1=98 - еще +2 и все.
    второй вариант 2+48*2=98
    Интересно. А откуда инфа, если не секрет? Я не то, чтобы сильно доки по масму читал, но признаться об ограничении на длину строки не знал :dntknw:
     
  10. Mankubus

    Mankubus New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2009
    Сообщения:
    76
    Ustus, инфа с техсаппорта MS =)
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это не прикол, это синтаксис MASM/TASM.
    Документацию не пробовал читать для начала?
    label db <количество повторов> dup(<что повторять>)
    Так что bufer db 80 dup (....) это и есть создание восьмидесяти массивов с содержимым указанным в скобках.
    Нужен один массив - пиши через db как l_inc показал.

    PS: ограничения тут не причём...