Masm 64 сборка

Тема в разделе "WASM.X64", создана пользователем Dm808, 17 июн 2018.

  1. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Вопрос 1-й: что необходимо для работы ml64, к примеру я хочу собрать свой вариант для работы с 64 битным компилятором, и к примеру используя нотепад+.
    Вопрос 2й: для чего нужны эти файлы в сборке Хатчинсона, кроме link, dumpbin,lib,ml ... эти понятно зачем, и большей части файлов в 2010 студии нету к примеру, сейчас 2015 качаю...
    bin64 directory
    ---------------
    cvtres.exe dumpbin.exe editbin.exe lib.exe link.exe link.exe.config ml64.exe msobj140.dll mspdb140.dll
    mspdbcmf.exe mspdbcore.dll mspdbsrv.exe mspdbst.dll mspft140.dll msvcdis140.dll msvcp140.dll
    -----------
    In dir 1033
    -----------
    bscmakeui.dll clui.dll cvtresui.dll linkui.dll LocalESPCui.dll mspdbcmfui.dll mspft140ui.dll pgort140ui.dll pgoui.dll

    Вопрос 3й: в чем разница компиляторов 64 битного и 32 битного ml64? просто где то наткнулся на сообщение что 64 битный тормозит и глючит.
     
  2. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Dm808,
    подпишись на Visual Studio, она бесплатная, как только установишь, получишь и ml64, и link от 2017. Хатчинсон не хочет связываться с юристами MicroSoft'a поэтому у него такой состав в сборнике
     
  3. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Да где взять я то понял, меня интересует зачем DLL кучу в сборку добавляют (mspdbcore.dll ....и другие) , и почему ml в визуал студии работает с ее либами а в сборке отдельно (Хатчинсон )там что то конфликтует и создаются свои либ файлы?
     
  4. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Dm808,
    через hiew32 посмотри из каких dll ml64 и link импортируют свои функции, может быть и вопросы отпадут. И VS создана для работы в С++ и т.д. А у тебя ассемблер, поэтому понадобятся свои lib- и inc-файлы
    Как достать компилятор ML64 или создаем IDE из говна и палок

    64-разрядный ассемблерный компилятор и линкер не распространяются отдельно, но ml64.exe и link.exe можно получить бесплатно если дать клятву соблюдать "Лицензионное соглашение" после чего (в образовательных целях ;)) скачать комплект C++ компиляторов от Дядюшки Билли.
    1. Установи Microsoft Visual Studio 17.0
    2. Создай каталог, masm64, а в этом каталоге подкаталоги bin, include, lib, sample
    3. Из интернета скачай файл hiew32.exe и размести его в masm64\bin
    4. В c:\Program Files (x86)\Microsoft Visual Studio\ 2017\ BuildTools\ VC\bin\amd64 найдешь файлы
      • ml64.exe
      • link.exe
      • link.exe.config
      • cvtres.exe
      • dumpbin.exe
      • lib.exe
      и скопируй их в папку masm64\bin
    5. А в папке c:\Program Files (x86)\Windows Kits\8.1\bin\x64 найдешь файлы rc.exe и rcdll.dll которые также помещай в masm64\bin
    6. Чтобы ml64 и link заработали на другом компьютере, где Microsoft Visual Studio 17.0 еще не установлена, понадобится целая куча вспомогательных dll'ок которые находятся в папке Windows\System32
    7. Набираешь в командной строке
      d:\masm64\bin\hiew32 ml64.exe

      [​IMG]
      Нажми на клавишу F4(mode) Decode,
    8. [​IMG]
      затем на клавишу F8(header),
    9. [​IMG]
      затем на F7(import) функции импортируемые из других файлов
    10. [​IMG]
      и наконец на F7(DLLs) получишь список dll, используемых в файле.
    11. [​IMG]
    12. Сперва заполни вот такую таблицу
      вспомогательная dllисполь-
      зуется
      находится в каталоге
      api-ms-win-crt-conio-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-convert-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-environment-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-filesystem-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-heap-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-locale-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-math-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-process-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-runtime-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-stdio-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-string-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-time-l1-1-0.dllml64.exe
      link.exe
      Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      api-ms-win-crt-utility-l1-1-0.dlllink.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      msvcp140.dlllink.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      vcruntime140.dllml64.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64
      mscoree.dlllink.exeWindows\system32
      advapi32.dllml64.exe
      link.exe
      Windows\system32
      kernel32.dllml64.exe
      link.exe
      Windows\system32
      imagehlp.dlllink.exeWindows\system32
      mspdbcore.dlllink.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\bin\amd64
      msvcdis140.dlllink.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\bin\amd64
      pgodb140.dlllink.exeProgram Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\bin\amd64
    13. Копируешь файлы api*.dll, а также msvcp140.dll и vcruntime140.dll из папки Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\Remote Debugger\x64 а также файлы mspdbcore.dll, msvcdis140.dll, pgodb140.dll из папки Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\bin\amd64 в папку masm64\bin
    14. Отправляешься на сайт dsmhelp.narod.ru где, можно найти набор lib- и inc-файлов для создания 64-разрядных приложений на ассемблере, а также кучу полезных макросов
     

    Вложения:

    • 72.png
      72.png
      Размер файла:
      38,8 КБ
      Просмотров:
      523
    • 73.png
      73.png
      Размер файла:
      39,3 КБ
      Просмотров:
      513
    • 74.png
      74.png
      Размер файла:
      30,6 КБ
      Просмотров:
      513
    • 75.png
      75.png
      Размер файла:
      28,9 КБ
      Просмотров:
      517
    • 76.png
      76.png
      Размер файла:
      30 КБ
      Просмотров:
      529
    Alexey и Pavia нравится это.
  5. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Судя по ответу эти Dll нужны для работы ml и link, по поводу lib файлов не совсем понятно, в VS если делать вставки асм кода все работать будет и с ее библиотеками и инклюдами, тут интуитивно догадываюсь что там будет не чистый асм а совмещение с кодом на каком вставка сделана и похоже библиотеки и инклюды так спецально настроены.... ладно разберусь с этим со временем.
    Последний вопрос, для работы с ml достаточно папок inc, lib, bin и свой текст редактор? и чем же ml64 (32) отличается от ml64(64)?
     
  6. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Не знаю, возможно чтобы создавать 64-разрядные программы в 32-разрядных Windows. Не заморачивайся, возьми всё 64-разрядные
     
  7. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Я конечно вижу кнопку мне нравится, но все же хочу сказать спасибо лично написав, статьи по всем форумам и труд который Вы вложили впечатляет также, тут мне все ясно, тему наверно можно считать закрытой.
     
  8. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Dm808,
    lib- и inc-файлы не сложно создать самому из содержимого системных dll'ок
    Назначение inc и lib файлов
    inc-файлы ― это текстовые файлы содержащие описания структур данных и констант Windows, а также макроопределения.
    inc-файлы формируются программистом по мере расширения используемых им средств операционной системы. Аналогичны заголовочным h/hpp-файлам используемых при программировании на C/C++, иногда можно сформировать inc-файлы из h-файлов используя утилиту h2inc.exe (ее можно найти в старых пакетах MASM).
    Назначение lib-файлов ― предоставление программе link.exe информации о внешних ссылках на WinAPI-функции внутри системных dll-файлов. lib-файл ― это архив, который хранит набор сопоставлений "внешний символ" ― ссылка на объектный (COFF или PE) файл. Этот "символ" на стадии линковки либо добавляется в исполняемый образ (в случае с COFF ― из прекомпилированного объектного файла), либо ― прописывается в таблице импорта (в случае с PE). То есть некоторый объем внешних ссылок транслируется в ваш exe или dll.
    link.exe обрабатывает стандартные библиотеки COFF и библиотеки импорта COFF, которые имеют расширение LIB. Стандартные библиотеки содержат объекты и создаются с помощью утилиты lib.exe. Библиотеки импорта содержат сведения об экспорте в другие программы и создаются либо компилятором link.exe при построении программы, содержащей экспорт, либо утилитой lib.exe.
    Для получения содержимого системного dll-файла использую следующий bat-файл
    Код (Text):
    1. @echo off
    2. cls
    3. set masm64_path=\masm64\
    4. set FileName=user32
    5. if exist %FileName%.inc del %FileName%.inc
    6. if exist %FileName%.def del %FileName%.def
    7. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt
    8. @echo EXPORTS >> %FileName%.def
    9. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do ( if "%%a"=="Summary" goto :exit
    10. if "%%d"=="" ( @echo extern __imp_%FileName%_ordinal%%a:qword >> %FileName%.inc
    11. @echo %FileName%_ordinal%%a TEXTEQU ^<__imp_%FileName%_ordinal%%a^> >> %FileName%.inc
    12. @echo %FileName%_ordinal%%a=ordinal%%a @%%a NONAME >> %FileName%.def
    13. ) else ( if not "%%d"=="(forwarded" ( @echo extern __imp_%%d:qword >> %FileName%.inc
    14. @echo %%d TEXTEQU ^<__imp_%%d^> >> %FileName%.inc
    15. @echo %%d=__imp_%%d >> %FileName%.def )))
    16. :exit
    17. %masm64_path%bin\link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64
    Разбор bat-файла
    предварительная настройка bat-файла
    Код (Text):
    1. ::стираем с экрана
    2. cls
    3. ::устанавливаем путь к каталогу masm64
    4. set masm64_path=\masm64\
    5. ::имя "препарируемой dll", начнем с user32
    6. set FileName=user32
    7. ::обрабатываем user32.dll и получаем user32.txt файл
    8. %masm64_path%bin\dumpbin.exe /EXPORTS %windir%\System32\%FileName%.dll /OUT:%FileName%.txt
    содержимое user32.txt
    Код (Text):
    1. Dump of file C:\Windows\System32\user32.dll
    2. File Type: DLL
    3.   Section contains the following exports for USER32.dll
    4.     00000000 characteristics
    5.     4CE799CD time date stamp Sat Nov 20 17:50:05 2010
    6.         0.00 version
    7.         1500 ordinal base
    8.         1003 number of functions
    9.          830 number of names
    10.     ordinal hint RVA      name
    11.        1502    0 000083C0 ActivateKeyboardLayout
    12.        1503    1 0002AD40 AddClipboardFormatListener
    13.        1504    2 000235B8 AdjustWindowRect
    14.        1505    3 00017CE4 AdjustWindowRectEx
    15.  ....
    16.        2341  33C 0007B430 wvsprintfA
    17.        2342  33D 00020BFC wvsprintfW
    18.        1500      0002B260 [NONAME]
    19.        1501      0002AE80 [NONAME]
    20. ....
    21.   Summary
    22.         2000 .data
    23.         A000 .pdata
    24.        10000 .rdata
    25.         1000 .reloc
    26.        5B000 .rsrc
    27.        81000 .text
    после просмотра user32.txt видно, что из user32.dll импортируется 846 функции, из них 826 функций импортируются по именам, 16 ― по ординалам, а функции DefDlgProcA, DefDlgProcW, DefWindowProcA, DefWindowProcW портируются в user32.dll из системной библиотеки NTDLL.dll
    Код (Text):
    1. Dump of file C:\Windows\System32\user32.dll
    2. File Type: DLL
    3.   Section contains the following exports for USER32.dll
    4.     00000000 characteristics
    5.     4CE799CD time date stamp Sat Nov 20 17:50:05 2010
    6.         0.00 version
    7.         1500 ordinal base
    8.         1003 number of functions
    9.          830 number of names
    10.     ordinal hint RVA      name
    11.        1502    0 000083C0 ActivateKeyboardLayout <-- полезная информация начинается здесь
    если перед началом обработки в каталоге уже существуют файлы user32.inc, user32.def, user32.lib оставшиеся от предыдущей обработки dll-файлов ― удаляем их.
    Код (Text):
    1. if exist %FileName%.inc del %FileName%.inc
    2. if exist %FileName%.def del %FileName%.def
    создаем файл user32.def, который должен начинаться со строки "EXPORTS"
    Код (Text):
    1. @echo EXPORTS >> %FileName%.def
    Полезная информация начинается в user32.txt с 16 строки, поэтому skip=16 означает ― пропускаем первые 16 строк в user32.txt
    при построчном разборе файла user32.txt используем четыре первых слова в строке, которым присвоим имена %%a, %%b, %%c, %%d
    Код (Text):
    1. for /f "skip=16 tokens=1-4" %%a in (%FileName%.txt) do
    если первый параметр равен "Summary" ― значит обработаны все функции, входящие в dll, мы прекращаем обработку, выходим из файла user32.txt и переходим на метку :exit
    Код (Text):
    1. if "%%a"=="Summary" goto :exit
    если четвертый параметр в файле user32.txt пустой ― перед нами импорт по ординалам
    %%a %%b %%c%%d
    15000002B260 [NONAME]
    сохраняем первое слово (ординал WinAPI-функции) в строке user32.txt в переменной %%a, обрамляем ее и помещаем в две новых строки в файл user32.inc
    Код (Text):
    1. extern __imp_user32_ordinal1500:qword
    2. user32_ordinal1500 TEXTEQU <__imp_user32_ordinal1500>
    и user32.def
    Код (Text):
    1. user32_ordinal1500=ordinal1500 @1500 NONAME
    если четвертый параметр непустой ― перед нами импорт по именам функций
    в очередной строке файла user32.txt
    %%a%%b %%c %%d
    15020 000083C0ActivateKeyboardLayout
    четвертое слово в строке (имя WinAPI-функции), сохраняем в переменной %%d, создаем две новых строки в файле user32.inc, предваряем %%d "extern __imp_" строку завершаем ":qword", добавляем "TEXTEQU", "__imp_", экранируем управляющие символы "<" и ">" (^<__imp_%%d^>) чтобы bat-файл воспринимал их, как обычные символы.
    Код (Text):
    1. extern __imp_ActivateKeyboardLayout:qword
    2. ActivateKeyboardLayout TEXTEQU <__imp_ActivateKeyboardLayout>
    и user32.def
    Код (Text):
    1. ActivateKeyboardLayout=__imp_ActivateKeyboardLayout
    если четвертый параметр равен "(forwarded", значит WinAPI-функция берется из другой dll и мы пропускаем такую строку.
    %%a%%b%%c%%d
    165794DefDlgProcA(forwarded to NTDLL.NtdllDialogWndProc_A)
    из содержимого файлов user32.def и user32.lib создаем файл user32.lib
    Код (Text):
    1. :exit
    2. %masm64_path%bin\link -lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64
    того же результата можно добиться и строкой
    Код (Text):
    1. %masm64_path%bin\lib /DEF:%FileName%.def /OUT:%FileName%.lib /MACHINE:X64
    переносим файл user32.inc в каталог masm64\include, а файл user32.lib в каталог masm64\lib
    удаляем программный мусор
    Код (Text):
    1. if exist %FileName%.def del %FileName%.def
    2. if exist %FileName%.exp del %FileName%.exp
    3. if exist %FileName%.txt del %FileName%.txt
    С удивлением обнаружил, что в kernel32.dll нет ExitProcess, а в user32.dll нет DefWindowProcA, обе функции портируются из ntdll.dll (RtlExitUserProcess и NtdllDefWindowProc_A соответственно) :)
    Аналогично user32.dll препарируем kernel32.dll, ntdll.dll, gdi32.dll, comctrl32.dll и далее, по мере необходимости :yes3:
     
  9. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Сборку создал, запускал пару примеров все вроде компилируется , ваши примеры тоже пробовал компилируются - создаются исполняемые файлы.
    В общем решил начать изучение с создания своего текстового редактора, сразу встало пару вопросов .
    Где найти описание хотя бы простенькое функций из комплекта Хатчинсона а так же ваших макросов всего этого там много и понять что для чего не так просто без описания, к примеру вот этот фокус мне не понятен , зачем по 2 макроса но с разными именами -

    invoke MACRO fname:REQ,args:VARARG
    procedure_call fname,args
    ENDM
    fn MACRO fname:REQ,args:VARARG
    procedure_call fname,args
    ENDM
    function MACRO fname:REQ,args:VARARG
    procedure_call fname,args
    EXITM <rax>
    ENDM
    rv MACRO fname:REQ,args:VARARG
    procedure_call fname,args
    EXITM <rax>
    ENDM
     
  10. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Dm808,
    прямой вопрос ― прямой ответ. Идешь на форум masm32 и задаешь вопросы Стиву. Либо он ответит, либо тамошние форумчане. Тебе остается только ответы на твои вопросы перевести на русский язык и вставить в hlp-файл. Всё же просто! :)
     
  11. Dm808

    Dm808 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2018
    Сообщения:
    13
    Похоже я надоел со своими вопросами :wacko:, на Масм форуме вроде нет русскоязычной ветки, мне там по любому скажут я твоя не понимай че приперся сюда, ну да ладно , а еще один малюсенький вопрос можна? мне вот дико не нравится внешний вид 10ки, и перерыл весь интернет в поисках как сделать свой вид окна, с регионами разобрался, хоть какую форму сделать можно, и на основе картинок тоже, но вот одна маленькая загвоздка все это выходит без тени как у нормального окна по современным меркам.
    Что делал - 1 создал окна овальное = тень пропала , всякие там cs_shadow на окно не работают либо криво работают, плюнул полез в WM_NC.....,думал может просто перерисовать не клиентскую область и все будет нормально, фиг там ,стоит что нибудь намалевать в WM_NCPAINT тень тыц и исчезает,в конце концов где то нашел что с 7ки для окна добавили функций какой то DWM вроде называется, но по русски по этой теме не нашел не чего что могло бы помочь с тенью для окна, и так вопрос , примера даже (но если будет я не против :preved:) не надо, как сделать нормальную тень у окна без бордюров и заголовка в Window 7 - Windows 10?
     
  12. Mikl___

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

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Dm808,
    нет, не надоел, спрашивай, только учитывай, что не на все вопросы я могу ответить. Да, на masm32 нет ветки для русскоязычных, но гугл-транслейт в помощь, задавай свои вопросы на английском, а потом с его помощью будешь переводить ответы на свои вопросы, а через какое-то время начинаешь понимать ЧТО спросить и ЧТО ответить, но уже без помощи онлайн-переводчиков. Главное ― начать :) По поводу окошка с тенью, не обещаю, но попробую помочь
     
  13. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.520
  14. asmlamo

    asmlamo Active Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.520
    в чем разница компиляторов 64 битного и 32 битного ml64?

    Один скомпилирован в 64 бита другой в 32.
    Последний дает возможность компилировать на 32 разрядной системе приложения в 64 разряда.