MASM32: Начало
Суббота, 21. Август 2010
Раздел: Assembler, Windows, Для новичков, автор: dx
Решил начать цикл статей по ассемблеру, и, в частности, по 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).
Теперь сохраняем файл ресурсов. Он должен выглядеть примерно таким образом:
#define MANIFEST 24 #define TEST_DIALOG 1000 #define TEST_BTN 1001 #define EXIT_BTN 1002 #define IDR_XPMANIFEST1 1 #include "C:/masm32/include/RESOURCE.H" TEST_DIALOG DIALOGEX 6,6,134,51 CAPTION "Test Dialog" FONT 8,"MS Sans Serif",0,0,0 STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU BEGIN CONTROL "Тест",TEST_BTN,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,6,18,54,13 CONTROL "Выход",EXIT_BTN,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,72,18,54,13 END IDR_XPMANIFEST1 MANIFEST "xpmanifest.xml"
Осталось написать программу. Я в качестве редактора предпочитаю обычный Блокнот Windows. Сначала я приведу полный листинг, а потом прокомментирую его построчно:
.386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\macros\macros.asm uselib kernel32, user32, masm32, comctl32 WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD TEST_DIALOG = 1000 TEST_BTN = 1001 EXIT_BTN = 1002 .data? hInstance dd ? hWnd dd ? icce INITCOMMONCONTROLSEX <> .code start: mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX mov icce.dwICC, ICC_DATE_CLASSES or \ ICC_INTERNET_CLASSES or \ ICC_PAGESCROLLER_CLASS or \ ICC_COOL_CLASSES invoke InitCommonControlsEx, offset icce invoke GetModuleHandle, NULL mov hInstance, eax invoke DialogBoxParam, hInstance, TEST_DIALOG, 0, offset WndProc, 0 invoke ExitProcess,eax WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD switch uMsg case WM_INITDIALOG invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) case WM_COMMAND switch wParam case TEST_BTN invoke MessageBox, hWin, chr$("Hello, world!"), chr$("Test"), 0 case EXIT_BTN jmp exit_program endsw case WM_CLOSE exit_program: invoke EndDialog, hWin, 0 endsw xor eax,eax ret WndProc ENDP end start
Итак, начнем:
.386 .model flat, stdcall option casemap :none
Эти директивы говорят о том, что мы пишем код под 386 архитектуру процессора (это так и будет всегда), вторая говорит о том, что модель памяти мы используем плоскую и вызовы функций по стандарту stdcall. Этот стандарт подразумевает, что аргументы функциям передаются через стек в обратном порядке, и функция сама должна удалять их оттуда. Кроме того, функции сохраняют регистры ebx, edi и esi и возвращают значение в регистре eax. Если вы сейчас ничерта не поняли - не расстраивайтесь, это всё прекрасно разъяснено в гугле - и про регистры, и про стек. Если вы занимаетесь программированием, то понять это не составит труда.
include \masm32\include\windows.inc include \masm32\macros\macros.asm uselib kernel32, user32, masm32, comctl32
Здесь мы подключаем необходимые библиотеки. kernel32 содержит функцию ExitProcess, user32 - всякие GUI-функции, comctl32 - функции работы с common controls, masm32 - библиотека встроенных функций masm32, я не знаю, зачем я ее здесь подключил, потому что она все равно в этом простом проекте не используется. Ну, лишнего объема, как в дельфи, это не добавит, если функции из библиотеки не используются. Я расскажу о ней в будущем. uselib - это макрос masm32, который всё необходимое позволяет одной строкой подключить. Только представьте, эти три строки эквивалентны следующему коду:
include \masm32\include\windows.inc include \masm32\macros\macros.asm include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\comctl32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib includelib \masm32\lib\comctl32.lib
Как узнать, из какой библиотеки функция? Смотреть msdn.
Идем дальше...
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Эта строка представляет собой прототип процедуры. Если вы программируете на C или C++, то знаете, что это такое, если нет - я поясню. Функцию нельзя вызывать до того, как она будет объявлена, поэтому в начало файла часто пишутся прототипы функций, расположенных в других файлах или ниже места первого вызова функции.
TEST_DIALOG = 1000 TEST_BTN = 1001 EXIT_BTN = 1002
Этими строками мы просто объявили некоторые значения из нашего файла ресурсов new.rc. Можно было бы этого и не делать, но с ними программа будет более читаемой.
.data? hInstance dd ? icce INITCOMMONCONTROLSEX <>
В этом куске кода у нас объявляются глобальные переменные в секции неинициализированных данных. Что это такое? Это просто переменные, не имеющие начального значения. Они не занимают места в получающемся после компиляции exe-файле. В hInstance мы будем хранить указатель на модуль нашей программы (зачем - позже поясню), а в icce - структуру INITCOMMONCONTROLSEX (также объясню позже). dd - он же DWORD - тип данных "двойное слово". В C++ такой тип имеют int, long и все указатели, но C и C++ являются более типизированными языками, а в ассемблере всё сводится к двойным словам (4 байта).
Чтобы объявить секцию инициализированных данных и глобальные переменные в ней, пишут так:
.data vasya dd 0 some_string db "hello, world", 0 ;строковая переменная, состоящая из db - байтов (он же BYTE)
В нашей программе тоже будет секция инициализированных данных, просто она неявно объявляется, далее я расскажу об этом.
.code start: mov icce.dwSize, SIZEOF INITCOMMONCONTROLSEX mov icce.dwICC, ICC_DATE_CLASSES or \ ICC_INTERNET_CLASSES or \ ICC_PAGESCROLLER_CLASS or \ ICC_COOL_CLASSES invoke InitCommonControlsEx, offset icce invoke GetModuleHandle, NULL mov hInstance, eax invoke DialogBoxParam, hInstance, TEST_DIALOG, 0, offset WndProc, 0 invoke ExitProcess, eax
Что же происходит здесь? Здесь мы уже объявляем секцию исполняемого кода и метку start, которую потом объявим точкой входа.
Мы инициализируем объявленную ранее структуру icce и вызываем функцию InitCommonControlsEx. Инструкция mov загружает данные в регистр или ячейку памяти. Представьте, что мы пишем
icce.dwSize = SIZEOF(INITCOMMONCONTROLSEX); icce.dwICC = ICC_DATE_CLASSES | ICC_INTERNET_CLASSES | ICC_PAGESCROLLER_CLASS | ICC_COOL_CLASSES; InitCommonControlsEx(&icce);
... и всё станет понятнее. Встроенный макрос invoke используется для вызовы любых функций, у которых есть прототип (а прототипы всех WinAPI прописаны в заголовочных файлах MASM32, которые мы подключили в самом начале программы). Sizeof возвращает размер структуры в байтах, offset позволяет получить смещение в памяти какого-либо байта. Есть еще addr, позволяющая получить смещение какого-то байта, размещенного в памяти по заранее неизвестному адресу (например, для локальных переменных в процедурах).
Теперь дальше - мы получаем указатель на начало нашего исполняемого модуля. Опять-таки, представьте, что мы пишем
hInstance = GetModuleHandle(NULL);
Все stdcall-функции возвращают значение в регистре eax, как я уже говорил, а GetModuleHandle как раз stdcall WinAPI. Ах да, у вас, вероятно, есть вопросы по этим функциям, если вы впервые слышите про WinAPI? Ну так вбейте название непонятной функции в гугл, и получите ссылку на msdn с подробнейшим описанием.
И, как вы уже могли догадаться, мы создаем диалоговое окно функцией DialogBoxParam с указанием идентификатора диалога из файла ресурса (TEST_DIALOG = 1000). Эта функция начинает цикл сообщений windows с использованием функции WndProc, на которую мы передали указатель. Это типизированная функция, далее я опишу ее, но пока что - пара слов о цикле сообщений. Каждое окно в Windows получает множество сообщений от системы или других приложений, от других окон или от своего же в непрерывном цикле. Процедура WndProc будет эти сообщения получать, а мы будем в ней обрабатывать часть сообщений. которые нужны нам.
Далее я распишу код с комментариями:
;WndProc - это процедура, которая принимает 4 параметра ;hWin - хендл окна, которому передается сообщение ;uMsg - тип сообщения ;wParam и lParam - по сути, дополнительные данные, ;различные для каждого сообщения WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD ;switch - такой же, как во всех языках. Это макрос MASM32, удобно, не так ли? switch uMsg ;WM_INITDIALOG отсылается диалогу 1 раз - когда форма загружается case WM_INITDIALOG ;Давайте установим диалогу иконку "Инфо" ;Для этого мы пошлем ему самому сообщение ;WM_SETICON с указателем на иконку ;которую загрузим функцией LoadIcon invoke SendMessage, hWin, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) ;FUNC - еще один удобный макрос MASM32 ;он вызывает функцию и возвращает ее возвращаемое значение :) ;теперь - к обработке нажатий на кнопки ;за это ответственно сообщение WM_COMMAND case WM_COMMAND ;идентификатор кнопки будет в wParam ;не верите - вбейте в гугл "WM_COMMAND" switch wParam ;если нажали на TEST_BTN case TEST_BTN ;выведем сообщение Hello, World invoke MessageBox, hWin, chr$("Hello, world!"), chr$("Test"), 0 ;здесь chr$("строка") - еще один удобный макрос MASM32 ;он создает строку в инициализированной секции данных ;и возвращает указатель на нее ;это эквивалентно записи: ;.data ;some_name db "Hello, world!",0 ;... ;invoke MessageBox, hWin, offset some_name, ... ;Если нажали Выход case EXIT_BTN jmp exit_program ;переходим на выход ;ДА! Ассемблер - это язык, где никто не будет ;ругаться за использование в программе GOTO! endsw ;WM_CLOSE посылается окну при нажатии на крестик или при Alt+F4 case WM_CLOSE exit_program: invoke EndDialog, hWin, 0 ;закрываем диалог endsw xor eax,eax ;всегда возвращаем 0 ret WndProc ENDP
Ну и последнее:
end startЗдесь мы устанавливаем точку входа на метку start, т.е. с нее начнется выполнение программы.
Ну что же, сохраним код как new.asm, закинем в одну папку new.rc, new.asm и xpmanifest.xml и скомпилируем всё следующим bat-файлом:
@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.ru/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
После компиляции и линкования получаем программу размером 2.5 кб, которая еще и работает. Ну не прелесть ли?
Надеюсь, эта статья была вам полезна. Хотя о чем это я... Если вы дочитали до этого момента, то явно почерпнули для себя что-то полезное. Надеюсь, вам уже хочется писать свои GUI-программы на ассемблере с использованием MASM32, наполняя их функционалом, ну или хотя бы немного заинтересовала эта тема. В следующей статье я напишу что-нибудь более полезное, чем простой "Hello, world!", и представлю Вашему вниманию.
И последнее. Если после прочтения вы будете находиться в состоянии, подобном этому - не расстраивайтесь, у вас ещё все впереди! :)





xoxa99 :
спс)))
[Ответить]
Тфьу :
Очень интересно, хоть и не дочитал до конца, но сегодня днем теоретически осилить надеюсь смогу =)
И материал в удобной и понятной форме преподносите, и на примерах, и с расшифровкой всего и вся...
Буду ждать новых статей =)
Спасибо.
p.s. если совмещать изучение разных языков - мозг не сварится ? =)
[Ответить]
dx:
Август 21st, 2010 at 11:29
Думаю, что не сварится. Тем более, знание WinAPI и ассемблера будет полезно и для любителей дельфи/C++, потому что в них можно использовать и WinAPI, и ассемблерные вставки по желанию. В C#/VB тоже иногда возникает необходимость в WinAPI. Единственное, что я не описал - это самые основы ассемблера (стек, регистры, куча), но по этой теме литературы масса, и я думаю, что несколько затрону эту тему в следующей статье.
[Ответить]
ОЛЕГ:
Январь 29th, 2011 at 20:37
dx здравствуй,подскажи мне пожалуйсто куда именно надо на писать TEST_BTN и EXIT_BTN:что-бы появилсь кнопки тест и выход в диалоговом окне я так и не разобрался?!
[Ответить]
iv :
Мда, на дворе 21 век, а люди продолжают писать под архитектуру процессора 1985(!) года.
И какой смысл писать гуй на ассемблере? Это крайне неудобно и не наглядно по-моему.
Погоня за размером? Так запаковать можно же.
Программа медленно выполняется? Так можно оставить её на сях, а в критические участки сделать ассемблерные вставки.
[Ответить]
dx:
Август 22nd, 2010 at 13:15
Поговорим о win32.
> Мда, на дворе 21 век, а люди продолжают писать под архитектуру процессора 1985(!) года.
Не знаете - не говорили бы. Дельфи и вижал бейсики собирают exe именно под 386 архитектуру процессора, потому что с тех пор никаких изменений не произошло среди команд, доступных в user-mode.
> И какой смысл писать гуй на ассемблере? Это крайне неудобно и не наглядно по-моему.
Ну так не пишите, продолжайте перетаскивать кнопочки и программировать их двойным кликом, не зная даже, как организуются ресурсы и как окно обрабатывает сообщения.
> Погоня за размером? Так запаковать можно же.
Сделайте такую же программу на дельфи с использованием его стандартных компонентов, запакуйте, и скиньте мне файл 2.5 кб.
> Программа медленно выполняется? Так можно оставить её на сях, а в критические участки сделать ассемблерные вставки.
С этим не спорю, но чтобы уметь писать ассемблерные вставки - надо сначала узнать ассемблер и некоторые вещи по части низкоуровневого win32-программирования.
[Ответить]
iv:
Август 22nd, 2010 at 13:27
1. Не знаю, никогда не программировал на этих языках. Если так - то это печально, в 686 есть наборы инструкций, которые выполняются быстрее. А обратная совместимость с древними процессорами - это бред уже по-моему.
2. Всё это можно понять, программируя на чистом си.
3. Опять же, я говорил про язык си.
[Ответить]
dx:
Август 22nd, 2010 at 13:58
Никто вас не заставляет учить ассемблер и писать только на нем. Пишите на си, в чем проблема. Просто есть вещи, которые даже на си сложно написать, например, тот же сплайсинг WinAPI-функций или получение информации из TIB не обойдется без ассемблерных вставок. И это как минимум, вставок, а как максимум - __declspec (naked) и всего кода на ассемблере.
Kaimi:
Август 22nd, 2010 at 13:17
Загрузчик ОС напишешь на сях?
[Ответить]
iv:
Август 22nd, 2010 at 13:28
С графическим интерфейсом - точно нет. :)
[Ответить]
Дмитрий:
Декабрь 28th, 2010 at 15:43
да-да, мы тут все только тем и занимаемся что пишем загрузчики ОС
[Ответить]
Тфьу :
Не получается сделать эту часть :
Первое – это include-файл с определениями всех констант, который будет необходим компилятору ресурсов MASM32. Как и раньше, нажимаем правой кнопкой мыши по значку папки, выбираем «Include file», «Add» и вводим путь. У меня это C:\masm32\include\RESOURCE.H.
Когда нажимаю правой кнопкой мыши по папке, там есть строка "Include files" , я тыкаю ее, и появляется папка Misc с красным этим файлом, а кнопки "Add" для указания пути найти не мог. Пробывал нажать правой кнопкой по этому файлу и выбрать пункт - "Export Names" - но когда выбираю файл "RESOURCE.H" - пишут мол он уже существует, и спрашивают заменить ли его... В итоге перед сохранением файла должного кода не получается =(
[Ответить]
dx:
Август 24th, 2010 at 01:46
http://s006.radikal.ru/i214/1008/42/a2b841680ba8.png
[Ответить]
Тфьу :
dx спс, нашел, правая панель появилась только при полностью развернутой программе
[Ответить]
Тфьу :
неполучается скомпилировать все вместе (.asm, .rc, .bat, xpmanifest), до этого в папку также копирую файл 64stub.cmd
в .bat файле изменяю 1.rc на new.rc, 1.asm на new.asm
как правильно?
[Ответить]
dx:
Август 26th, 2010 at 18:18
Все файлы должны одинаково называться, например, 1.asm, 1.rc. Манифест должен зваться xpmanifest.xml. Стаб 64-байтовый (если его используете) должен быть 64stub.exe. Вот, я выложу его: http://slil.ru/29602592
Если не получится, ошибки сюда скопируйте.
[Ответить]
zannussi :
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
[Ответить]
dx:
Сентябрь 9th, 2010 at 12:55
bat-файл нужно запускать с параметром из командной строки, например "make.bat new".
Сначала, разумеется, нужно командой cd перейти в директорию с проектом.
[Ответить]
zannussi:
Сентябрь 10th, 2010 at 09:20
разобрался, спасибо
[Ответить]
Incognito :
%) ну вы понели)))
[Ответить]
Ower :
Привет 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 извиняюсь за кашу в этом посте.
[Ответить]
dx:
Октябрь 27th, 2010 at 00:37
Привет не Kaimi, а привет dx:)
Какие-то ошибки в исходнике непонятные видимо. Выложи его куда-нибудь. В пакете для компиляции кстати не хватало чего-то, я завтра проверю еще, компилить можно и батниками, которые я в старых статьях приводил, поищи по тегу masm32.
[Ответить]
dx:
Октябрь 27th, 2010 at 00:41
И, кстати, почему make_dll-то... Тут же не dll собирается, а exe. Хотя, судя по твоим ошибкам, собираешь ты что-то своё.
[Ответить]
Вася :
У меня получилось! единственне что, слегка сконфузило так это батник где не проставлены new.asm и new.rc (гы) пришлось проставлять самому )) Спасибо вобщем, обычно ради этого приходится парсить весь интернет,а здеся все клева расписано
[Ответить]
GomHu :
Спасибо за статью
[Ответить]
я :
Спасибо огромное за статьи! Очень интересно, разобрался со всеми семплами. Жду с нетерпением продолжения цикла статей про МАСМ32.
[Ответить]
My name :
а-а-а жескарь! хотел было начать учить ассемблер, колебался что лучше FASM или MASM но после увиденных примеров передумал! ну его впесду )))
[Ответить]
xway :
Большое спасибо! Есть вот какой вопрос: уж как-то привык к подсветке синтаксиса и к автоподстановке, да и ошибок помогают избежать, так вот, есть ли что-нибудь подобное под MASM 32? Попробовал SlickEdit – все просто замечательно и подсветка, и автоподстановка, только одна " маленькая " проблема: не получается у меня приделать source – редактор к MASM 32. К сожалению толком ничего в сети я не нашел, так, несколько статей и те посвящены С++. Может кто-то, когда-то сталкивался с чем-то подобным? Или кто-то знает адекватную замену SlickEdit? Пожалуйста напишите.
[Ответить]
dx:
Май 17th, 2011 at 18:13
Честно говоря, всегда пользовался блокнотом. По идее, подойдет для редактирования даже какой-нибудь notepad++, в котором можно указать в строке для сборки батник, компилирующий и линкующий исходники.
[Ответить]
konstr003 :
Уважаемый dx.
Я пытаюсь следовать Вашим инструкциям, но дошел до: "Как и раньше, нажимаем правой кнопкой мыши по значку папки, выбираем «Include file», «Add» и вводим путь. У меня это C:\masm32\include\RESOURCE.H. У вас может быть и другой" - и поймал клина. «Include file» нажал появилось какое-то окно, а кнопки «Add» не увидел хоть ты тресни. Куда вводить этот путь? Прошу прощения за дубовость.
[Ответить]
dx:
Май 19th, 2011 at 17:33
Покажите скриншот окна, возможно, версия редактора ресурсов другая какая-то. У меня это выглядит так:
http://habreffect.ru/files/ed3/4502f51a2/resed.png
[Ответить]
Алекс :
Сколько не пытался учить ассемблер, все тяму не хватает, действительно похож на того парня из ролика ))
[Ответить]
GatlingGun :
Вот нашел копи паст http://www.hack-info.ru/showthread.php?t=65611 кстати есть более удобный редактор ресурсов по моему мнению для masm, WinAsm Studio
[Ответить]