MASM32: Начало

Решил начать цикл статей по ассемблеру, и, в частности, по MASM32. Пригодятся эти мануалы с примерами тем, кто хочет поднять свои навыки программирования и развить умение программировать на ассемблере. Пакет MASM32 - это не просто голый ассемблер. В нём есть огромное множество облегчающих разработку софта вещей - пользовательские макросы, встроенные функции и макросы, дебаггер и прочее, и обо всём этом я буду рассказывать. Конечно, читать такие статьи будет гораздо легче тем, кто уже умеет программировать на каком-нибудь языке. Если вы программируете на каком-нибудь говне вроде Visual Basic, или фанатеете от перетаскивания компонентов и кнопочек на формы в дельфи или Borland C++ - не расстраивайтесь, я расскажу, как можно перетаскивать кнопочки и в ассемблере. Разумеется, никаких стандартных облегчающих жизнь компонентов здесь не будет, но это побудит разобраться с WinAPI - огромной кладезью полезных функций, которые способны делать всё, начиная от чтения данных из сокета и заканчивая отображением окон.

Собственно, эту статью я начну с примера простого GUI-приложения на MASM. Конечно, проектировать дизайн окна мы будем визуально (я же обещал). Для этого сначала следует скачать визуальный редактор ресурсов ResEd. Запускаем его и видим интерфейс:

Создаем новый файл ресурсов (File - New Project и вводим имя). В правой верхней панели появляется значок папки и имя файла. Кликаем по ней правой кнопкой и нажимаем "Add Dialog". Теперь мы можем визуально спроектировать интерфейс окна и изменить его настройки. Я создал простое окно TEST_DIALOG с двумя кнопками TEST_BTN и EXIT_BTN:

Если вы успели обрадоваться - не спешите: здесь нельзя программировать, можно только делать дизайн интерфейса. Теперь необходимо добавить в наш файл ресурсов еще пару вещей. Первое - это include-файл с определениями всех констант, который будет необходим компилятору ресурсов MASM32. Как и раньше, нажимаем правой кнопкой мыши по значку папки, выбираем "Include file", "Add" и вводим путь. У меня это C:\masm32\include\RESOURCE.H. У вас может быть и другой, зависит от папки установки masm32 (как? вы еще не установили его?).

Теперь еще одна вещь. Пусть наше окно и кнопки выглядят в современном XP-стиле. Для этого необходимо добавить к файлу ресурсов XP Manifest. Добавляется он аналогично предыдущим пунктам (Add XP Manifest).

Теперь сохраняем файл ресурсов. Он должен выглядеть примерно таким образом:

Осталось написать программу. Я в качестве редактора предпочитаю обычный Блокнот Windows. Сначала я приведу полный листинг, а потом прокомментирую его построчно:

Итак, начнем:

Эти директивы говорят о том, что мы пишем код под 386 архитектуру процессора (это так и будет всегда), вторая говорит о том, что модель памяти мы используем плоскую и вызовы функций по стандарту stdcall. Этот стандарт подразумевает, что аргументы функциям передаются через стек в обратном порядке, и функция сама должна удалять их оттуда. Кроме того, функции сохраняют регистры ebx, edi и esi и возвращают значение в регистре eax. Если вы сейчас ничерта не поняли - не расстраивайтесь, это всё прекрасно разъяснено в гугле - и про регистры, и про стек. Если вы занимаетесь программированием, то понять это не составит труда.

Здесь мы подключаем необходимые библиотеки. kernel32 содержит функцию ExitProcess, user32 - всякие GUI-функции, comctl32 - функции работы с common controls, masm32 - библиотека встроенных функций masm32, я не знаю, зачем я ее здесь подключил, потому что она все равно в этом простом проекте не используется. Ну, лишнего объема, как в дельфи, это не добавит, если функции из библиотеки не используются. Я расскажу о ней в будущем. uselib - это макрос masm32, который всё необходимое позволяет одной строкой подключить. Только представьте, эти три строки эквивалентны следующему коду:

Как узнать, из какой библиотеки функция? Смотреть msdn.

Идем дальше...

Эта строка представляет собой прототип процедуры. Если вы программируете на C или C++, то знаете, что это такое, если нет - я поясню. Функцию нельзя вызывать до того, как она будет объявлена, поэтому в начало файла часто пишутся прототипы функций, расположенных в других файлах или ниже места первого вызова функции.

Этими строками мы просто объявили некоторые значения из нашего файла ресурсов new.rc. Можно было бы этого и не делать, но с ними программа будет более читаемой.

В этом куске кода у нас объявляются глобальные переменные в секции неинициализированных данных. Что это такое? Это просто переменные, не имеющие начального значения. Они не занимают места в получающемся после компиляции exe-файле. В hInstance мы будем хранить указатель на модуль нашей программы (зачем - позже поясню), а в icce - структуру INITCOMMONCONTROLSEX (также объясню позже). dd - он же DWORD - тип данных "двойное слово". В C++ такой тип имеют int, long и все указатели, но C и C++ являются более типизированными языками, а в ассемблере всё сводится к двойным словам (4 байта).

Чтобы объявить секцию инициализированных данных и глобальные переменные в ней, пишут так:

В нашей программе тоже будет секция инициализированных данных, просто она неявно объявляется, далее я расскажу об этом.

