Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на ассемблере под Windows с нуля Выпуск №1


Информационный Канал Subscribe.Ru


В поисках истины

или программирование на ассемблере под Windows с нуля.


Выпуск №1

Сегодня в выпуске:


О рассылке

Это первый выпуск рассылки "В поисках" В этой рассылке я (SeDoYHg) буду обучать вас нелегкому делу программирования на языке ассемблера под ОС Windows. Я буду стараться выпускать рассылку с периодичностью 2 раза в неделю.

        Причины создания рассылки
Объективные:
  1) Несоответствие спроса и предложения.
Сейчас многие юзеры, по разным причинам, стали интересоваться ассемблером, но действительно интересного и понятного изложения азов этого языка программирования, к сожалению мало. Автор предпринял попытку восполнить этот недостаток, а что из этого получится, я надеюсь, скоро будет ясно.
  2) Ошибки "туториалщиков"
Большинство людей, пишущих туториалы по ассемблеру под Windows для начинающих, совершают одну и ту же ошибку - они описывают функции WinAPI и способ их использования, без подробного объяснения самого языка ассемблера. Я решил не повторять их ошибку, и буду больший упор делать на синтаксис и логику этого языка.
Субъективные:
  1) Продвижение нашей команды ;-).
Я являюсь участником команды TLRH. Рассылка - это один из лучших способов заявить о нашем существовании.



Немного об ассемблере

    Ассемблер - это один из старейших языков программирования, раньше без знания ассемблера невозможно было написать ни одной программы. В настоящее время он был вытеснен с лидирующей позиции такими языками как С, С++, Pascal. Многие предрекали ему скорую смерть, говорили что, Си может заменить его везде и во всём. Но ассемблер может умереть только в одном случае, если "умрет" процессор. А как мы понимаем такой оборот событий в ближайшем будущем не предвидется. Для того чтобы понять почему это так, надо знать что такое ассемблер. Если по простому, то ассемблер - это символическое (мнемоническое)представление машинных команд процессора. Значит, если есть машинные команды, есть и ассемблер.
   Программируя на языках высокого уровня (ЯВУ), вы никогда не можете точно знать в какую последовательность машинных команд превратилась та или иная конструкция. Программируя на языке ассемблера вам подвластен каждый байт. Поэтому с одной стороны вы получаете неограниченные возможности при написани своих программ, с другой - вероятность совершить ошибку, которая может порушить все вокруг, увеличивается во много раз.

   Давайте рассмотрим плюсы и минусы программирования на языке ассемблера.

++Плюсы++
1) Программы, написанные на языке ассемблера (если они написаны грамотно), отличаются высокой эффективностью, т.е. минимальным объемом и максимальным быстродействием.
2) Программы, написанные на языке ассемблера, могут то, что не под силу программам, созданным на любом другом языке программирования.
3) Программы на ассемблере легко отлаживать, так как в них нет лишнего кода, который присутствует при использовании ЯВУ.
4) Язык ассемблера является основным инструментом исследования программ, для которых нет исходных текстов. Это используются для взлома программ, защищенных паролем, с ограничением по времени использования и т.д. Проще говоря, СRACK =).
5) С появлением высокоуровневых конструкций в языке ассемблера, программировать под Windows стало так же удобно как и на C.

--Минусы--
1) Программы, написанные на языке ассемблера, не переносимы. Программы, написанные для IBM PC, не будут работать на компьютере с другой архитектурой.
2) Исходные тексты программ, более объемные (за все надо платить).

    Если я вас не отпугнул "минусами", тогда смело продолжайте читать дальше. Если, все-таки, вам стало страшно, все равно читайте, вы поймете, что все не так уж страшно =)

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



Предисловие

   Однажды я заговорил со своим другом о программировании, тогда мы еще учились в школе. Я ему рассказывал о том, как легко и просто писать программы на Delphi, о том, что лучше этой среды разработки не существует, и том что объектный паскаль лучший язык всех времен и народов ;-). Потом он сказал слова, которые повлияли на всю мою дальнейшую программерскую жизнь: "Делфи создает абсолютно не эффективные программы, они занимают много места и жутко тормозят. Для виндов лучшая среда MS Visual C++, настоящие программисты только в ней свои проги и пишут". И тут же добавил: " но еще более мощный язык - это Ассемблер, проги написанные на нем самые маленькие и самые быстрые". Дальше он мне стал рассказывать, что можно сделать с помощью ассемблера, но главные слова были уже сказаны.



