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

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


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


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

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


Выпуск №2

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


Обращение к подписчикам

1) Тема, которая рассматривается в первых двух выпусках, очень сложная, поэтому если будут возникать вопросы, не стесняйтесь, задавайте их мне. По мере своих возможностей и наличия свободного времени, я на них буду отвечать. Если будет много одинаковых вопросов я сделаю специальный выпуск, чтобы еще раз все объяснить более подробно.

2) Глядя на количество подписчиков, более 100 человек за одну неделю, можно с уверенностью сказать, что это тема действительно интересна и востребована. Буду стараться оправдать Ваше доверие.



Глава №0

Системы счисления. Окончание

   Сегодня мы рассмотрим шестнадцатеричную с.с. и все что с ней связано. Во первых, почему она называется шестнадцатеричной? Название с.с. дается по количеству символов, которые образуют эту с.с. Двоичная с.с. образована двумя цифрами-символами - 1 и 0, десятичная - десятью цифрами - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, шестнадцатеричная, соответственно, - шестнадцатью цифрами - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Первые десять цифр нам хорошо знакомы, они образуют десятичную с.с., другие шесть нам тоже знакомы, только вы не знали что это цифры ;-). Для того чтобы все стало более понятным привожу таблицу соответствия этих трех систем счисления.

Десятичное число Двоичное число Шестнадцатеричное число
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 A, a
11 1011 B, b
12 1100 C, c
13 1101 D, d
14 1110 E, e
15 1111 F, f

Знаю, понять эту таблицу сложно, это как раз пример того, что нужно будет зазубрить. Главная сложность возникает с двоичной с.с. Для того чтобы, стало ясно, как формируются двоичные числа, необходимо ознакомится с двоичной арифметикой, она очень простая =).
    0 + 0 = 0 (это понятно)
    1 + 0 = 1 (аналогично)
    1 + 1 = 10 (а вот это надо запомнить)
Остальные арифметические действия в приложении

   Давайте сложим два двоичных числа 0011 и 0110, посмотрев в вышеприведенную таблицу узнаем, что это 3 и 6 в десятичной с.с. Следовательно, мы должны получить 9 в десятичной или 1001 в двоичной с.с.
   0011
+
   0110
   1001

Сейчас я попробую представить себя учителем младших классов =) , и объясню так как нам объясняли "обычную" арифметику. Единица плюс нуль, получаем единицу; единица плюс единица - нуль пишем, единица пошла на ум; единица + единица "в уме" получаем 10. Надеюсь объяснил понятно ;-).   Потренируйтесь с двоичным сложением, поймете лучше.
   Теперь разбираемся с шестнадцатеричной с.с. Первый вопрос который возникает - что следует за цифрой "F", за этой цифрой идет шестнадцатеричное число 10. Посмотрите пример из первого выпуска, 8 + 8 = 10. В этом месте необходимо сделать остановку и сказать важную вещь. Как же нам отличить шестнадцатеричное число от десятичного или даже от двоичного, ведь "рисунок" чисел очень похож. Программисты тоже долго думали и придумали ставить после каждого числа "опознавательный знак" - постфикс. Если число двоичное то пишут в конце числа символ "b", если число десятичное - "d", если шестнадцатеричное - "h". Эти символы первые буквы английских слов binary (двоичная, далее bin), decimal (десятичная, далее dec), hexadecimal (шестнадцатеричная, далее hex). А чтобы отличать шестнадцатеричные символы от простых меток или имен переменных в программе, перед каждым таким числом ставят нуль, он называется ведущий. Пример - 0DADAh, или так - 0babah. Вот такие чудеса =). Теперь когда вы увидите число 10, или даже 1110110, вы будете сомневаться, сколько же это на самом деле, ведь в каждой системе счисления это число будет иметь разный количественный эквивалент, о том как его просчитать я написал в первом выпуске.

   Переходим к следующей части повествования. Следующей нашей задачей будет перевод чисел из шестнадцатеричной с.с. в другие. Перевод числа из hex в dec осуществляется аналогично переводу числа из bin в dec. Мы используем "страшную" формулу из первого выпуска. Для примера, переведем число 0ad5dh в десятичную с.с.

a * 163 + d * 162 + 5 * 161 + d * 160

Подставляем, для нашего удобства, вместо hex цифр их десятичный эквивалент.

10 * 163 + 13 * 162 + 5 * 161 + 13 * 160 =

= 10 * 4096 + 13 * 256 + 5 * 16 + 13 * 1 = 44381d

   Теперь попробуем получить из числа 44381d его hex эквивалент. Алгоритм, который мы будем применять, был рассмотрен в первом выпуске. Помните, я говорил, что он используется для перевода чисел из одной (любой) в другую (любую) систему счисления. Главное определить, что на что необходимо делить. Мы будем делить десятичное число на 16, а остальное аналогично переводу в двоичную систему. Кратко хочу напомнить этот алгоритм - делим десятичное число на 16, запоминаем частное и остаток, если частное не равно нулю, то принимаем его за новое делимое, остаток записываем и продолжаем эту операцию до тех пор пока частное не станет равно нулю. Затем выписываем остатки в порядке обратном их получению. Опять табличка =).

Расчеты Остаток Разряд
44381/16 = 2773 D (13) 0
2773/16 = 173 5 1
173/16 = 10 D (13) 2
10/16 = 0 A (10d) 3

   Выписываем остатки - ad5d, приводим к "правильному" виду 0ad5dh. Кажется, у нас опять получилось ;-). Чем больше вы самостоятельно будет переводить числа из одной с.с. в другую, тем проще вам будет потом.

   Вот теперь самое интересное =). Перевод из hex в bin, туда и обратно =). Вы наверно подумали: "опять придется что-то на что-то делить, что-то куда-то выписывать %), нет тут все намного проще. Вот я дурень =), необъяснил за чем нам вообще-то нужна эта шестнадцатеричная с.с. Надо исправится. В очередной раз заглядываем в "умную книгу", и читаем: "Шестнадцатеричная система счисления - это удобное представление двоичной системы счисления". Во как =). Естественно возникает вопрос в чем же удобство это с.с. Помните я говорил, что очень легко забыть (перепутать местами) единицу и ноль в больших двоичных числах, так вот для этого и придумали шестнадцатеричную с.с. Возникает встречный вопрос, а в чем её удобство? Согласитесь, проще работать с числами в таком виде - abcd012h, чем в таком - 1010101111001101000000010010b, кстати, это два одинаковых числа записанных в разных с.с., догадайтесь в каких =). Ну да проще, а перевод? Самое интересное, что нам не надо проводить никаких расчетов, достаточно просто на место каждой шестнадцатеричной цифры поставить её двоичный эквивалент, который вы можете взять из таблицы соответствия (см. выше). Кстати вы заметили, что двоичные числа в таблице записаны группами по четыре цифры, такие группы называются тетрады, вот такую тетраду мы и будем подставлять на место шестнадцатеричной цифры. Опять берем число ad5dh и делаем так как сказано выше. Подставляем вместо A - 1010, вместо D - 1101, 5 - 0101, в итоге получим - 1010 1101 0101 1101. По-моему все очень просто, главное немного потренироваться. Теперь обратный перевод. Что интересно, он такой же простой как и "прямой", но делать надо все наоборот =). Поясняю, берем какое-нибудь большое двоичное число, например 1110110011011101110101, разбиваем его на тетрады группы по четыре цифры), 0011 1011 0011 0111 0111 0101, я еще дописал два нуля перед нашим числом, от этого значение не изменилось, но работать стало проще ;-), нам все таки нужна тетрада. Теперь главный фокус, на место каждой тетрады подставляем hex - эквивалент. Получим - 3B3775. Для наглядности запишем все это в виде таблицы

              1110110011011101110101
  0011     1011     0011     0111     0111     0101  
    3     B     3     7     7     5

Вот вам первое домашнее задание =), переведите это число в dec. Ну, что убедил я вас в удобстве шестнадцатеричной с.с.?

И в завершении сегодняшнего выпуска, привожу небольшой справочный материал. Таблицы с степенями двойки и числа шестнадцать.

Степени двойки

 степень  0 1 2 3 4 5 6 7 8 9  10  11  12
 число  1 2 4 8 16 32 64 128 256 512 1024 2048 4096

Степени "16"

степень 0 1 2 3    4     5      6
число 1 16 256 4096 65536 1048576 16777216



Приложение

вычитание
0 - 0 = 0
1 - 0 = 0
1 - 1 = 0
10 - 1 = 1
умножение
0 * 0 = 0
1 * 0 = 0
1 * 1 = 1

    Умножение двух многоразрядных чисел в двоичной с.с. выполняется по правилам десятичной системы. Перемножим числа 1011b и 101b.
     1011
х
       101
     1011
+  0000
1011
110111



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

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

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



Копирайты

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

Copyright © 2004 SeDoYHg

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


В избранное