Переменные.
db — резервирование памяти для данных размером 1 байт.
Директивой db можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для чисел со знаком –128...+127;
для чисел без знака 0...255;
8-битовое относительное выражение, использующее операции HIGH и LOW;
символьную строку из одного или более символов. Строка заключается в кавычки.
В этом случае определяется столько байт, сколько символов в строке.
dw — резервирование памяти для данных размером 2 байта.
Директивой dw можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для чисел со знаком –32 768...32 767;
для чисел без знака 0...65 535;
выражение, занимающее 16 или менее бит, в качестве которого может выступать
смещение в 16-битовом сегменте или адрес сегмента;
1- или 2-байтовую строку, заключенная в кавычки.
dd — резервирование памяти для данных размером 4 байта.
Директивой dd можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для i8086:
для чисел со знаком –32 768...+32 767;
для чисел без знака 0...65 535;
для i386 и выше:
для чисел со знаком –2 147 483 648...+2 147 483 647;
для чисел без знака 0...4 294 967 295;
относительное или адресное выражение, состоящее из 16-битового адреса
сегмента и 16-битового смещения;
строку длиной до 4 символов, заключенную в кавычки.
df — резервирование памяти для данных размером 6 байт;
dp — резервирование памяти для данных размером 6 байт.
Директивами df и dp можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для i8086:
для чисел со знаком –32 768...+32 767;
для чисел без знака 0...65 535;
для i386 и выше:
для чисел со знаком –2 147 483 648...+2 147 483 647;
для чисел без знака 0...4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей микропроцессоров Intel);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
константу со знаком из диапазона –247...247–1;
константу без знака из диапазона 0...248-1;
строку длиной до 6 байт, заключенную в кавычки.
dq — резервирование памяти для данных размером 8 байт.
Директивой dq можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для МП i8086:
для чисел со знаком –32 768...+32 767;
для чисел без знака 0...65 535;
для МП i386 и выше:
для чисел со знаком –2 147 483 648...+2 147 483 647;
для чисел без знака 0...4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей микропроцессоров Intel);
константу со знаком из диапазона –263...263–1;
константу без знака из диапазона 0...264–1;
строку длиной до 8 байт, заключенную в кавычки.
dt — резервирование памяти для данных размером 10 байт.
Директивой dt можно задавать следующие значения:
выражение или константу, принимающую значение из диапазона:
для МП i8086:
для чисел со знаком –32 768...+32 767;
для чисел без знака 0...65 535;
для МП i386 и выше:
для чисел со знаком –2 147 483 648...+2 147 483 647;
для чисел без знака 0...4 294 967 295;
относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или
16 или менее бит (для младших моделей);
адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
константу со знаком из диапазона –279...279-1;
константу без знака из диапазона 0...280-1;
строку длиной до 10 байт, заключенную в кавычки;
упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.
Прототип использования:
[имя_переменной] [размер_даннах] [значение]
Пример использования :
Perem1 db 0
STR db 'Привет всем!'
Perem2 dd 12345
Perem3 dq 134567890
Perem4 dt 123456
Вызов API Функций.
Программирование
в виндовс состоит из вызова API функций и создания своих
функций,которые можно поместить прямо в программе,а можно запихнуть в
свою DLL библиотеку(тогда их можно использовать много раз(что и делают
ленивые работники Мелкософта)).
Вызывается
функция так:
invoke procedure,
параметр_1, параметр_2, параметр_3
Или
так:
push
параметр_3
push параметр_2
push параметр_1
call [procedure}
Вообще-то
даже если вы используете первый метод(он намного удобней),всё равно
комилятор FASM вызовет функцию вторым способом(так решил добрый дадя из
Мелкософта,одобривший метод STDCALL).
Кстати
каждая Windows программа вызывает хотя-бы одну функцию.Обычно это
функция ExitProcess
в Win9X,NT и ExitThread
в WindowsCE.
Макрокоманды(макросы).
Это
такая полезная вешь!Представьте что вам надо использовать
примерно такой код:
mov
eax,9245
mov ebx,3456
mov ecx,7654
add eax,ebx
sub eax,ecx
Вроде-бы ничего такого,но если похожий фрагмент только с другими
значениями встречается в вашей программе раз сто?Вот тут с вами и случитися апоплексический удар.
Конечно вы можете создать свою функцию:
proc Вычисления,
параметр1,параметр2,параметр3
mov eax,[параметр1]
mov ebx,[параметр2]
mov ecx,[параметр3]
add eax,ebx
sub eax,ecx
return
endp
Вызвать её:
invoke Вычисления,
параметр1,параметр2,параметр3
И получить результат в EAX.
Но!Постоянные вызовы функций - это тактика программиста на
VisualBASIC,но не Ассемблера.Ведь это постоянные вызовы функций
командой
CALL и возвращения - RET(мы везде будем загружать процессор двумя(!)
лишними инструкциями(2x100 вызовов=200 лишних инструкций )).
А если мы сделаем так:
macro Вычисления
параметр1,параметр2,параметр3
{
mov eax,параметр1
mov ebx,параметр2
mov ecx,параметр3
add eax,ebx
sub eax,ecx
}
Теперь
мы пишем в тексте программы:
Вычисления
9245,3456,7654
А копмпилятор сам пишет:
mov eax,9245
mov ebx,3456
mov ecx,7654
add eax,ebx
sub eax,ecx
Где
вместо
параметр1,параметр2,параметр3 компилятор подставляет
значения,которые вы ввели(9245,3456,7654).
Надо,пишем:
Вычисления
5,2,6
и
т.д.
Как вы
понимаете макросы - находка для лентяя.Они настолько могучи, что при их
содействии вы можете реализовать почти всё,что вам вздумается.Например
реализовать подобие директив языков высокого уровня и т.д.
Структуры
Это такая штука которая вам очень пригодиться.Вот как она выглядит:
struct Чел
.Вес dd ?
.Рост dd ?
.Возраст dd ?
ends
Вася Чел
Теперь вы можете заполннить эту структуру так:
mov [Вася.Вес],73
mov [Вася.Рост],175
mov [Вася.Возраст],30
То
есть структура похожа на книжный шкаф.Мы знаем что в этом шкафу
детективы?Значит мы будем детиктивы искать в шкафу для детективов?Тогда
нам не стоит искать произведение Дж.Х.Чейза в шкафу где пылятся
мелодраммы.Так и здесь.Есть чел Вася.Мы храним данные о нём в структуре
по адрессу Вася.Нужно сохранить данные Пети?
Петя Чел
mov [Петя.Вес],50
mov [Петя.Рост],140
mov [Петя.Возраст],12
Кроме того мы можем сделать так:
struct Чел
.Вес dd ?
.Рост dd ?
.Возраст dd ?
.Другое Данные
ends
struct Данные
.Клёвый dd ?
.Плохой dd ?
ends
Для заполнения данных о том насколько хорош чел Вася мы пищем:
mov [Вася..Другое.Клёвый],TRUE
mov [Вася..Другое.Плохой],FALSE
Структуры
очень полезны и их активно используют как люди из Мелкософта,так и челы
из мира Linux(а также любой нормальный кодер).Значит ивы должны их
использовать.
Я знаю вы мало что поняли,но через пару месяцев вам эти знания
будут нужны(так что хотя бы два раза перечитайте этот текст
когда
вам это понадобиться).И
помните:
Только практические занятия помогут вам освоить программирование под
виндовс!Тут теория - это костыль который поможет вам идти дальше, когда
вы захромаете на тяжком программерском пути(но никак не ноги которыми
вам надо будет уверенно топать к вершине программерского искуства).Вы
должны копировать нужные вам куски кода(из чужих исходняков) и из них
лепить свои проги.Со временем вы начнёите писать свои оригинальные
процедуры и вам станет намного легче реализовывать различные бредовые
идеи которые без сомнения у вас появяться если у вас есть склонность к
написанию программ.
Please download this files(If you dont loaded this files):
Желаю успеха,Трудяги!