MASM - структуры и массивы

Тема в разделе "WASM.BEGINNERS", создана пользователем dsoft, 12 апр 2011.

  1. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Знатоки, подскажите. На Delphi имеется такое описание:

    Код (Text):
    1. type
    2.   TLevel     = array[0..19, 0..15] of Byte;
    3.   TLevels   = array of TLevel;
    4.  
    5.   TMyRec     = packed record
    6.     ...
    7.     UpLevel,
    8.     DnLevel  : TLevel;
    9.   end;
    10.  
    11. var
    12.   Levels      : TLevels;
    13.   TmpLevels   : TLevel;
    14.   MyRec       : TMyRec;
    каким образом наиболее близко это перевести в MASM?
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Судя по данным, подразумевается набор уровней к матричной игре (т.е. в основе лежит двумерный массив, 0=пусто, 1=что-то... FF=сплошная стенка). Например, типа SOKOBAN :) или LodeRunner. Каждый уровень 20*16, байт. Ну и? Логика Дельфи мало чем поможет.

    TmpLevel db 320 dup 0
    LABEL MyRec
    XPos db 0
    YPos db 0
    RecLevel db 320 dup 0
    Levels db (320*n) dup ?

    Обратится к элементу TmpLevel [5,12]: по адресу TmpLevel+12*16+5 (вообще, правильней может быть и +5*20+12, но умножить на 16 проще - степень двойки, а как именно в сплошном байтовом массиве мы определяем столбцы, строки и их порядок - это наше личное дело). Наверно (лень разбираться) можно задать все это в виде структур, и использовать в виде структур. Но... Когда мы дойдем до описания 3-мерного массива Levels, структуры нам мало помогут - все равно работать с ним придется на "низком уровне" - для выбора уровня сдвигаться на нужное количество раз по 320 байт, это никак не записать одной строчкой. А следовательно, нечего и заморачиваться. Вдобавок, если реальных значений в массиве 16 и меньше, в байт мож4но убирать по 2 элемента (а если 4 как в упомянутом сокобане - пусто, ящик, место для ящика, стенка - то и вообще по 4 элемента в байт) - оптимизация по размеру данных. Я к тому, что какой смысл писать на ассемблере в точности так же, как на Дельфи?
     
  3. dsoft

    dsoft Евгений

    Публикаций:
    0
    Регистрация:
    20 май 2007
    Сообщения:
    54
    Адрес:
    Омск
    Я и не говорил, что так же как на Дельфи. Вопрос в том, что в Дельфи можно определить:
    Код (Text):
    1.  TLevel     = array[0..19, 0..15] of Byte;
    как тип, в MASM-е же нужно как:
    Код (Text):
    1.   TLevel    BYTE    320 dup(?)
    соответственно в структуре я уже не могу на это сослаться. Вот и затормозил. А игра, действительно, Sokoban, когда то написал на Дельфи, теперь решил попробовать, хватит ли сил переписать на ассемблере. Далее:
    Код (Text):
    1. TLevels    = array of TLevel;
    динамический массив, заранее размер неизвестен, но уже имеется ссылка на него, в асм-е такое не реализуешь.
    Думаю использовать create_array.