Введение

   Изучение любого языка программирования сопряжено с определенными трудностями, необходимо обладать определенным складом ума, большим количеством свободного времени, незаурядными творческими способностями. Сутками просиживать за монитором, перечитывать многотомные справочники в поисках нужного алгоритма. В этом изучение ассемблера ни чем не отличается от изучения любого другого языка программирования. Самое главное отличие при изучени ассемблера состоит в том, что без достаточно хорошего знания архитектуры компьютера, невозможно научится писать эффективные и мощные программы.

   Программирование на ассемблере под ОС Windows воспринимается совсем не однозначно. С одной стороны, программы, написанные на ассемблере, я никогда не устану это повторять, самые маленькие и самые быстрые, но с другой - время, затраченное на разработку самого простого приложения, займет в десятки раз больше времени, чем при использовании таких сред как Delphi. В этом месте необходимо оговорится, я подразумеваю использование возможностей сред без использования WinAPI. Если же писать приложения на WinAPI, то разница во времени затраченном на разработку приложений заметно сокращается, в некоторых случаях её может и не быть совсем, и к тому же объем исходных текстов также становится сопоставим. Для того чтобы не быть голословным я приведу пример того сколько килобайт "весит" простое окно, написанное на разных языках. Итак, последнее место поделили две среды от одного производителя (Borland), Delphi 7 - 369kb, Builder от Delphi не далеко ушел; на третьем месте MS Visual C++ - около 30 kb, на втором месте чистый Си - 16 kb. На первом месте, естественно, ассемблер (в качестве подопытного был использован MASM32) - 2,5 kb, но для него это не минимум, при желании можно уменьшить размер до 1,5 kb!!! Делайте выводы сами.

   Ну что же, теперь, я надеюсь, вы уже готовы приступить, собственно, к изучению этого языка. Должен отметить еще одну особенность ассемблера. При изучении любых ЯВУ теория идет вперемежку с практикой, так проще и быстрее запоминается новый материал. С ассемблером ситуация немного другая, для начала необходимо запастись определенным багажом теоретических знаний, иначе дальнейшее повествование будет для вас лишено смысла и будет казаться полным бредом.



Глава №0

Системы счисления.

    Тема, которая будет обсуждаться на нашем первом занятии, одна из основополагающих при изучении ассемблера. Она достаточно сложна как для объяснения, так и для понимания, многие моменты придется просто зазубрить. Чуть позже все станет на свои места. Я долго говорил о высоких материях и теоретизировал, хватит. Пора напрячь ваши мозги, и дать вам полюбоваться на такие вот "ребусы":

1 + 1 = 10
5 + 5 = 10
8 + 8 = 10

   Я хотел сначала походить вокруг да около, мол, угадайте что это. Но решил, не тратить ваше и свое время. Первое что приходит в голову, это то, что я просто-напросто опечатался в первом и последнем случае. А нет, все верно. Просто, мы увидели примеры использования разных систем счисления (с.с.). Всего с.с. мы с вами будем изучать три. С одной из них вы хорошо знакомы - это десятичная с.с. Со второй вы знакомы, вероятно, меньше, но о её существовании знаете - двоичная с.с. Третья же - шестнадцатеричная с.с. Об этой с.с., как мне кажется, мало кто из вас слышал. Как известно, десятичная система счисления является наиболее удобной для человека. Почему? Если было бы по одному пальцу на каждой руке, тогда нашей "родной" с.с. была бы двоичная. Для компьютеров двоичная с.с. как раз и является "родной", но по другим причинам =). Все логические схемы, на которых построен компьютер, имеют только два состояния - включено и выключено. Ну что же, с этим все понятно, ну а зачем нам нужна еще и шестнадцатеричная с.с.? На это вопрос я отвечать сразу не стану. Вот такой я вредный ;-). Давайте немного посчитаем, попишем, в общем, поработаем ручками. Надо привыкать все делать своими руками =).

    Для начала мы ознакомимся с переводом чисел из десятичной системы счисления в двоичную и наоборот.

Запишем такую страшную формулу:

A(p) = an - 1 * pn - 1 + a n - 2 * p n - 2 + . . . + a1* p1 + a0 * p0

   В умной книжке написано, что это формула получения количественного эквивалента числа в некоторой с.с. Если же сказать по-простому, то с помощью этой формулы мы можем перевести число из любой с.с. в десятичную. Давайте устроим разбор этой формуле. A - собственно искомое десятичное число, р - основание с.с., (для двоичной системы счисления p = 2, для троичной - 3 и т.д.), а - цифра данной с.с., осталось добавить, что показатели степеней в которые мы возводим наши "основания" равны разряду цифры а. Если по простому, то разряд - это порядковый номер определенной цифры в числе, причем нумерация начинается с нуля. Например, в числе 12345 цифра 5 имеет нулевой разряд, 4 - первый, 3 - второй, и т.д.
Чтобы стали понятны мои рассуждения, разберем конкретный пример. Переведем число 11011101 из двоичной в десятичную с.с.

A(2) = 1 * 2 7+ 1* 26+ 0 * 2 5+ 1 * 2 4+ 1 * 23+ 1* 22+ 0 * 2 1+ 1* 2 0 = 221

Вряд ли, вам стало что - то понятно из написанного %). Я на это и не рассчитывал. Ради интереса вы можете потренироваться перевести число 102120 из троичной в десятичную с.с. Верность ответа можете проверить на обычном виндовозном калькуляторе

    Теперь давайте ознакомимся с алгоритмом перевода чисел их десятичной с.с. в двоичную. На этот раз никаких формул. Будем вспоминать арифметику ;-). Сперва, как и положено, изложим алгоритм, а потом примерчик.

1. Разделить десятичное число D на 2, запомнить частное q и остаток a .

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

3. Если в результате шага 1 частное равно нулю, алгоритм прекращается. Выписываются остатки в порядке, обратном их получению.

   Прежде чем вы начнете обзывать меня разными словами, по поводу того, что я написал полный бред, да и еще "ученым" языком, хочу тот же алгоритм изложить простым языком. "Чтобы перевести десятичное число в двоичное, необходимо делить его на 2, записывая 0 каждый раз, когда число делится на два, и 1, когда не делится". Вот теперь довольный собой =), что загрузил вас по полной программе %) я привожу пример перевода. Возьмем наше десятичное число 221, и попытаемся получить его "первозданный" вид.

Расчеты Остаток Разряд
221/2 = 110 1 0
110/2=55 0 1
55/2=27 1 2
27/2=13 1 3
13/2=6 1 4
6/2=3 0 5
3/2=1 1 6
1/2=0 1 7

   Вот теперь выписываем "остатки" 11011101. Сравним… Ура!!! Получилось!!! Воодушевленные тем, что на практике все проще, чем в теории, готов объяснить, зачем я описал один и тот же алгоритм два раза. Дело в том, что перевод из одной с.с. в другую осуществляется по одному алгоритму, который я изложил столь мудреным способом. Если возникнет такая потребность, я посвящу этому отдельный выпуск. А пока знайте, что ничего не делается просто так, все с умыслом ;-). Все было замечательно, если бы не одно но, не может запомнить человек длинную последовательность нулей и единиц. Небольшое десятичное число 221 в двоичном представлении являет собой последовательность из восьми цифр. А если взять большее число хотя бы такое 1101010110010110, попутать местами единицу с нулем легче легкого, хотя это всего лишь 54678 в десятичной с.с. А представьте если необходимо работать с еще большими числами…

    В общем, на такой радостной ноте =) я хотел бы с вами попрощаться до следующего выпуска. В следующий раз я вам расскажу про эту "загадочную" шестнадцатеричную и как она нам может помочь не запутаться с двоичными числами.



Обратная связь

Если вы хотите что-то спросить по ассемблеру, крэку, или просто поболтать прошу на форум нашей команды, там вы сможете получить ответы от меня, и моих товарищей Mafia32, formatC Вы можете отправить письмо на мой почтовый ящик , только в том случае если вопрос имеет отношение к рассылке. Обязательно заполняйте поле "Тема", письма без темы, я не буду читать. Для вашего удобства я разместил в рассылке e-mail форму, вы можете прямо из нее отправлять свое письмо, но для этого должна быть настроена ваша почтовая программа.

Имя:
Тема:
Сообщение:



Копирайты

Вся информация, содержащаяся в рассылках, является интеллектуальной собственностью своих законных авторов.
Перепечатка и распространение материалов рассылки только с разрешения автора.

Copyright © 2004 SeDoYHg

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное