Хочу больше узнать об директивах local и точках. В мануале как-то вскользь написанно и я не очень доверяю себе что я там прочитал. "The label whose name begins with dot is treated as local label" Вот такую штуку видел: красиво и понятно! Но наверное это только для структур, потому что, ксожалению такое не работает: Code (Text): locals a rd MAX_PATH b rd MAX_PATH endl а метка local выглядит неубедительно, я пробовал добавить ends препроцессор вроде бы не ругается) А поимённо перед каждой переменной писать local как-то не красиво, вот наверное точки для этого и есть, но я не в курсе.
Это к вопросу никак не относится. Тут про точки перед метками в коде (например .msg_loop: ). А вышеприведённый код компилируется без проблем.
Code (Text): include '%fasm%/win64ax.inc' section '.code' executable readable writeable start: sub rsp,8 stdcall inf,\ 'LAYOUT_WINDOW_VISIBLE_MDICLIENT, MXGUI_LEFT, MXGUI_TOP, MXGUI_RIGHT, MXGUI_BOTTOM, MXGUI_SIZEX|MXGUI_SIZEY, 0, 24, %d, ',\ '%d, 0',\ '\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\Default\layout',\ '\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\Default\layout\_burn.pmly',\ 'LAYOUT:LAYOUT_WINDOW_VISIBLE_BURN',\ 'align000' proc inf,s0,s1,s2,s3,s4,s5 .0 rd MAX_PATH .1 rd MAX_PATH .2 rd MAX_PATH .3 rd MAX_PATH .4 rd MAX_PATH invoke GetSystemMetrics,SM_CXSCREEN invoke wsprintf,.0,[s0],eax invoke GetSystemMetrics,SM_CYSCREEN sub eax,28 invoke wsprintf,.1,[s1],eax invoke lstrcat,.0,.1 invoke RtlZeroMemory,.2,MAX_PATH invoke RtlZeroMemory,.3,MAX_PATH invoke RtlZeroMemory,.4,MAX_PATH invoke SHGetSpecialFolderPath,NULL,.2,CSIDL_COMMON_APPDATA,NULL invoke SHGetSpecialFolderPath,NULL,.3,CSIDL_COMMON_APPDATA,NULL invoke lstrcat,.2,[s2] invoke lstrcat,.3,[s3] invoke MultiByteToWideChar,CP_ACP,NULL,.2,-1,.4,MAX_PATH invoke SHCreateDirectory,NULL,.4 invoke WritePrivateProfileString,[s4],[s5],.0,.3 endp exit: Первый раз пишу процедуру пока что-то не работает. Что тут нормально вообще?
Semiono Нет. Это для всего. Поясните, что значит "не работает". Когда Вы уже перестанете объявлять строки через rd? Память под ascii-строку резервируется через rb, а память под unicode-строку через rw. И никак иначе. Макрос local допускает перечисление переменных через запятую. Поэтому local не обязательно перед каждой переменной писать. Точки не для этого. Локальные метки и локальные переменные в процедуре — абсолютно разные вещи. Макросы, имплементирующие локальные переменные в процедурах, реализуют их через особые (начинающиеся с двух точек) уникальные (объявленные посредством директивы (не макроса!) local) глобальные метки. При правильном стиле написания кода процедур любая метка, объявленная в процедуре, должна начинаться с одной точки (таким образом все внутренние метки получат приставку в виде имени процедуры и таким образом будут локальны для процедуры). Не обязательно это только для меток локальных переменных в процедурах, потому что на самом деле они становятся не метками, а символьными макроконстантами, которым приравниваются символы тех самых особых уникальных глобальных меток.
я это не так давно стал делать именно потому что резервировать надёжнее, хотя я наверное ошибаюсь, мне кажется тут только проблемма в том что размер данных растёт от множества rd MAX_PATH, хотя мне не жалко. А я кажись не понял, я думал насчёт dd
Semiono Ну и где тут макросы locals/endl используются? Точки, как я уже написал выше, как раз здесь не обязательны. Хотя для консистентности имеет смысл их использовать с эстетической точки зрения.
Лучше бы я их не трогал, сколько проблем сразу с процедурами, даже pushad в 64 режиме нелегальная инструкция, бред. Мне кажется функции msnd вообще в процедуре нецелесообразно использовать. В MessageBox даже передать не могу ничего. Буду как раньше макросами кодить :\ Хотел просто код уменьшить на повторяющихся участках. Нет времени через си и масм изучать это.
Semiono А с какой стати она должна быть легальной? А вот это действительно бред. Правильно. Нафига нужен этот цемент, если первые три кирпича и на пва нормально держатся?