.end start

Тема в разделе "WASM.ASSEMBLER", создана пользователем Semiono, 19 окт 2010.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    Я привык этим пользоваться .end start, очень удобно для ленивых, не надо импорт описывать.
    Хотя для win64ax.inc это не работает.
    Но вот с этим тоже загвоздка -
    library msvcrt,'msvcrt.dll'
    import msvcrt,\
    printf,'printf'
    А почему, что трудно было зделать?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    боты все умнее и умнее. Сгенерированные сообщения с каждым разом выглядят все более связными. Даже грамматические ошибки делать умеет, не говоря уже о пунктуации
     
  3. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Что ж вы сразу: "боты, боты". Зимние боты вообще всех в минуса заруливают. :derisive:

    Semiono,

    Я как-то на flatassembler.net постил такую штуку:
    Код (Text):
    1. ;;; This file is named "Win32X+.Inc", because it really doesn't depend on A/W
    2.  
    3. ; These symbolic constants will collect additional libraries/imports
    4. irp lib, kernel32,user32,gdi32,advapi32,comctl32,comdlg32,shell32,wsock32 {
    5.   additional_#lib#_imports equ
    6. }
    7. additional_libs equ
    8.  
    9. ;;;
    10. ;;; Support macros (actually strucs ;-)
    11. ;;;
    12.  
    13. struc reequ [value] {
    14. common
    15.   restore .; «value» should not depend on equated symbolic constant, to keep it simple
    16.   . equ value
    17. }
    18.  
    19. struc append [items] {
    20. ; assumes list is initialized (at least empty, not undefined)
    21. common
    22.   match items_value, items \{; got something to append
    23.     match list_value, . \\{; both non-empty, concatenate with comma
    24.       . reequ list_value, items_value
    25.     \\}
    26.     match , . \\{; list was empty, simply equate
    27.       . reequ items
    28.     \\}
    29.   \}
    30. }
    31.  
    32. struc if_in_list item, [list] {
    33. common
    34.   . equ 0
    35. forward
    36.   match =item, list \{ . reequ 1 \}
    37. }
    38.  
    39. struc if_odd_in_list item, [first, second] {
    40. common
    41.   . equ 0
    42. forward
    43.   match =item, first \{ . reequ 1 \}
    44. }
    45.  
    46. ;;;
    47. ;;; Some real things
    48. ;;;
    49.  
    50. macro library [lib, name] {
    51. ; Instead of generating import directory, collect lib names in additional_libs
    52. common local .done
    53. forward
    54.   .done if_in_list lib, kernel32,user32,gdi32,advapi32,comctl32,comdlg32,shell32,wsock32
    55.   ; just in case somebody forgot that they're imported by default
    56.   match =0, .done \{; not standard lib
    57. ;;;---
    58. ;;; That was original line, unconditionally append libname
    59. ;;;
    60. ;;; additional_libs append lib, name
    61. ;;;+++
    62. ;;; This code is added: now we can have several <library> invocations for the same library,
    63. ;;; so check for duplicate should be done.
    64. ;;;
    65.     match .libs, additional_libs \\{; dereference libraries list
    66.       .done if_odd_in_list lib, .libs
    67.     \\}
    68.     match =0, .done \\{
    69.       additional_libs append lib, name
    70.     \\}
    71. ;;;===
    72.     match =additional_#lib#_imports,\; clumsy way to check for undefined equ
    73.            additional_#lib#_imports \\{
    74.       ; «import» before «library»
    75.       additional_#lib#_imports equ
    76.     \\}
    77.   \}
    78.   restore .done
    79. }
    80.  
    81. macro import lib, [function] {
    82. ; Similar to «library» above, collect imports
    83. common
    84.   local .done
    85.   .done if_in_list lib, kernel32,user32,gdi32,advapi32,comctl32,comdlg32,shell32,wsock32
    86.   match =1, .done \{ additional_#lib#_imports append function \}
    87.   match =0, .done \{; not standard lib
    88.     match .libs, additional_libs \\{; dereference libraries list
    89.       restore .done
    90.       .done if_odd_in_list lib, .libs
    91.     \\}
    92.     match =0, .done \\{; «import» before «library»
    93.       match =additional_#lib#_imports,\; clumsy way to check for undefined equ
    94.              additional_#lib#_imports \\\{
    95.         additional_#lib#_imports equ
    96.       \\\}
    97.     \\}
    98.     match .imports, additional_#lib#_imports \\{
    99. forward
    100.       restore .done
    101.       .done if_in_list function, .imports
    102.       match =0, .done \\\{
    103.         additional_#lib#_imports append function
    104.       \\\}
    105. common
    106.     \\}
    107.     match , additional_#lib#_imports \\{
    108.       additional_#lib#_imports append function
    109.     \\}
    110.   \}
    111.   restore .done
    112. }
    113.  
    114. macro .code {
    115.   .code
    116.   if ~ defined __START__ | defined __START_DEFINED__
    117.     __START__ = $
    118.     __START_DEFINED__ = 1
    119.   end if
    120. }
    121.  
    122. macro .end label {
    123.   purge library, import; flush collectors down the drain, real workers on the way
    124.  
    125.   macro library [args] \{
    126.   \common
    127.     match .libs, additional_libs \\{
    128.       library args, .libs
    129.     \\}
    130.     match , additional_libs \\{
    131.       library args
    132.     \\}
    133.   \}
    134.  
    135.   macro import lib, [functions] \{
    136.   \common
    137.     local .done
    138.     .done if_in_list lib, kernel32,user32,gdi32,advapi32,comctl32,comdlg32,shell32,wsock32
    139.     match =1, .done \\{; got standard lib
    140.       match .imports, additional_\#lib\#_imports \\\{; got imports to add
    141.         import lib, functions, .imports
    142.       \\\}
    143.       match , additional_\#lib\#_imports \\\{; got nothing
    144.         import lib, functions
    145.       \\\}
    146.     \\}
    147.     match =0,.done \\{; not standard lib
    148.       import lib, functions
    149.     \\}
    150.     restore .done
    151.   \}
    152.  
    153.   macro additional_libs_imports [lib, name] \{
    154.     match .imports, additional_\#lib\#_imports \\{
    155.       import lib, .imports
    156.       restore additional_\#lib\#_imports
    157.     \\}
    158.   \}
    159.  
    160.   match any, label \{ .end label \}
    161.   match    , label \{ .end __START__ \}
    162.  
    163.   match .libs, additional_libs \{
    164.     additional_libs_imports .libs
    165.   \}
    166.   purge library, import, additional_libs_imports; work is done, so are the workers
    167. }
    168.  
    169. ;;;+++
    170. ;;; Redefine macros to accept lib::function name syntax and add import
    171. ;;;
    172. irps invoke_macro, invoke cinvoke {
    173.   macro invoke_macro name,[args] \{
    174.   \common
    175.     \local .done
    176.     .done equ 0
    177.     match lib=:=:function, name \\{
    178.       library lib,\\`lib
    179.       import  lib,function,\\`function
    180.       invoke_macro function,args
    181.       .done reequ 1
    182.     \\}
    183.     match =0, .done \\{ invoke_macro name,args \\}
    184.     restore .done
    185.   \}
    186. }
    187. ;;;===
    188. ;;; That's all, folks!
    Использовать так:
    Код (Text):
    1.         format  PE
    2.         include "Win32WX.Inc"
    3.         include "Custom\Win32X+.Inc"
    4.  
    5.         .code
    6.         invoke  shell32::CommandLineToArgvW, <invoke GetCommandLine>, argc
    7.         mov     esi, eax
    8.         cinvoke MSVCRT::wprintf, _argc, [argc]
    9.         cinvoke _putws, _banner
    10.         .repeat
    11.           cinvoke MSVCRT::_putws, dword[esi]
    12.           add     esi, 4
    13.           dec     [argc]
    14.         .until  ZERO?
    15.         ret
    16.  
    17.         .data
    18. _argc   TCHAR   "argc: %u", 10, 0
    19. _banner TCHAR   "argv[]:", 0
    20.         align   4
    21. argc    rd      1
    22.  
    23.         .end
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    Понятно. =)
    Это что динамический импорт?

    Я подключил сюда, не помогло
    Код (Text):
    1. format PE console
    2. include '%fasm%/macro/import32.inc'
    3. section '.code' executable
    4. start:
    5.         push ebp
    6.         mov ebp,esp
    7.         sub esp,12
    8.         mov dword [ebp-4],1
    9. @@:     ; loop
    10.         mov eax,dword [ebp-4]
    11.         cmp eax,11
    12.         jge @f
    13.         mov eax,dword [ebp-4]
    14.         mov dword [esp+4],eax
    15.         mov dword [esp],intl
    16.         call [printf]
    17.         mov eax,dword [ebp-4]
    18.         inc eax
    19.         mov dword [ebp-4],eax
    20.         jmp @r
    21. @@:     ; break
    22.         add esp,4
    23.         mov dword [esp],p
    24.         call [system]
    25.         mov dword [esp],0
    26.         call [exit]
    27.  
    28. section '.data' readable
    29.  
    30.         intl db '%d',10,0
    31.         p db 'pause>nul',0
    32.  
    33. section '.idata' import readable
    34.  
    35.         library msvcrt,'msvcrt.dll'
    36.         import msvcrt,\
    37.                printf,'printf',\
    38.                scanf,'scanf',\
    39.                system,'system',\
    40.                exit,'exit'
    Мне просто printf захотелось юзать. Хотя я так низко кодить не умею. Мне без invoke страшно становиться. ))
     
  5. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    В определённом смысле — да. Новые макроинструкции library и import вместо определения данных для справочника импорта собирают переданные им аргументы в символических константах, а новая макроинструкция .end вновь переопределяет их для того, чтобы добавить накопленные аргументы к спискам, указанным для старых library/import в макроинструкции .end из Win32*X.Inc. Расширение синтаксиса invoke было придумано позже, вначале было так:
    Код (Text):
    1.         format  PE
    2.         include "Win32AX.Inc"
    3.         include "Custom\Win32X+.Inc"
    4.         .code
    5.         import  MSVCRT, printf, "printf"; взаимное расположение «library»/«import»
    6.         library MSVCRT, "MSVCRT.DLL"    ; на качество не влияет
    7.         cinvoke printf, <"Hello, world!", 10, "I'm going back to %#x.", 10>
    8.         ret
    9.         .end
    Строки с library/import можно удалить, если в cinvoke написать напрямую MSVCRT::printf.

    Естественно, не помогло. Лекарство надо принимать согласно предписанию врача. :derisive:
    Win32*X.Inc не подключен, .end не используется — как же оно взлетит?
     
  6. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Возможно похоже, baldr :?
    Код (Text):
    1. format pe gui 4.0
    2. include 'win32ax.inc'
    3. include 'win32x+.inc'
    4.  
    5.  
    6. entry $
    7.         invoke  kernel32::ExitProcess,0
    8.         ;ret     0
    9. ;.end
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Мня, это мне очки так мощно помогают видеть? :derisive:
    Повторяю ещё раз:
    Код (Text):
    1.         include "Win32AX.Inc"; это обязательно
    2.         include "Win32X+.Inc"; ради этого весь лай
    3.  
    4. irp def, CPL_INIT=1, CPL_INQUIRE=3, CPL_DBLCLK=5, CPL_STOP=6, CPL_EXIT=7 { def }; типа enum
    5.  
    6. struct CPLINFO; авось кому пригодится
    7.   idIcon rd 1
    8.   idName rd 1
    9.   idInfo rd 1
    10.   lData rd 1
    11. ends
    12.         .code; модифицирован, определит точку старта здесь, если в .end не указать
    13.         invoke  CPlApplet, HWND_DESKTOP, CPL_INIT, 0, 0
    14.         sub     esp, sizeof.CPLINFO; так надо, Федя, хотя и не используется ;-)
    15.         invoke  CPlApplet, HWND_DESKTOP, CPL_INQUIRE, 0, esp
    16.         invoke  AppWiz.CPL::CPlApplet, HWND_DESKTOP, CPL_DBLCLK, 0, esp; здесь сработают мой invoke и первые library/import
    17.         invoke  CPlApplet, HWND_DESKTOP, CPL_STOP, 0, esp
    18.         invoke  CPlApplet, HWND_DESKTOP, CPL_EXIT, 0, esp
    19.         add     esp, sizeof.CPLINFO
    20.         invoke  ExitProcess, eax; ret не подойдёт, виснут какие-то левые потоки
    21.         .end; здесь мои вторые library/import дадут эффект (соответственно, обязательный пункт)
    Компоненты успеха:
    1. Подключить Win32*X.Inc — он определяет ключевую макроинструкцию .end
    2. Подключить Win32X+.Inc — это вроде бы должно быть понятно.
    3. Где-нибудь при использовании invoke указать ей имя динамической библиотеки для непонятного имени.
    4. Ближе к концу вызвать .end (хотя, учитывая возможность не указывать точку старта, end. выглядит красивше :derisive:.

    Возможны конфликты имён в DLL, тут на помощь спешат те самые library/import, которые переопределены в первую очередь. Синтаксис у них тот же, что и у стандартных (хотя семантика отличается весьма: к примеру можно import вызвать раньше соответствующей library), употреблять их можно где угодно (вроде бы :derisive: между include и вызовом .end

    За прошедшие с момента последнего обновления 4 месяца появилась пара-тройка идей, может и родится что-нибудь более удобоваримое.
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    я только .end не подключил, так как не знал об этом.
    а код я вывалил в качестве примера, разумеется про инклюды я не забыл Win32X+.Inc и win32ax.inc.
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    StringCbCat Function
    а откуда импортировать Strsafe Functions ? 0_o
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Если сможете преобразовать strsafe.lib (находится тут Microsoft Visual Studio 8\VC\PlatformSDK\Lib\) в strsafe.dll, то из strsafe.dll
     
  11. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Не совсем верно. strsafe.lib содержит вспомогательные функции (вроде StringExValidateSrcA() и StringCopyWorkerA()), а преобразовывать надо strsafe.h.

    ----8<----
    Semiono,

    А что в них такого ценного? Глянул StringCchLength(), чуть с пола не упал: кроме 5 байт, вызывающих StringLengthWorker(), она состоит из кода для поиска повода послать вызвавшего на три буквы (порядка 60 байт). «Ладно», думаю, «авось StringLengthWorker() умная и шустрая». Не тут-то было: из 59 байт реально делом заняты всего 8 (!!!) — вот они:
    Код (Text):
    1. @@:     cmp     [edx], al; eax обнулён ранее
    2.         jz      @f
    3.         inc     edx
    4.         dec     esi; тут значение из cchMax
    5.         jnz     @b
    6. @@:
    Да, очень ценная функция для тех, кому код оплачивают по весу.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    baldr
    Собственно практически все функции из сишных библиотек именно такие ;)

    Semiono
    Использовать в прогах на асме CRT и т.п. аццкая жесть ;) для того чтобы просто поучиться это конечно сойдёт, но если ты их серьёзно собрался использовать в реальном программировании, то лучше переходи на С и не парься. Там asm вставки в местах критичных к быстродействию выглядят куда уместнее чем С либы в асме.
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    гы))
    Да ладно, если я рантаймы толком не понимаю, чего ж мне в ассемблер лезть!
    А кампилятор, я fasm ни на что не променяю!
    Вобще я асм использую как скриптовый язык, и мне пока хватает.
    Чем JavaScript лучше асм, так как всегда есть повод научиться в том числе и коду.
    Но это очень в далёкой перспективе.
    Крута! =) Но не я их придумал, не мне судить ))
    Я бы с радостью MS C++ поучил бы, если бы портативный маленький дистр был, что нибудь
    типа Dev-Cpp. Однако те минговские движки наверняка msdn диалект не понимают.
     
  14. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    ЗЫ я сначало должен пройти весь msdn win32api, а потом уже low level. Но не наоборот. ;-
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Semiono
    Вот и осваивай api, в них есть практически всё что нужно без всяких crt извращений, которые в отличие от api не обязаны быть на компе ;)
     
  16. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    768
    Код (Text):
    1. section '.idata' import readable
    2.  
    3.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    4.         include '%fasm%\api\kernel32.inc'
    5.         include '%fasm%\api\shell32.inc'
    Если kernel32.inc включаемый файл, то ясное дело, что library kernel32,'KERNEL32.DLL' ,
    надо было это в kernel32.inc включить.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Semiono
    Так возьми и впиши - инклюдов не так уж и много ;) Единственный минус - когда пишешь для форума приходится возвращаться к стандартному варианту чтобы у других компилилось без напильника.
     
  18. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Так работают стандартные макро для создания секции импорта: все импортируемые библиотеки указываются в одном вызове library.