Этот туторал перевёл Евгений Мадан emadan@hotbox.ru - Duker на форуме
http://win32asmboard.cjb.net
Туториал по Ассемблеру NOP-erator(а) #1
(перевёл Евгений Мадан)
Предисловие
Я знаю,что в Интернете есть много хороших туториалов,но я подумал, что я бы мог написать туториал, который не объясняет детально каждую команду,лишь рассказывает, как я понимаю всё.Я уверен, что серии моих туториалов помогут новичкам, и может просветят некоторые вещи.
Начало
Это первая часть из серии моих туториалов,я объясню,как начать с нуля.Я предполагаю, что вы хотя бы знате как создавать папку, копоровать файлы, ну и ещё некоторые маленькие похожие вещи.Прежде всего у вас должен быть пакет MASM32,который вы можете бесплатно скачать здесь:
http://www.masm32.cjb.net
По окончанию скачивания файлов вы должны распаковать их в C:\masm32\.
Следующий шаг это найти правильный редактор для ваших ASM файлов.Чтобы использовать стандартный я возьму "QEditor", который идёт вместе с пакетом MASM32.Если ваш уровень знаний выше, то вы конечно же можете использовать свой любимый редактор.А найти "qeditor" можно в дуректории C:\masm32\,конечно если вы всё правильно проинсталировали.Пожалуйста запустите редактор.Он имеет вид простого текстового редактора со специальными функциями,чтобы ассемблировать ваши программы.
Первая программа
Эта программа будет очень простой.Она всего лишь выведит всплывающее окошко с заданным текстом и заголовком.Каждая стандартная программа состоит из следующих трёх строк:
.386
.model flat, stdcall
option casemap :none
Первая строка означает, что мы собираемся использовать команды 386-го процессора.Обычно не обязательно менять это, не считая того, когда вы пишете программы с использованием DirectX и другим 3D или программы по оптимизацию процессора.Вторая строка не значит ничего, лишь то,что мы собираемся написать 32-х битную программу под WINDOWS.
И ,наконец, третья сообщает компилятору,что большие и маленькие буквы различны.
Например: "MessageBox" и "messagebox", они различны.Также если задан "X", "x" не будет узнан компилятором,так как он не знает такой переменной.Надеюсь вы понимаете,что я имею в виду.
Следующие несколько строк необходимы,чтобы вызвать функции WINDOWS.Программирование Виндовского приложения означает, что нам надо вызывать функции windows из их DLL'ов(библиотек).Вам нужно заполнить параметры этих функциям, которые обычно являются постоянными.Конечно,постоянные представляют собой кокое-то значение,и будет очень трудно смотреть каждое значение.Поэтому мы должны импортировать файлы в нашу программу, которые сообщают компилятору какая постоянная какое имеет значение и как такое обращение к функции окна должно выглядеть.Так что добавьте пожалуйста следующие строки к предыдущим трём:
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\masm32.inc
include \MASM32\INCLUDE\gdi32.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\masm32.lib
includelib \MASM32\LIB\gdi32.lib
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
Это самые важные импортные файлы.Есть и другие, но они нам сейчас не нужны.Следующий шаг-это, как объявить переменные.
Объявление переменных
Обычно после этих строк у вас уже это вставленно в вашу программу, следуют переменные.Существуют 3 вида переменных:константы,переменные которые изначально имеют значение(тоесть мы его задали), и переменные, которые пока не имеют значения(мы его зададим по ходу программы).
Сначала константы.Они вводятся после строки .const . Вот несколько примеров как объявить константы:
.const
FIRST_CONSTANT equ 2
SECOND_CONSTANT equ 5
thirdconstant equ 7
Константы не могут быть изменены во время выполнения программы!Чтобы присвоить константе своё имя мы используем "equ", которое идёт перед значением.
Следующий раздел- это раздел .data. Тут мы должны объявить переменные, которые уже имеют индивидуальное значение во время выполнения. Есть два вида типов data(ы), которые мы будем использовать. Есть Byte и есть DWord.DWord состоит из 4-х байтов и чаще всего используется для обычных чисел.Byte(ы) обычно используются для строк.Несколько примеров, как задавать переменные:
.data
firstnumber dd 3
secondnumber dd 5
firstbyte db 3
secondbyte db 5
string db "Это строка",0
string2 db "Это тоже строка",0
Как вы уже заметили, DWords задаются при помощи "dd"(=Задать DWord) и байты задаются при помощи "db" (=Задать байт).Разница между "firstnumber" и "firstbyte" -это,что firstnumber занимает 4 байта для числа.У этого способа есть приимущества, что числа могут быть больше. Будет лучше всего, если вы будете использовать DWords для чисел и, как я уже сказал, byte(ы) для строк.Вы можете заметить, что каждая строка стоит между двумя " , и заканчиваются они на ,0 . Причина оченть проста: если вы, например, хотите вывести строку во всплывающем окошке, функция должна знать где строка заканчивается.Ноль показывает функции где она должна остановиться и начать считывать строку.Я уверен что вы спросите: почему это ,0 а не просто 0? Ответ следующий: строка это ничто иное, как цепь байтов.Но компилятор дает возможность вставить цепь байтов между " , если они являются буквами.Строки могут быть , например, как эта:
string db 50,30,23,63,0
Эта строка также является цепью байтов.И если числа будут правильным ASCII-кодом для этих букв,показывая строку, будет иметь тот же эффект.
Это очень трудно объяснить, но если вы всё еще не понимаете , попробуйте поэксперементировать с буквой типа data, когда первая программа готова.
Теперь остаётся раздел .data?. Раздел .data? состоит из переменных, которые не имеют своего значения. Они задаются тем же путем, как и переменные в разделе .data , с разницей , что вместо значения мы лишь используем знак вопроса.
.data?
undefinedvariable dd ?
undefindedbyte db ?
andanotherbyte db ?
Не очень сложно, не так ли? Теперь, т.к. мы знаем как объявлять переменные , мы можем начать с "настоящего" программирования...
Программирование простого всплывающего окна
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.