Сам себе Iczelion

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl_, 11 май 2007.

Метки:
  1. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    У Iczelion в 26 сплеш поверх окна всплывает - это нормально или глюк?
    А нельзя сплеш вообще над десктопом выполнить без всяких окон? Нафиг он как child window нужен!
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Semiono
    Судя по переводу Aquila так и должно быть -- читай урок внимательно, можно конечно и над desktop'ом
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Semiono
    Так тебе FASM? ищи на #113-115 там и "простой bitmap"
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Semiono
    Держи анимированный gif в аттаче сорц, длл, картинка и ехе :)
    идея одного грека: Antonis Kyprianou
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Semiono лучше этот без ошибки :)
     
  6. Semiono

    Semiono New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    752
    Гы! GIF прикольтный :)
    Mikl___, хватит на wasm аттачить, давай на рапиду? всё кривое качается. битое!
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Semiono
    держи 25-26 переделанные уроки на FASM (в аттаче картинки сорц и ехе)
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Вот за это я и не люблю кошек типа
    invoke
    .IF
    SDWORD

    в них подводных граблей тьма
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Mikl___
    Я согласен с товей идеей первые несколько уроков посвятить структуре программы
    1 сделать универсальный bat файл
    2 вычленить в коде функцию WinMain
    3 подобрать хорошие асм реализации case переходов в функции окна
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    могу поделиься своим кирпичом при строительстве WinMain

    ;=======[ SUBROUTINE ]============================
    ;
    ;-------------------------------------------------
    ; Return:
    ;-------------------------------------------------
    ; Parameters:
    ;-------------------------------------------------
    @Routine_private\
    Process_Message
    push EDI
    ;-----------------------------------------
    lea EDI,MyMessage
    $loop:
    xor EAX,EAX
    push EAX
    push EAX
    push EAX
    push EDI
    call GetMessage
    or EAX,EAX
    jz $exit
    ;-----------------------------------------
    push EDI
    call TranslateMessage
    ;-----------------------------------------
    push EDI
    call DispatchMessage
    jmp $loop
    ;-----------------------------------------
    $exit:
    pop EDI
    @Routine_end
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Спасибо, Rockphorr!
    Только несколько "мелочных" замечаний к твоему "кирпичу" -- я уже отвечал hapr в #166, что цель топика создание минимальных по размеру программ под WinXP поэтому:
    1) вызов Routine_Process_Message это лишние 5 байт, чем если бы код продцедуры был подставлен напрямую
    2) Хотя это и не принято но так как API-функции сохраняют значения ESP, EBP, EBX, EDI, ESI то я с чистой совестью использую эти регистры для сохранения в них параметров, т.е. в Routine_Process_Message можно обойтись без начального PUSH EDI и конечного POP EDI итого минус еще два байта
    3) указатель на MyMessage передается через lea EDI,MyMessage причем для Routine_Process_Message MyMessage не является локальной переменной поэтому вместо lea EDI,MyMessage (6 байт) разумнее было выбрать mov EDI,offset MyMessage (5 байт) еще минус один байт
    4) для передачи трех 0 для GetMessage вы каждый раз при входе в цикл обнуляете eax, хотя достаточно поместить один раз 0 в ebx и использовать его содержимое для засылки в стек NULL, FALSE, FILE_BEGIN, PIPE_CLIENT_END, GMEM_FIXED и т.п.
    5) можно упростить цикл обработки сообщений, без проверки возвращает ли GetMessageA в eax 0 поместив в обработчик WM_DESTROY вместо PostQuitMessage функцию ExitProcess
    Код (Text):
    1. @@WM_DESTROY: push 0    ;завершение программы
    2.         call _imp__ExitProcess@4
    минус еще 4 байта (or eax,eax/jz $exit)
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    ИМХО лучше не минимальных а оптимальных по размеру другими словами
    минимальность при условии максимальности удобства повторного использования
    у меня есть идея что подобные стандартные функции как Process_Message можно поместить вообще в собственную dll и все собственные программы станут тем короче чем больше таких функций в dll
    Рост dll (добавление туда функций) будет происходить по ходу переработанного курса уроков
    ...передается через EDI, который грузиться lea EDI,MyMessage...
    ИМХО в курсе уроков такая формулировка яснее
    загрузку адреса в регистр лучше делать макросом в котором предусмотрено средство выбора меж lea() и mov offset()
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Rockphorr
    Ты просто не умеешь их готовить :))
    Прелесть invoke заценишь когда часок другой помедитируешь над странным глюком в программе, прежде чем наконец заметишь что передал в функцию неправильное количество параметров или забыл что она C decl или наоборот не C decl. Иногда конечно call удобнее потому как гибче, но это исключения подтверждающие правила :))

    Код (Text):
    1. @echo off
    2. @REM Сначала ассемблирует, затем ищет %1.rc и если нет то rsrc.rc
    3. @   echo Работает только с диска на котором установлен MASM32 !!!
    4. @   echo ╨рсюЄрхЄ Єюы№ъю ё фшёър эр ъюЄюЁюь єёЄрэютыхэ MASM32 !!!
    5. @REM ----------- АССЕМБЛИРОВАНИЕ ---------------
    6. @D:\masm32\bin\ml /c /coff /nologo %1.asm
    7. @  if errorlevel 1 goto ErrAsm
    8. @   echo %1.asm файл успешно скомпилирован !!!
    9. @   echo %1.asm Їрщы єёях°эю ёъюьяшышЁютрэ !!!
    10. @   echo _
    11. @REM ----------- КОМПИЛЯЦИЯ РЕСУРСОВ (если есть) ---------------
    12. @if not exist %1.rc goto find_rsrc_rc
    13. @   D:\masm32\bin\rc /v /forsrc.res %1.rc
    14. @     if errorlevel 1 goto ErrResCompil1
    15. @   goto Last_Res_Compil
    16. :find_rsrc_rc
    17. @if not exist rsrc.rc goto SkipResCompil
    18. @   D:\masm32\bin\rc /v /forsrc.res rsrc.rc
    19. @     if errorlevel 1 goto ErrResCompil1
    20. :Last_Res_Compil
    21. @   D:\masm32\bin\cvtres /machine:ix86 rsrc.res
    22. @     if errorlevel 1 goto ErrResCompil2
    23. @   echo Ресурсы успешно скомпилированы !!!
    24. @   echo ╨хёєЁё√ єёях°эю ёъюьяшышЁютрэ√ !!!
    25. @   echo _
    26. :SkipResCompil
    27. @REM ----------- ЛИНКОВАНИЕ  ---------------
    28. @if not exist rsrc.obj goto NoRes
    29. @   D:\masm32\bin\Link /RELEASE /SUBSYSTEM:WINDOWS /NOLOGO %1.obj rsrc.obj
    30. @     if errorlevel 1 goto ErrLink
    31. @   echo %1.exe файл успешно слинкован !!!
    32. @   echo %1.exe Їрщы єёях°эю ёышэъютрэ !!!
    33. @   del %1.obj
    34. @   del rsrc.res
    35. @   del rsrc.obj
    36. @   %1.exe
    37. @  goto TheEnd
    38. :NoRes
    39. @   D:\masm32\bin\Link /RELEASE /SUBSYSTEM:WINDOWS /NOLOGO %1.obj
    40. @     if errorlevel 1 goto ErrLink
    41. @   echo %1.exe файл успешно слинкован без ресурсов!!!
    42. @   echo %1.exe Їрщы єёях°эю ёышэъютрэ схч ЁхёєЁёют!!!
    43. @   del %1.obj
    44. @   %1.exe
    45. @  goto TheEnd
    46. @REM ----------- СООБЩЕНИЯ ОБ ОШИБКАХ ---------------
    47. :ErrResCompil1
    48. @   echo Ошибка при компиляции ресурсов
    49. @   echo ╬°шсър яЁш ъюьяшы Ўшш ЁхёєЁёют
    50. @goto TheEnd
    51. :ErrResCompil2
    52. @   echo Ошибка при преобразовании ресурсов в *.obj файл
    53. @   echo ╬°шсър яЁш яЁхюсЁрчютрэшш ЁхёєЁёют т *.obj Їрщы
    54. @goto TheEnd
    55. :errasm
    56. @   echo Ошибка при ассемблировании
    57. @   echo ╬°шсър яЁш рёёхьсышЁютрэшш
    58. @goto TheEnd
    59. :ErrLink
    60. @   echo Ошибка при связывании
    61. @   echo ╬°шсър яЁш ёт ч√трэшш
    62. @goto TheEnd
    63. :TheEnd
    мой вариант универсального RunMasm.bat для masm32 - запускать: RunMasm имя_asm_файла (без расширения .asm - оно подставляется автоматически виде .asm, .obj, .exe поэтому и указывать его сразу нельзя). Сообщения выводятся в двух кодировках, чтобы можно было их прочитать и в консоли и после перенаправления в файл.

    Лично мне не нравится main в асм программах. Дело даже не в лишнем вызове/возврате, а в её неуместности. В кросплатформенном С она полезна тем что скрывает платформозависимый код инициализации/завершения, в С++ к этому добавляется автовызов деструкторов, да и само понятие функции в С/С++ является базовой единицей структурирования программы. А в асме где ни то ни другое ни третье не актуально она имхо выглядит просто нелепо :)) А если всё-таки хочется спрятать типовой стартовый/завершающий код, то имхо для этого удобнее макросы, которые в асм и есть основная единица структурирования программы, а функции идут уже после них (в С/С++ всё наоборот - в С макросы вторичны, а в С++ почти неуместны).

    Мой комплект masm32 макросов для табличного case - не идеал оптимизации конечно, но как вариант имхо пойдут, во всяком случае слепил их давно и пока особой потребности переделать не испытывал:
    Код (Text):
    1. ;=======================================================================================
    2. ;-----------------------------------------------------------------------------
    3. ; ---------------- Табличная обработка сообщений -----------------
    4. ;.code  ; Макросы рассчитаны на применение из кодового сегмента !!!
    5. ;Begin_TCASE {Имя таблицы}
    6. ;  TCASE {Сообщение}   , offset {Обработчик} ; Комментарий
    7. ;End_TCASE {Имя таблицы}
    8. ;  TSWITCH {Имя таблицы}, {сообщение}
    9.  
    10. ;-----------------------------------------------------------------------------
    11. ;   Начать таблицу сообщений
    12. Begin_TCASE MACRO TCase_Table_Name
    13.  .data
    14.    TCase_Table_Name = $
    15. ENDM
    16.  
    17. ;-----------------------------------------------------------------------------
    18. ;   Элемент таблицы сообщений Item Message Table
    19. TCASEc MACRO Item, Adr_Proc
    20.     dd Item, Adr_Proc
    21. ENDM
    22.  
    23. ;--------------------------------------------------------------------------------
    24. ;  Элемент таблицы сообщений Item Message Table для пользовательского сообщения
    25. TCASEv MACRO Item, Adr_Proc
    26.     Item dd 0, Adr_Proc
    27. ENDM
    28.  
    29. ;-----------------------------------------------------------------------------
    30. ;   Завершить таблицу сообщений
    31. End_TCASE MACRO TCase_Table_Name
    32.    TCase_Table_Name&_Size = $ - TCase_Table_Name
    33.    TCase_Table_Name&_N_Items = TCase_Table_Name&_Size / 8
    34.  .code
    35. ENDM
    36.  
    37. ;-----------------------------------------------------------------------------
    38. ;   Обработать сообщение с помощью таблицы
    39. TSWITCH MACRO Table_Name, Message
    40. LOCAL End_Find, Exit_m
    41.   IFDIFI <Message>, <EAX>   ; исключить повторное присвоение ЕАХ
    42.     mov EAX, Message
    43.   ENDIF
    44.     mov EDI, offset Table_Name      ; Таблица
    45.     mov ECX, Table_Name&_N_Items    ; Количество элементов в таблице
    46.     @@:
    47.       cmp EAX, [EDI]
    48.         jz End_Find
    49.       add EDI, 8
    50.       sub ECX, 1
    51.     jnz @B
    52.     jmp Exit_m      ; Список кончился совпадения не было
    53.     End_Find:
    54.       jmp DWORD PTR [EDI + 4] ; При совпадении перейти на метку из таблицы (следует за найденным идентификаторм)
    55.   Exit_m:
    56. ;       Макрос осуществляет УХОД НА МЕТКУ при совпадении !!!
    57. ; Если совпадений не найдено выполняются комманды непосредственно за TSWITCH
    58. ENDM
    Пример использования:
    Код (Text):
    1. ;============================================================================
    2. ;       Основная программа для базового окна
    3. WinProc PROC uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
    4. LOCAL   PAST:PAINTSTRUCT    ; Структура для работы с экраном
    5.  
    6. ;   Таблица сообщений главного окна приложения
    7.    Begin_TCASE BW_Message_Table
    8.      TCASEc WM_TIMER        , OFFSET BW_WM_TIMER        ; Срабатывания таймера
    9.      TCASEc WM_NOTIFY       , OFFSET BW_WM_NOTIFY       ; Нотификации
    10.      TCASEc WM_COMMAND      , OFFSET BW_WM_COMMAND      ; Меню
    11.      TCASEc WM_SHOWWINDOW   , OFFSET BW_WM_SHOWWINDOW   ; Показ окна
    12.      TCASEc WM_SIZE     , OFFSET BW_WM_SIZE     ; Изменение размера
    13.      TCASEc WM_CHAR     , OFFSET BW_WM_CHAR     ; Символ с клавиатруы
    14.      TCASEc WM_LBUTTONDOWN  , OFFSET BW_WM_LBUTTONDOWN  ; Левая кнопка мыши
    15.      TCASEc WM_MOUSEMOVE    , OFFSET BW_WM_MOUSEMOVE    ; Перемещение мыши
    16.      TCASEc WM_KEYDOWN      , OFFSET BW_WM_KEYDOWN      ; Нажатие клавиши
    17.      TCASEc WM_KEYUP        , OFFSET BW_WM_KEYUP        ; Отпускание клавиши
    18.      TCASEc WM_SYSKEYDOWN   , OFFSET BW_WM_SYSKEYDOWN   ; Нажатие клавиши
    19.      TCASEc WM_SYSKEYUP     , OFFSET BW_WM_SYSKEYUP     ; Отпускание клавиши
    20.      TCASEc WM_PAINT        , OFFSET BW_WM_PAINT        ; Изменение фона
    21.      TCASEc WM_MOUSEWHEEL   , OFFSET BW_WM_MOUSEWHEEL   ; Перемещение колеса мыши
    22.      TCASEc WM_SETFOCUS     , OFFSET BW_WM_SETFOCUS     ; Базовое окно получило фокус ввода
    23.      TCASEc WM_CREATE       , OFFSET BW_WM_CREATE       ; Создание окна  
    24.      TCASEc WM_CLOSE        , OFFSET BW_WM_CLOSE        ; Требование выхода
    25.    End_TCASE BW_Message_Table
    26.     TSWITCH BW_Message_Table, [wmsg]    ; Табличный переход к обработчику сообщений
    27.  
    28. ;       Стандартная обработка оконных сообщений
    29.     invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
    30.    ret
    31.  
    32. ;===========================================================================
    33. ;               Создание окна
    34. BW_WM_CREATE:
    35.  
    36.  xor eax, eax   ; === Главное окно готово к открытию ===
    37. ret
    38. ;===========================================================================
    39.                 ; Требование выхода
    40. ExitWithPodtv:  ; Вежливое
    41.       invoke MessageBox, [hwnd], zSTR('Вы уверены, что хотите завершить работу программы ?'), \
    42.                      zSTR('Подтверждение выхода'), MB_YESNO or MB_ICONQUESTION
    43. .IF eax == IDYES
    44. BW_WM_CLOSE:    ; Безоговорочное
    45.    invoke PostQuitMessage, 0    ; Подтвердить готовность окна к закрытию
    46. .ENDIF
    47.    xor eax, eax
    48.  ret
    49. ;===========================================================================
    50.                                 ; Показ окна
    51. BW_WM_SHOWWINDOW:
    52.  
    53.    xor eax, eax
    54.  ret
    55. ;===========================================================================
    56.                                 ; Изменение размера
    57. BW_WM_SIZE:
    58.  
    59.    xor eax, eax
    60.  ret
    61. ;---------------------------------------------------------------------------
    62. ;===========================================================================
    63.                                 ; Прорисовка окна
    64. BW_WM_PAINT:
    65.  
    66.   xor eax, eax
    67.  ret
    68. ;===========================================================================
    69.                                 ; Символ с клавиатруы
    70. BW_WM_CHAR:
    71.    .IF [wparam] == ' '
    72.       invoke InvalidateRect, [hwnd], 0, True
    73.    .ELSEIF [wparam] == 27
    74.       jmp ExitWithPodtv
    75.    .ENDIF
    76.    xor eax, eax
    77.  ret
    78. ;===========================================================================
    79.                                 ; Левая кнопка мыши
    80. BW_WM_LBUTTONDOWN:
    81.  
    82.    xor eax, eax
    83.  ret
    84. ;===========================================================================
    85.                                 ; Перемещение мыши
    86. BW_WM_MOUSEMOVE:
    87.  
    88.    xor eax, eax
    89.  ret
    90. ;===========================================================================
    91.                                 ; Нажатие клавиши
    92. BW_WM_KEYDOWN:
    93.  
    94.    xor eax, eax
    95.  ret
    96. ;===========================================================================
    97.                                 ; Отпускание клавиши
    98. BW_WM_KEYUP:
    99.  
    100.    xor eax, eax
    101.  ret
    102. ;===========================================================================
    103.                                 ; Нажатие клавиши
    104. BW_WM_SYSKEYDOWN:
    105.  
    106.    xor eax, eax
    107.  ret
    108. ;===========================================================================
    109.                                 ; Отпускание клавиши
    110. BW_WM_SYSKEYUP:
    111.  
    112.    xor eax, eax
    113.  ret
    114.  
    115. ;===========================================================================
    116.                                 ; Нотификации
    117. BW_WM_NOTIFY:
    118.   mov edi, [lparam]
    119.  
    120.  ret
    121.  
    122. ;===========================================================================
    123.                                 ; Меню
    124. BW_WM_COMMAND:
    125. ;   Таблица сообщений меню главного окна приложения
    126.    Begin_TCASE BW_MENU_Message_Table
    127. ;   ------------------------ Меню Файл -------------------------
    128.       TCASEc IDM_Open   , OFFSET BW_IDM_Open    ;   Открыть файл
    129.       TCASEc IDM_Save   , OFFSET BW_IDM_Save    ;   Сохранить файл
    130.       TCASEc IDM_EXIT   , OFFSET BW_IDM_EXIT    ;   Выход
    131. ;   ------------------------ Меню Правка -------------------------
    132.       TCASEc IDM_Undo   , OFFSET BW_IDM_Undo    ;   Отменить
    133.       TCASEc IDM_Redo   , OFFSET BW_IDM_Redo    ;   Вернуть отменённое
    134.       TCASEc IDM_Copy   , OFFSET BW_IDM_Copy    ;   Копировать в буфер
    135. ;   ------------------------ Меню Помощь -------------------------
    136.       TCASEc IDM_ABOUT  , OFFSET BW_IDM_ABOUT   ;   О программе
    137.       TCASEc IDM_KEYHELP    , OFFSET BW_IDM_KEYHELP ;   Справка по управлению
    138.    End_TCASE BW_MENU_Message_Table
    139.      and [wparam], 0FFFFh       ; сбросить различие меню и акселератора
    140.      TSWITCH BW_MENU_Message_Table, [wparam]    ; Табличный переход к обработчику сообщений меню
    141. ; ---------- Стандартная обработка оконных сообщений ---------------
    142.      invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
    143.  ret
    144. ;   ------------------------ Меню Файл -------------------------
    145. BW_IDM_Open:    ;   --- Открыть файл ---
    146.  
    147.    xor eax, eax
    148.  ret
    149. BW_IDM_Save:    ;    --- Сохранить файл ---
    150.  
    151.    xor eax, eax
    152.  ret
    153. BW_IDM_EXIT:    ;    --- Выход ---
    154. ;  jmp BW_WM_CLOSE  ; Безоговорочный выход
    155.   jmp ExitWithPodtv ; Вежливая просьба о выходе
    156.  
    157. ;   ------------------------- Меню Правка -------------------------
    158. BW_IDM_Undo:    ;    --- Отменить ---
    159.  
    160.    xor eax, eax
    161.  ret
    162. BW_IDM_Redo:    ;    --- Вернуть отменённое ---
    163.  
    164.    xor eax, eax
    165.  ret
    166. BW_IDM_Copy:    ;    --- Копировать в буфер ---
    167.  
    168.    xor eax, eax
    169.  ret
    170. ;   ------------------------- Меню Помощь -------------------------
    171. BW_IDM_ABOUT:   ;    --- О программе ---
    172.  
    173.    xor eax, eax
    174.  ret
    175. BW_IDM_KEYHELP: ;    --- Справка по управлению ---
    176.  
    177.    xor eax, eax
    178.  ret
    179. ;===========================================================================
    180.                                 ; Перемещение колеса мыши
    181. BW_WM_MOUSEWHEEL:
    182.  
    183.    xor eax, eax
    184.  ret
    185. ;===========================================================================
    186.                                 ; Срабатывания таймера
    187. BW_WM_TIMER:
    188.    .if !([SEH_Flags] & SF_Error_Question)
    189.    
    190.    .endif
    191.    xor eax, eax
    192.  ret
    193. ;===========================================================================
    194.                                 ; Базовое окно получило фокус ввода
    195. BW_WM_SETFOCUS:
    196.  
    197.    xor eax, eax
    198.  ret
    199.  
    200. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    201. ExitWinProc:
    202.   ret
    203. WinProc   ENDP
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Y_Mur

    ИМХО не прелесть инвоке а то как пользоваться функцией и сделаю к ней несколько фасадов
     
  15. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    6) имхо мои предложения по стилю - имена меток начинаются с $ ($loop:) имена макросов и констант с @ (@My_Flag=1) причем определяются спомощью = а не equ

    понимаю что специфичное по вкусу предложение
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Rockphorr
    $ и @ имеют собственное значение ($ -- указатель на текущий адрес, @@ -- временная метка к которой обращаются через @b и @f), поэтому $ и @ нежелательно употреблять в именах меток, переменных и макросов; equ и = так же при употреблении имеетют свои различия, = -- определяет константу с именем, указанным в левой части, и с числовым значением, равным значению выражения справа. В от­личие от констант, определенных по директиве EQU, константы определенные через = могут менять свое значение, обозначая в разных частях текста программы разные числа. Так написать можно: k = 100 / k = k+2 а так нельзя: k1 equ 100 / k1 equ k1 + 1 (error A2005: symbol redefinition: k1)
    Но это всё IMHO
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Rockphorr
    имхо "фасады" это излишество вместо них тогда уж лучше свою макрореализацию :))
    А прелесть invoke в том что она автоматически контролирует количество параметров и чистит стек за С функциями.

    Mikl__
    Гляжу в #19 борешься с call через jmp "дедовским" способом, т.е. через отказ от invoke. Хотя достаточно заменить инклюды (в барахолке васма лежит старенькая версия альтернативных инклюд требующая доработки напильником). Тогда и инвокабельная автоматика сохранится и лишних jmp не будет.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Y_Mur
    Сам себе удивляюсь -- и зачем я эту фигню на 8 страниц написал? :)
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Mikl___
    Да ладно - "фигня" прикольная и наверняка многим пригождается :)) Пущай бегиннерсы медитируют и просветляются :))
     
  20. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Mikl___

    ИМХО
    именно изза собственных значений я их и использую никакой другой символ имени метки по сравнению с $ не будет говорить что это именно метка в коде, аналогично @ лучший индикатор того что это макрос или числовая константа

    Y_Mur
    значит вам еще предстоит их(фасады) распробовать :)
    когда мой дос проект приблизился к 10 кб я очень сильно почувствовал удобство влияния через фасады на технологические характеристики проекта