locals endl dots

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

  1. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Хочу больше узнать об директивах local и точках.
    В мануале как-то вскользь написанно и я не очень доверяю себе что я там прочитал.
    "The label whose name begins with dot is treated as local label"

    Вот такую штуку видел:
    красиво и понятно! Но наверное это только для структур,
    потому что, ксожалению такое не работает:
    Код (Text):
    1.         locals
    2.         a rd MAX_PATH
    3.         b rd MAX_PATH
    4.         endl
    а метка local выглядит неубедительно, я пробовал добавить ends препроцессор вроде бы не ругается)
    А поимённо перед каждой переменной писать local как-то не красиво,
    вот наверное точки для этого и есть, но я не в курсе.
     
  2. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Это к вопросу никак не относится. Тут про точки перед метками в коде (например .msg_loop: ).
    А вышеприведённый код компилируется без проблем.
     
  3. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    а как метки внутри процедуры указывать локальные?
     
  4. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. section '.code' executable readable writeable
    3. start:
    4.         sub rsp,8
    5.  
    6.         stdcall inf,\
    7.                 'LAYOUT_WINDOW_VISIBLE_MDICLIENT, MXGUI_LEFT, MXGUI_TOP, MXGUI_RIGHT, MXGUI_BOTTOM, MXGUI_SIZEX|MXGUI_SIZEY, 0, 24, %d, ',\
    8.                 '%d, 0',\
    9.                 '\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\Default\layout',\
    10.                 '\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\Default\layout\_burn.pmly',\
    11.                 'LAYOUT:LAYOUT_WINDOW_VISIBLE_BURN',\
    12.                 'align000'
    13.  
    14. proc inf,s0,s1,s2,s3,s4,s5
    15.  
    16.         .0 rd MAX_PATH
    17.         .1 rd MAX_PATH
    18.         .2 rd MAX_PATH
    19.         .3 rd MAX_PATH
    20.         .4 rd MAX_PATH
    21.  
    22.         invoke GetSystemMetrics,SM_CXSCREEN
    23.         invoke wsprintf,.0,[s0],eax
    24.  
    25.         invoke GetSystemMetrics,SM_CYSCREEN
    26.         sub eax,28
    27.         invoke wsprintf,.1,[s1],eax
    28.         invoke lstrcat,.0,.1
    29.  
    30.         invoke RtlZeroMemory,.2,MAX_PATH
    31.         invoke RtlZeroMemory,.3,MAX_PATH
    32.         invoke RtlZeroMemory,.4,MAX_PATH
    33.         invoke SHGetSpecialFolderPath,NULL,.2,CSIDL_COMMON_APPDATA,NULL
    34.         invoke SHGetSpecialFolderPath,NULL,.3,CSIDL_COMMON_APPDATA,NULL
    35.         invoke lstrcat,.2,[s2]
    36.         invoke lstrcat,.3,[s3]
    37.         invoke MultiByteToWideChar,CP_ACP,NULL,.2,-1,.4,MAX_PATH
    38.         invoke SHCreateDirectory,NULL,.4
    39.         invoke WritePrivateProfileString,[s4],[s5],.0,.3
    40. endp
    41.  
    42. exit:
    Первый раз пишу процедуру :) пока что-то не работает. Что тут нормально вообще?
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Нет. Это для всего.
    Поясните, что значит "не работает".
    Когда Вы уже перестанете объявлять строки через rd? Память под ascii-строку резервируется через rb, а память под unicode-строку через rw. И никак иначе.
    Макрос local допускает перечисление переменных через запятую. Поэтому local не обязательно перед каждой переменной писать.
    Точки не для этого. Локальные метки и локальные переменные в процедуре — абсолютно разные вещи. Макросы, имплементирующие локальные переменные в процедурах, реализуют их через особые (начинающиеся с двух точек) уникальные (объявленные посредством директивы (не макроса!) local) глобальные метки.

    При правильном стиле написания кода процедур любая метка, объявленная в процедуре, должна начинаться с одной точки (таким образом все внутренние метки получат приставку в виде имени процедуры и таким образом будут локальны для процедуры). Не обязательно это только для меток локальных переменных в процедурах, потому что на самом деле они становятся не метками, а символьными макроконстантами, которым приравниваются символы тех самых особых уникальных глобальных меток.
     
  6. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    я это не так давно стал делать именно потому что резервировать надёжнее, хотя я наверное ошибаюсь, мне кажется тут только проблемма в том что размер данных растёт от множества rd MAX_PATH, хотя мне не жалко.
    А я кажись не понял, я думал насчёт dd
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Ну и где тут макросы locals/endl используются? Точки, как я уже написал выше, как раз здесь не обязательны. Хотя для консистентности имеет смысл их использовать с эстетической точки зрения.
     
  8. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    ок! я это прежде написал чем ответ, хотел на примере спросить
     
  9. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Лучше бы я их не трогал, сколько проблем сразу с процедурами, даже pushad в 64 режиме нелегальная инструкция, бред. Мне кажется функции msnd вообще в процедуре нецелесообразно использовать.
    В MessageBox даже передать не могу ничего. Буду как раньше макросами кодить :\
    Хотел просто код уменьшить на повторяющихся участках. Нет времени через си и масм изучать это.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    А с какой стати она должна быть легальной?
    А вот это действительно бред.
    Правильно. Нафига нужен этот цемент, если первые три кирпича и на пва нормально держатся?
     
  11. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Кстати, насчёт rb, чем больше буфер тем оно лучше - rd MAX_PATH лучше для выравнивания 8-)