Что же происходит здесь? Здесь мы уже объявляем секцию исполняемого кода и метку start, которую потом объявим точкой входа.
Мы инициализируем объявленную ранее структуру icce и вызываем функцию InitCommonControlsEx. Инструкция mov загружает данные в регистр или ячейку памяти. Представьте, что мы пишем

... и всё станет понятнее. Встроенный макрос invoke используется для вызовы любых функций, у которых есть прототип (а прототипы всех WinAPI прописаны в заголовочных файлах MASM32, которые мы подключили в самом начале программы). Sizeof возвращает размер структуры в байтах, offset позволяет получить смещение в памяти какого-либо байта. Есть еще addr, позволяющая получить смещение какого-то байта, размещенного в памяти по заранее неизвестному адресу (например, для локальных переменных в процедурах).

Теперь дальше - мы получаем указатель на начало нашего исполняемого модуля. Опять-таки, представьте, что мы пишем

Все stdcall-функции возвращают значение в регистре eax, как я уже говорил, а GetModuleHandle как раз stdcall WinAPI. Ах да, у вас, вероятно, есть вопросы по этим функциям, если вы впервые слышите про WinAPI? Ну так вбейте название непонятной функции в гугл, и получите ссылку на msdn с подробнейшим описанием.

И, как вы уже могли догадаться, мы создаем диалоговое окно функцией DialogBoxParam с указанием идентификатора диалога из файла ресурса (TEST_DIALOG = 1000). Эта функция начинает цикл сообщений windows с использованием функции WndProc, на которую мы передали указатель. Это типизированная функция, далее я опишу ее, но пока что - пара слов о цикле сообщений. Каждое окно в Windows получает множество сообщений от системы или других приложений, от других окон или от своего же в непрерывном цикле. Процедура WndProc будет эти сообщения получать, а мы будем в ней обрабатывать часть сообщений. которые нужны нам.

Далее я распишу код с комментариями:

Ну и последнее:

Здесь мы устанавливаем точку входа на метку start, т.е. с нее начнется выполнение программы.

Ну что же, сохраним код как new.asm, закинем в одну папку new.rc, new.asm и xpmanifest.xml и скомпилируем всё следующим bat-файлом:

После компиляции и линкования получаем программу размером 2.5 кб, которая еще и работает. Ну не прелесть ли?

Надеюсь, эта статья была вам полезна. Хотя о чем это я... Если вы дочитали до этого момента, то явно почерпнули для себя что-то полезное. Надеюсь, вам уже хочется писать свои GUI-программы на ассемблере с использованием MASM32, наполняя их функционалом, ну или хотя бы немного заинтересовала эта тема. В следующей статье я напишу что-нибудь более полезное, чем простой "Hello, world!", и представлю Вашему вниманию.

И последнее. Если после прочтения вы будете находиться в состоянии, подобном этому - не расстраивайтесь, у вас ещё все впереди! :)

MASM32: Начало: 117 комментариев

    1. Слушай от твоей программы зависит мой диплом.Помоги откомпилировать программу - сканер портов, я в долгу не останусь или вышли хотя бы мне на E-mei инфу, как настроить Resed. Мне нужен exe - файл.ЧЕРТОВСКИ НУЖЕН!!!

  1. Очень интересно, хоть и не дочитал до конца, но сегодня днем теоретически осилить надеюсь смогу =)

    И материал в удобной и понятной форме преподносите, и на примерах, и с расшифровкой всего и вся...

    Буду ждать новых статей =)
    Спасибо.

    p.s. если совмещать изучение разных языков - мозг не сварится ? =)

    1. Думаю, что не сварится. Тем более, знание WinAPI и ассемблера будет полезно и для любителей дельфи/C++, потому что в них можно использовать и WinAPI, и ассемблерные вставки по желанию. В C#/VB тоже иногда возникает необходимость в WinAPI. Единственное, что я не описал - это самые основы ассемблера (стек, регистры, куча), но по этой теме литературы масса, и я думаю, что несколько затрону эту тему в следующей статье.

      1. dx здравствуй,подскажи мне пожалуйсто куда именно надо на писать TEST_BTN и EXIT_BTN:что-бы появилсь кнопки тест и выход в диалоговом окне я так и не разобрался?!

      2. У меня остался последний вопрос, как написать Bat-файл для линкования, стандертно-?Скапировать исходник, вставить в блокнот и сохранить с расширением regedit-?

      3. На форуме сказали твй батник не рабочий

        @echo off
        cls

        REM ну сюда впишите свои пути
        SET PATH=C:\Masm32\bin
        SET INCLUDE=C:\Masm32\INCLUDE
        SET LIB=C:\Masm32\LIB

        REM компилируем ресурсы
        Rc.exe /v %1.rc

        REM компилируем исходник
        ML /nologo -c -coff %1.asm
        if errorlevel 1 goto terminate

        REM линкуем всё в exe
        REM !!!!!! файл 64stub.exe можно взять отсюда:
        REM http://kaimi.io/2009/08/пакет-для-компиляции-masm32
        REM и положить его в папку с батником и проектом
        LINK /nologo %1.obj %1.res /SUBSYSTEM:WINDOWS /STUB:64stub.exe /FILEALIGN:512 /VERSION:4.0 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /ignore:4078 /RELEASE /BASE:0x400000

        REM ключей тут много, я описывать их не буду, вот самый примитивный вариант линкования:
        rem LINK32 /nologo %1.obj /SUBSYSTEM:WINDOWS

        if errorLevel 1 goto terminate

        echo OK

        :terminate
        В нем ни передаются параметры, скинь рабочий плиз!!

        1. Я вот сижу, читаю твои сообщения, читаю, читаю, и думаю, что ну не может быть человек НАСТОЛЬКО глупым, чтобы при наличии технического образования, К ДИПЛОМУ компилировать ГОТОВЫЕ ИСХОДНИКИ в виде единственного файла в течение трех недель...
          Думал, ты сам догадаешься, но, видимо, твоих познаний и интеллекта для этого недостаточно...
          Мог бы уже 100 раз доки прочитать, хелпы к программам, мануалы по батникам, а не плодить бессмысленные и беспощадные вопросы.
          А на форуме тебе правильно сказали, ты САМ должен передать в батник параметр, иначе откуда он, по-твоему, узнает, файл с каким именем ты хочешь компилировать? Из информационного поля земли? Из произведений Пушкина? Из твоей никчемной головы?

        2. Вот так по всей видимости

          @echo off
          cls

          REM
          SET PATH=C:\Masm32\bin
          SET INCLUDE=C:\Masm32\INCLUDE
          SET LIB=C:\Masm32\LIB

          REM
          Rc.exe /v %1new.rc

          REM
          ML /nologo -c -coff %1new.asm
          if errorlevel 1 goto terminate

          REM
          REM
          REM
          REM
          LINK /nologo %1new.obj %1new.res /SUBSYSTEM:WINDOWS /STUB:64stub.exe /FILEALIGN:512 /VERSION:4.0 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /ignore:4078 /RELEASE /BASE:0x400000

          REM
          rem LINK32 /nologo %1new.obj /SUBSYSTEM:WINDOWS

          if errorLevel 1 goto terminate

          echo OK

          :terminate

        3. Я понял с батником,я к стати щас сам врубился про то. что нужно задать параметр, почитал в google, но откуда брать XP-manifest-?
          Извени за мазню

      4. dx псоледовательность передоваемых параметров не надо менять?!Там мы передаем два параметра или нужно указать %1 для первого параметра %2 для второго имени файла-?

  2. Мда, на дворе 21 век, а люди продолжают писать под архитектуру процессора 1985(!) года.
    И какой смысл писать гуй на ассемблере? Это крайне неудобно и не наглядно по-моему.
    Погоня за размером? Так запаковать можно же.
    Программа медленно выполняется? Так можно оставить её на сях, а в критические участки сделать ассемблерные вставки.

    1. Поговорим о win32.

      > Мда, на дворе 21 век, а люди продолжают писать под архитектуру процессора 1985(!) года.
      Не знаете - не говорили бы. Дельфи и вижал бейсики собирают exe именно под 386 архитектуру процессора, потому что с тех пор никаких изменений не произошло среди команд, доступных в user-mode.

      > И какой смысл писать гуй на ассемблере? Это крайне неудобно и не наглядно по-моему.
      Ну так не пишите, продолжайте перетаскивать кнопочки и программировать их двойным кликом, не зная даже, как организуются ресурсы и как окно обрабатывает сообщения.

      > Погоня за размером? Так запаковать можно же.
      Сделайте такую же программу на дельфи с использованием его стандартных компонентов, запакуйте, и скиньте мне файл 2.5 кб.

      > Программа медленно выполняется? Так можно оставить её на сях, а в критические участки сделать ассемблерные вставки.
      С этим не спорю, но чтобы уметь писать ассемблерные вставки - надо сначала узнать ассемблер и некоторые вещи по части низкоуровневого win32-программирования.

      1. 1. Не знаю, никогда не программировал на этих языках. Если так - то это печально, в 686 есть наборы инструкций, которые выполняются быстрее. А обратная совместимость с древними процессорами - это бред уже по-моему.
        2. Всё это можно понять, программируя на чистом си.
        3. Опять же, я говорил про язык си.

        1. Никто вас не заставляет учить ассемблер и писать только на нем. Пишите на си, в чем проблема. Просто есть вещи, которые даже на си сложно написать, например, тот же сплайсинг WinAPI-функций или получение информации из TIB не обойдется без ассемблерных вставок. И это как минимум, вставок, а как максимум - __declspec (naked) и всего кода на ассемблере.

      2. Вопрос конечно идеотский, но может поможеш с этим интерфейсом -?

        // == администратором убрана гора кода == //

        1. Ты долбанулся сюда постить мильон строк неведомого ассемблерного кода и еще какое-то говно на дельфи? И в чем я тебе должен интересно помочь? Научить, как пользоваться pastebin.com?

      3. Все я полность во всем разобрался. извеня если загрузил тебя, вспомнил про bat-программирование,как линковать, среду редактора я настроил, код практически вбил

  3. Не получается сделать эту часть :

    Первое – это include-файл с определениями всех констант, который будет необходим компилятору ресурсов MASM32. Как и раньше, нажимаем правой кнопкой мыши по значку папки, выбираем «Include file», «Add» и вводим путь. У меня это C:\masm32\include\RESOURCE.H.

    Когда нажимаю правой кнопкой мыши по папке, там есть строка "Include files" , я тыкаю ее, и появляется папка Misc с красным этим файлом, а кнопки "Add" для указания пути найти не мог. Пробывал нажать правой кнопкой по этому файлу и выбрать пункт - "Export Names" - но когда выбираю файл "RESOURCE.H" - пишут мол он уже существует, и спрашивают заменить ли его... В итоге перед сохранением файла должного кода не получается =(

  4. неполучается скомпилировать все вместе (.asm, .rc, .bat, xpmanifest), до этого в папку также копирую файл 64stub.cmd

    в .bat файле изменяю 1.rc на new.rc, 1.asm на new.asm

    как правильно?

    1. Все файлы должны одинаково называться, например, 1.asm, 1.rc. Манифест должен зваться xpmanifest.xml. Стаб 64-байтовый (если его используете) должен быть 64stub.exe. Вот, я выложу его: http://slil.ru/33109391
      Если не получится, ошибки сюда скопируйте.

    2. Я сохранл код, как new.asm и сохранил его в одной папке с new.rc и xp manifest xll
      Запустил бвтник, вылетела командная строка на пару секунд и все. Приведи rc-файл без Стаб 64 пожалуйста. Пути у меня такие е же как и у тебя

      SET PATH=C:\Masm32\bin
      SET INCLUDE=C:\Masm32\INCLUDE
      SET LIB=C:\Masm32\LIB

      путь к папке установки С\masm32

  5. Using codepage 1251 as default
    Creating .RES
    RC: RCPP -CP 1251 -f C:\asmtest\RCa04788 -g C:\asmtest\RDa04788 -DRC_INVOKED -D_
    WIN32 -pc\:/ -E -I. -I . -I C:\Masm32\INCLUDE

    RC : fatal error RC1110 : could not open .rc

    Assembling: .asm
    MASM : fatal error A1000: cannot open file : .asm

    файлы в папке C:\asmtest слудеющие: 64stub.exe, new.asm, new.bat, new.rc, xpmanifest.xml

    1. bat-файл нужно запускать с параметром из командной строки, например "make.bat new".
      Сначала, разумеется, нужно командой cd перейти в директорию с проектом.

  6. Привет Kaimi.Статься отличная.
    Но у меня проблема с компиляцией.Пакет для компиляции скачал из этой статьи.
    Ввожу команду make_dll_res rasadhlp и выдёт вот такую кашу:

    Microsoft (R) Windows (R) Resource Compiler, Version 5.00.1823.1 - Build 1823
    Copyright (C) Microsoft Corp. 1985-1998. All rights reserved.

    Using codepage 1251 as default
    Creating rasadhlp.RES
    RC: RCPP -CP 1251 -f C:\masm32\RCa03368 -g C:\masm32\RDa03368 -DRC_INVOKED -D_WI
    N32 -pc\:/ -E -I. -I .

    rasadhlp.rc.
    Writing VERSION:1, lang:0x409, size 884
    Assembling: rasadhlp.asm
    rasadhlp.asm(6) : error A2109: only white space or comment can follow backslash
    rasadhlp.asm(8) : error A2109: only white space or comment can follow backslash
    rasadhlp.asm(10) : error A2109: only white space or comment can follow backslash

    rasadhlp.asm(13) : error A2008: syntax error : uselib
    rasadhlp.asm(71) : error A2006: undefined symbol : WSADATA
    rasadhlp.asm(71) : error A2195: parameter or local cannot have void type
    rasadhlp.asm(72) : error A2006: undefined symbol : sockaddr_in
    rasadhlp.asm(72) : error A2195: parameter or local cannot have void type
    rasadhlp.asm(75) : error A2006: undefined symbol : WSAStartup
    rasadhlp.asm(78) : error A2006: undefined symbol : socket
    rasadhlp.asm(82) : error A2006: undefined symbol : gethostbyname
    rasadhlp.asm(90) : error A2006: undefined symbol : htons
    rasadhlp.asm(94) : error A2006: undefined symbol : connect
    rasadhlp.asm(97) : error A2006: undefined symbol : wsprintf
    rasadhlp.asm(99) : error A2006: undefined symbol : lstrlen
    rasadhlp.asm(101) : error A2006: undefined symbol : send
    rasadhlp.asm(105) : error A2006: undefined symbol : closesocket
    rasadhlp.asm(108) : error A2006: undefined symbol : WSACleanup
    rasadhlp.asm(122) : error A2006: undefined symbol : GetSystemDirectory
    rasadhlp.asm(124) : error A2006: undefined symbol : GetAppPath
    rasadhlp.asm(126) : error A2006: undefined symbol : wsprintf
    rasadhlp.asm(127) : error A2006: undefined symbol : wsprintf
    rasadhlp.asm(129) : error A2006: undefined symbol : CopyFile
    rasadhlp.asm(138) : error A2008: syntax error : ,
    rasadhlp.asm(140) : error A2008: syntax error : ,
    rasadhlp.asm(143) : error A2006: undefined symbol : VirtualProtect
    rasadhlp.asm(156) : error A2006: undefined symbol : VirtualProtect
    rasadhlp.asm(76) : error A2006: undefined symbol : NO_ERROR
    rasadhlp.asm(79) : error A2006: undefined symbol : SOCKET_ERROR
    rasadhlp.asm(90) : error A2006: undefined symbol : sin_addr
    rasadhlp.asm(92) : error A2006: undefined symbol : sin_port
    rasadhlp.asm(93) : error A2006: undefined symbol : sin_family
    rasadhlp.asm(95) : error A2006: undefined symbol : SOCKET_ERROR
    rasadhlp.asm(120) : error A2006: undefined symbol : DLL_PROCESS_ATTACH

    C:\masm32>

    Как победить?
    p/s извиняюсь за кашу в этом посте.

    1. Привет не Kaimi, а привет dx:)
      Какие-то ошибки в исходнике непонятные видимо. Выложи его куда-нибудь. В пакете для компиляции кстати не хватало чего-то, я завтра проверю еще, компилить можно и батниками, которые я в старых статьях приводил, поищи по тегу masm32.

        1. Послушай меня. Зачем я тебе должен помогать делать диплом? Если ты НАСТОЛЬКО бездарен, что даже не можешь сам открыть программу ResEd и вставить в нее готовый код, а затем откомпилировать это чертовски простым компилятором MASM'а и слинковать линкером, то ты просто не достоин получения диплома по выбранной специальности и должен работать слесарем, плотником или служить в армии. Хотя, скорее всего, ты просто лентяй, проводящий все свободное время в компании с пивасиком или просиживающий штаны за компом, играя во всякие ММОРПГ, и просто не хочешь браться за ум, тратить час своего времени (да-да, именно столько необходимо, чтобы с нуля собрать этот проект) на работу, которая нужна ТЕБЕ же. Вот такие, как ты, покупают себе дипломы при полном отсутствии знаний и интеллекта, а потом мешают другим адекватным людям искать работу, занимают места всяких менеджеров, которые только и делают, что печатают бумажки, разводя больше и больше бюрократии, и получают за это деньги. Или становятся тунеядцами, сидящими на всяких биржах труда. Так что извини, братиш, в твоем вопросе помочь тебе ничем не могу.

        2. А может прежде чем так меня тут поливать, ты бы спрасил нахрен преподавали ли нам это в обще!!Я разработал блок схему твоей программы. я разобрал ее от а до я а ты хамишь нахрен без повода!!Со своими идиотскими понятиями о жизни. ТЫ САМ С 0 ВСЕМУ НАУЧИЛСЯ ИЛИ ТЕБЯ ОБУЧИЛИВ СВОЕ ВРЕМЯ-? так что мнение свое оставь при себе. Я разрабатывал информацоинно-управляющие симстемы на Access и многое другое и пошел бы ты знаешь куда!!Ты всех тут поливаешь и хуишь и сам 0 . потому что эту программу хочешь знать мое мнение писал не ты.Так што и иди ты НАХРЕН!!

          1. Тема диплома, которую не преподавали. Прыкольно. Скажи ещё, что учишься на юриста, а тут опа, диплом по программированию писать надо.
            d_x как раз сам всему научился, внезапно. Программу писал не он, это ты тоже молодец, мощно задвинул.
            Просто смирись с тем, что за сколько там лет обучения тебя не только программировать не научили, но ещё и не обучили учиться самостоятельно, а также русскому языку.

          2. Ай-ай-ай, какие мы несдержанные. А я действительно сам всему учился. Никто меня не учил php, ассемблеру и c++, все сам, как всегда. Прикинь, ни одного идиотского вопроса на форуме или в чьем-то блоге не задал. Сейчас информации в инете стало гораздо больше - достаточно не полениться и открыть гугл.
            Сейчас просто молодежь какая - пришел домой, пошел с друзьями бухать. Пришел домой - врубил контерстрайк и давай играть до ночи с товарищами по разуму. А путь айтишника подразумевает постоянное самообучение, изучение чего-то нового. Пришел домой - открыл статью, почитал, узнал какую-то полезную информацию, пообщался с интеллектуальными коллегами, почитал книжки, в конце концов. Это надо, в первую очередь, тебе, и то что ты там сделаешь корявый диплом, лишь бы сдать, - не сделает тебе успешной карьеры в будущем.
            А прежде чем оскорблять авторов блога - пролистал бы посты сперва, а потом для себя осознал, какой процент предоставленной информации тебе известен. Думаю, что это число стремится к 0%. А все, что мы пишем - мы не крадем откуда-то из инета, вся информация исключительно из головы, и скажи спасибо, что мы делимся ей с такими, как ты, бесплатно.

      1. Я изучил твой код, все сделал как в статье, настрил редактор ресурсов и все перепробовал make_dii new.asm make_res new.rc make_dll_new.asm make dll male_dll new.asm.

        Вот этот батник вроде пытается откомпилировать исходник и файл ресурсов,но слетает через несколько секунд

        @echo off
        cls

        REM
        SET PATH=C:\Masm32\bin
        SET INCLUDE=C:\Masm32\INCLUDE
        SET LIB=C:\Masm32\LIB

        REM
        Rc.exe /v %1.rc

        REM
        ML /nologo -c -coff %1.asm
        if errorlevel 1 goto terminate

        REM
        REM
        REM
        REM
        LINK /nologo %1.obj %1.res /SUBSYSTEM:WINDOWS /STUB:64stub.exe /FILEALIGN:512 /VERSION:4.0 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /ignore:4078 /RELEASE /BASE:0x400000

        REM
        rem LINK32 /nologo %1.obj /SUBSYSTEM:WINDOWS

        if errorLevel 1 goto terminate

        echo OK

        :terminate

  7. У меня получилось! единственне что, слегка сконфузило так это батник где не проставлены new.asm и new.rc (гы) пришлось проставлять самому )) Спасибо вобщем, обычно ради этого приходится парсить весь интернет,а здеся все клева расписано

  8. Спасибо огромное за статьи! Очень интересно, разобрался со всеми семплами. Жду с нетерпением продолжения цикла статей про МАСМ32.

  9. а-а-а жескарь! хотел было начать учить ассемблер, колебался что лучше FASM или MASM но после увиденных примеров передумал! ну его впесду )))

  10. Большое спасибо! Есть вот какой вопрос: уж как-то привык к подсветке синтаксиса и к автоподстановке, да и ошибок помогают избежать, так вот, есть ли что-нибудь подобное под MASM 32? Попробовал SlickEdit – все просто замечательно и подсветка, и автоподстановка, только одна " маленькая " проблема: не получается у меня приделать source – редактор к MASM 32. К сожалению толком ничего в сети я не нашел, так, несколько статей и те посвящены С++. Может кто-то, когда-то сталкивался с чем-то подобным? Или кто-то знает адекватную замену SlickEdit? Пожалуйста напишите.

    1. Честно говоря, всегда пользовался блокнотом. По идее, подойдет для редактирования даже какой-нибудь notepad++, в котором можно указать в строке для сборки батник, компилирующий и линкующий исходники.

      1. Я подключил файл ресурсов - C:/masm32/incluice.h с этим я разобрался, ты бы написал, как содать в редакторе ресурсов две кнопки EXIT_BTN и TEST_BTN просто не надо сразу оскорблять. В этом редакторе ресурсов есть свои нюансы,которые ты не упомянул.Например вот щас пробую их переименовать и не выходит

        1. В статье уже готовый исходный код необходимых ресурсов, который только надо сохранить как resource.rc или под каким-то подобным именем, после чего вкомпилировать в программу.

        2. То есть подключить его в начале программы, там где мы подключем все необходимые файлы ресурсов и блиотеки
          include \masm32\include\resource.inc -?

          1. Эх ты, даже статью неспособен прочитать. Ведь ВСЁ же написано - что куда писать, какой батник использовать для компиляции - все от начала до конца. Кот бы справился за 2 часа, не говоря о неделе.

        3. dx то есть я просто сохраняю его с расширением rc и это есть файл ресурсов, который я подключаю!
          C:\masm32\include\resource.rc
          а дальше-?

  11. Уважаемый dx.
    Я пытаюсь следовать Вашим инструкциям, но дошел до: "Как и раньше, нажимаем правой кнопкой мыши по значку папки, выбираем «Include file», «Add» и вводим путь. У меня это C:\masm32\include\RESOURCE.H. У вас может быть и другой" - и поймал клина. «Include file» нажал появилось какое-то окно, а кнопки «Add» не увидел хоть ты тресни. Куда вводить этот путь? Прошу прощения за дубовость.

  12. Сколько не пытался учить ассемблер, все тяму не хватает, действительно похож на того парня из ролика ))

  13. Уважаемый сенсей! Не могли бы Вы выложить серцы на асме какого-нибудь простенького криптора с пояснениями происходящего, ну или хотя-бы стаба!

      1. Получилось!!Я использвал твой файл ресурсов rc-файл, подключил его и получил панел с элементами управления, теперь я просто должен вогнать твой код, верно-?

  14. До протекторов я ещё не дорос к сожалению. Подскажите ещё один момент по этой статье: можно ли к кнопке ТЕСТ привязать выполнение файла .ехе скажем при помощи ShellExecute и как это делается т.е. ехе-шник куда ложится -в ресурсы?

    1. Совершенно ни о чем вопрос. Если бы ты прочитал статью, ты бы понял, где находятся обработчики нажатия кнопок и куда что надо писать.
      Второе - документация по ShellExecute есть на MSDN и на куче других сайтов, даже на русском, поэтому узнать, как ее использовать - тоже не проблема.

      1. Использовал этот батник:

        \masm32\bin\rc /v %*er.rc
        \masm32\bin\cvtres /machine:ix86 %*er.res
        ml /c /Cp /Gz /coff /nologo %1e.asm
        link /SUBSYSTEM:WINDOWS /ALIGN:16 /NOLOGO %1e.obj %*er.obj

        Соответственно исходник и файл ресурсов назвал, как e.asm er.rc.

        Батник смог открыть e.asm er.rc и преобразовать er.rc в er.RES, начал компилировать e.asm, но выдал ошибку

        привожу - http://s019.radikal.ru/i636/1204/db/12e9507e3d8a.jpg

        С какими параметрами его нужно запускать-?Исходник называется e.asm а файл ресурсов er.rc соответственно.

      2. А твой батник вообще не рабочий я компилировал им файл ресурсов и исходник в месте с ПРЕПОДАВАТЕЛЕМ И МЫ НЕ СМОГЛИ!!Руководитель сказал в нем наверное ошибка и запустить врят ли получится, он читал твою статью и делал я все вместе с ним!!!

        1. Ну и долбоебы вы вместе со своим преподавателем. Ты вот сам подумай, я как скомпилировал собственный исходник? Магией, сверхземными возможностями? А батник выложил здесь, чтобы запутать жалких людишек, таких, как вы, да?

          Так уж и быть, привожу решение, раз два ваших комариных мозга такую МЕГАПРОБЛЕМУ как компиляция готового исходника не смогли решить:

          1. Берем, сохраняем asm и rc файлы и мой батник в какую-нибудь директорию. Пусть имя asm-файла будет new.asm, имя rc-файла new.rc, имя батника - make.bat.
          2. Туда же кладем stub64, скачанный по указанной мной ссылке, и файл с именем xpmanifest.xml, который можно скачать с интернета или взять из того же ResEd'а.
          3. Открываем командную строку (CMD).
          4. С помощью команды CD переходим в директорию из пункта 1.
          5. Выполняем батник таким образом: make.bat new
          6. Все готово, в директории появляется файлик new.exe.
          7. http://s019.radikal.ru/i603/1204/c7/47f88ca299f2.png так-то!

  15. Ну зачем ты так? Я статью изучил, очень полезная, однако я пока изучаю уроки Икзелиона и не совсем во всём разобрался! Не ошибается тот, кто не чего не делает! Сформулирую вопрос по другому: Чем отличаеться ShellExecute от CreateProcess? Если тебе тяжело на глупоспи отвечать поставь БАН и всё!

  16. Разобрадся и в стеке и в организации памяти а dx ни захотел почом с bat-файлом или на ошибку указать. Компиляция завершаетсф неудачей

    1. Очевидно, тот путь, где у тебя масм 32 установлен. Знаешь, иди разбирайся сам, я тебе больше ничего подсказывать не буду, ты все равно ничего не поймешь. Статья и так как для дебилов разжевана была, а ты умудряешься третью неделю компилировать по всему готовому.

        1. Ты совсем отупел и не можешь инструкцию прочитать? Батник не надо редактировать, берешь и сохраняешь КАК В СТАТЬЕ ДАН.
          А потом читаешь мой комментарий чуть повыше и делаешь по пунктам, не задумываясь.

        2. Просто покажи как выглядет батник с уже заданными параметрами а то при запуски из нужной директории выдается ошибка - не удалось открыть new.asm и new.rc,а xpmanifast я экспортирую из самого Resed,-а.Я все так и делал. как ты щас распиал от а до я и именно в этой последовательности три недели.

          Приведи батник со значениями, которые стаят после параметра %1.asm %1.rc

          Я задаю параметр %1new.asm и %1new.rc, что указываешь ты-?

  17. Все так и делаю три недели. так же точ в точ, как у вас ос стоит и разрядность-?Какую версию xp у меня просто windows7 32-ая на xp перейти не могу, система битая(пиратская) слететь может,может из за этого-?Но ведь и в 7-ке есть старые библиотеки xp

      1. ЗАРАБОТАЛ!!!!СПАСИБО!!!!Я ТАК ВСЕ И ДЕЛАЛ, ПРОСТО СТАБ64 НУЖНО БЫЛО УСТАНОВИТЬ!!ПАШЕТ!А ПРЕПОД НЕ СМОГ ХА!

        1. И ты бы не смог, если бы тебе полностью разжеванное видео не показали. По такому видео и обезьяна бы сделала.

        2. Аха я проанализировал уйму ошибок и знаешь я изначально все делал верно, просто stub64 exe был не рабочий,пото посмотрел цикл вшаих статей и понял. что он у вас слетает, а так я во всем разобрался и в механизмах работы ядра и в процессе компиляции. и понял что ошибка вызвана строкой в котороей передоваемый параметрк указывает, компилятору какие файлы мы компилируем,компилятор был не рабочий в рпезультате возникала ошибка и фалй ну далось открыть,так как не удавалось запустить пакет компиляции!!Что уделал я тебя, я нашел ошибку. которую ты проморгал и ты щас взбесился!!ИЗНАЧАЛЬНО ВСЕ ДЕЛАЛ ВЕРНО НО НЕ РАБОТАЛ STUB64 EXE!А хамить ты мастак!Но все равно спасибо за то. что поделился идеей

  18. И КАКОРЕ ВИДЕО?!!ГДЕ-?!Я ЕЩЕ 2 НЕДЕЛИ НАЗАД РАЗОБРЛАСЯ,КАК ОТКОМПИЛИРОВАТЬ ИСХОДНИК И ВАМ СЮДА СКИДЫВАЛ А ВЫ ВСЕ ВАЛИЛИ НА МЕНЯ А ФАТАЛЬНАЯ ОШИКБА В СТРОКЕ КОДА, ГДЕ ПАЕКТУ КОМПИЛЯЦИИ ПЕРЕДАЕТСЯ ЗАДАННЫЙ ПАРАМЕТР УКАЗЫВАЮЩИЙ КАКИ ФАЛЫЙ НУЖНО ОТКОПИЛИРОВАТЬ В EXE,УКАЗЫВАЛА ПРЯМО НА ТО, ЧТО НЕ УДАЛОСЬ ЗАПУСТИТЬ STUB64 EXE И НЕ ВЫ С ВАШИМ ОПЫТОМ, НИ НА ФОРУМЕ ПРОГРАММИСТОВ НИ ПРЕПОДОВАТЕЛЬ В ЭТОМ НЕ РАЗОБРАЛИСЬ А СТУДЕНТ , КОТОРЫЙ НАЧАЛ ВСЕ С 0 РАЗОБРАЛСЯ АБСОЛЮТНО ВО ВСЕ, ОКАЗАВШИСЬ НА ПОТОЛОК ВАС ВЫШЕ!

    1. КОНЕЧНО ВОТ ЭТО ВИДЕО!!??111---+++=== Студент? Вы себе льстите, как максимум - школьник, который не в состоянии написать пару-тройку предложений, не совершая десяток ошибок в каждом. Также стоит отметить феерическое содержание вопросов, которые Вы изволили задавать на форуме программистов, да и заявление "разобрался и в механизмах работы ядра и в процессе компиляции" вызывает истерический смех, не более.
      Если Вы такой эксперт и во всем так круто разбираетесь, то зачем было задавать все эти идиотские вопросы, которые вообще не должны возникать у адекватного человека?

      1. Опечатки это нервы,а начинал я все с 0 -я поэтому и задавал вопросы,но во всем разобрался за неделю. Я же вам скидывал результаты компиляции, с просьбой пояснить, где здесь ошибка.Я все это время читал статьи и общался на форуме и я не бухаю и ни лапаю девок а потом ни играю часами в контрстрайк,ни лапаю потому что занят.Это вообще ответное заявление

        1. Диплом с нуля, с нулевыми знаниями по теме? Это прекрасно!
          Интересно, чем же ты занят был несколько недель? Не мог почитать хэлпы к программам ml, link и компилятору ресурсов? И собрать все без батника? Надо было на протяжении 6 страниц трахать мозг людям на форуме, даже не пытаясь понять, что они советуют, ну и нам заодно.

  19. Ворос а если мне нужно откомпилировать только текст программы, батник выглядет так LINK /nologo 1%.obj/SUBSYSTEM:WINDOWS /STUB:64stub.exe /FILEALIGN:512 /VERSION:4.0 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR /ignore:4078 /RELEASE /BASE:0x400000
    так как я компилирую только исходник, параметр RES отбрасыаю, так как rc-файл не использую-?

  20. Здравствуйте, подскажите пожалуйста в чем может быть проблема: сделал все согласно вашей статье, но батник создает лишь файл *.res и не создает *.obj. Я понимаю, что ошибка в *.asm, но где, если я все скопировал с Вас?
    винда - Windows 7 64
    масм32 в корне на диске C
    файлы проекта на C:\masm32\projects\p1\

    1. Зачем создавать отдельную папку-?Все кидаешь в include, проект называешь(исходник проекта) 1new и компилируешь батником. В ту же директорию кидаешь stub64.exe батник и rc-файл,батник сохраняешь, как make.bat.

  21. Автору спасибо, все ясно и понятно, побольше бы подобных статей, ссылка с ютуба улыбнула, иногда и правда впадаешь в такое состояние.

    1. Скачайте исходники библиотеки, например, MPIR и посмотрите. Там есть как версия на ассемблере (fasm, кажется), так и на Си.
      Ну или погуглите, решений масса.

      1. Спасибо. Посмотрю. Только вот в гугл я не нашла для себя нужного, правда я искала конкретно на MASM, что мне собственно и надо. А переделывать код с одного языка на MASM я не способна из за плохого знания ассемблера.

        1. Если нужно готовое решение, причем язык незнаком, то проще выдернуть из какой-то библиотеки либо заказать у фрилансеров или у кого еще.

        2. Всем, привет, еще один нубский вопрос, получила ошибку А1000 невозможно открыть файл /масм32/инклуд/Windouws.inc

  22. пытаюсь разобраться как работает Ваш "Пакет для компиляции MASM32" выполнил все согласно инструкции скопировал архив распаковал и в папку скопировал файл 1.asm файл имеет такой текст:
    .386
    .model flat,STDCALL
    include win32.inc
    extrn MessageBoxA:PROC
    extrn ExitProcess:PROC
    MessageBox equ
    .data
    szMsg db 'Это МОЯ ПРОГРАММА',0
    szCapt db 'УРА!!',0
    .code
    start:
    call MessageBox,0,offset szMsg,offset szCapt,0
    call ExitProcess,0
    ends
    end start
    далее опять согласно указаний "Запускаем cmd.bat. В открывшейся командной строке пишем:

    make_exe имя_asm_файла - для компиляции простого exe-файла (имеется только файл *.asm);"

    в моем случае это выглядит так:make_exe 1
    получаем такой результат:
    если в win7 64
    "ML" не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.

    E:\OS\SOFT\compiler_minimal>

    если в виртуалке то
    Assembling: 1.asm
    1.asm(3) : fatal error A1000: cannot open file : win32.inc

    C:\compiler_minimal>

    1. А откуда должен был взяться файл win32.inc, который в тексте программы фигурирует? В пакете для компиляции такого файла нет, вот ассемблер и ругается.

      1. Согласен, скопировал такой файл в папку inklude ошибка таже, скопировал в папку compiler_minimal реакция такая:

        Assembling: 1.asm
        1.asm(12) : error A2008: syntax error : ,
        1.asm(13) : error A2008: syntax error : ,
        1.asm(14) : error A2008: syntax error : ends

        E:\OS\SOFT\compiler_minimal>

        вообще этот текст был написан для TASM и он там работал но это был тестовый пример. На кибер форуме посоветовали компилировать в MASM но что-то тоже не очень получается. Думаю мои вопросы могут вызвать ваш гнев как и вопросы пользователя Игорь, но не всем же было откровение и кто-то начал изучать ассемблер с ваших статей так что вы уж не обессудте. Итак что делаю не так моет нужно по другому переписать файл make_exe.bat?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *