asm32.info
Keep it simple — code in asm

Глава 1. Числа и бройни системи

В тази глава ще разгледаме въпроса за работата с различните бройни системи - как се представят числата в десетична, двоична и шестнайсетична бройна система, защо е важно да можем да работим с тези бройни системи и дали това е чак пък толкова трудно, колкото някои хора си мислят.

Ако тази материя ви е позната от други езици за програмиране, спокойно можете да прескочите тази глава и да преминете към следващата, където ще напишем първата си програма на асемблер.

Начина по който записваме едно число се нарича бройна система. Най-общо казано бройните системи се делят на две големи групи: позиционни и непозиционни. Пример за непозиционна бройна система са т.н. римски числа: IV e 4, XII e 12 и т.н. Всеки символ в такава бройна система има една и съща стойност, където и да се намира в числото. Например "X" е винаги равно на 10, "V" е винаги равно на 5 и т.н. Поради многото неудобства при запис и изчисленията в такива бройни системи, те не се използват при програмирането и няма да се занимаваме повече с тях.

При позиционните бройни системи (нормалната десетична система, която се изучава в училище е точно такава) записването на всяко число става с ограничен брой символи, наречени "цифри". Броя на цифрите се нарича основа на бройната система. При десетичната система, тези цифри са десет на брой: "0".."9", при двоичната са само 2: "0" и "1" и т.н.

Реалната стойност на една цифра зависи от мястото в числото, където тази цифра е записана. Например цифрата 2 в числото 5432 е равна на две, в числото: 1121 има стойност двадесет а в числото 2345 - две хиляди.

Стойността на така записаното число е равна на сума от стойностите на всяка от цифрите му (не забравяйте, че цифрите имат различна стойност в зависимост от това, къде в числото са написани).

Например: 9999 = 9000 + 900 + 90 + 9

Как да определим стойността на цифрата, ако знаем мястото и в числото? Просто. Мястото на цифрата се брои от дясно на ляво. Най-дясната цифра се нарича "най-младша" и има номер 0. Брои се от дясно на ляво - все пак този начин на записване е измислен от арабите. И така, за горният пример:

9999 = 9*10^3 + 9*10^2 + 9*10^1 + 9*10^0 ( 10^0 = 1 )

Стойността на всяка цифра е равна на цифрата по 10 на степен мястото на цифрата в числото. Тук 10 разбира се не е изсмукано от пръстите число, а е основата на бройната система.

Тази формула може да се обобщи за произволна бройна система и за произволна дължина на числото. Ако имаме числото abcdе записано в система с основа N ще имаме:

abcde = a*N^4 + b*N^3 + c*N^2 + d*N^1 + e*N^0

Най-малката основа на бройна система може да бъде числото 2.

1. Компютри и бройни системи:

По чисто технически причини, информацията в паметта на компютрите се записва именно в двоична система: тоест, "няма напрежение" - отговаря на цифрата 0 а "има напрежение" отговаря на цифрата 1.

Една двоична цифра се нарича "бит" (bit). Това всъщност е най-малкото количество информация, която може въобще да съществува (тъй като най-малката основа за бройна система е 2, а един бит е едноцифрено число, записано в двоична система).

Тъй като един бит позволява да се записват много малко стойности, най-малката клетка от паметта на компютрите съдържа по 8 бита и се нарича "байт" (byte). Във всеки байт могат да се записват числа от 00000000b до 11111111b - суфикса "b" означава че числото е двоично (binary).

Да видим на какво отговарят тези двоични числа в по-привичната десетична система, като използваме дадената по-горе формула за изчисляване на стойността на числата:

11111111b = 1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0 = 255

Тоест в един байт могат да се записват числа със стойност от 0 до 255.

Сега е момента да се научите да правите подобни преобразования на ум, или поне без калкулатор. Това е по-лесно отколкото си мислите. Погледнете следващата таблица:

позиция степен на 2
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128

Отляво е съответната позиция в байта, а отдясно е степента на двойката, която отговаря на тази позиция. С тази табличка (която скоро ще научите наизуст) пред себе си, можете бързо да преобразувате всяко двоично число в десетична система. Просто поглеждате числото и там където има 1-ца, сумирате съответната степен на двойката, където има 0 - нищо не сумирате.

Например:

10011011 = 1 + 2 + 8 + 16 + 128 = 155 ← Сумирате от дясно на ляво.

За упражнение се опитайте да пресметнете стойността на следните двоични числа:

Задача 1:

10101010b = ?

01010101b = ?

11001100b = ?

00110011b = ?

Отговорите ще намерите в края на главата.

Разбира се винаги можете да използвате калкулатора на Windows за да правите подобни преобразования, но известни упражнения ще ви дадат разбирането, което няма как по друг начин да получите.

Както видяхме, в един байт могат да се запишат числа от 0 до 255. В много случаи това не е достатъчно и затова се използват по няколко последователни байта за записване на едно число. Например 2 байта са т.н. "дума" (word) = 16bit. 4 байта = "двойна дума" (double word) или (dword) = 32bit.

Въпреки простотата си, двоичната система има един голям практически недостатък. Числата записани в двоична система имат твърде много цифри. Работата с такива многоцифрени числа просто не е удобно от човешка гледна точка.

Затова в практиката се е наложила шестнайсетичната бройна система. Тоест с основа 16. За записване на числа в шестнайсетична система ни трябват съответно 16 цифри. Тъй като арабските цифри са само 10 е прието за останалите цифри да се използват латинските букви от "а" до "f".

Тъй като и 2 и 16 са точни степени на 2, то всяка шестнайсетична цифра е точно равна на някое 4 цифрено двоично число (4 цифрените двоични числа са точно 16 - от 0000b до 1111b )

Ето и таблицата със стойностите на шестнайсетичните цифри и съответствието им с двоичните тетради (4 цифрени числа)

16 2 10
0 0000 0
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
a 1010 10
b 1011 11
c 1100 12
d 1101 13
e 1110 14
f 1111 15

Тази таблица е много важна. Най-добре си я разпечатайте или си я напишете на листче, ще я ползвате постоянно. (Е, много скоро няма да ви трябва тъй като ще я знаете наизуст.)

За обозначаване на шестнайсетичните числа в програмирането се използват няколко начина:

1. Суфикс "h" - 29ch

2. Префикс "$" - $29c

3. Префикс "0x" - 0x29c

В повечето случаи в тази книга ще използвам метода 2.

Как се преобразуват двоични числа в шестнайсетични и обратно? Елементарно.

1.1. От двоичен код в шестнайсетичен.

Да кажем че имаме някакво двоично число:

1010011100b

Разделяме го на групи от по 4 бита от дясно наляво. Ако броят на цифрите не е кратен на 4 - добавяме нули в най-лявата група.

Тоест: 1010011100b → 10 1001 1100b → 0010 1001 1100b

Заместваме всяка група със съответната шестнайсетична цифра от таблицата:

0010 1001 1100 → $29c

1.2. От шестнайсетичен код в двоичен.

Сигурно вече се досещате, че обратното преобразуване от шестнайсетична система в двоична е също проста операция. Просто заместваме всяка шестнайсетична цифра с двоичният и еквивалент от табличката горе:

$ab25 = 1010 1011 0010 0101b

1.3. Как да броим в различни бройни системи

"По еднакъв начин" е краткият отговор. За да стане ясно да си припомним как броим в десетична система.

Увеличаваме най-младшата цифра с 1.

Ако полученият резултат е равен на десет - цифрата "превърта" в нула, а ние провеждаме същата операция на следващата цифра.

Това по всъщност е начинът на броене във всяка бройна система. Просто превъртането става не на 10 а на съответната основа на бройната система. При двоичната система на 2, при шестнайсетичната на 16 и т.н.

Броене в двоична система:

000

001

010 → тук цифрата превърта и увеличаваме следващата

011

100 → тук също, но следващата също превърта и увеличаваме третата.

101

110 → пак превърта

111

000 → тук превъртат и трите цифри и трябва да въведем четвърта, но надявам се този пример е достатъчен.

Броене в шестнайсетична система:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10 (превъртане), 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f, 20 (отново), 21 ... ... fa, fb, fc, fd, fe, ff, 100 (отново - тук числото става трицифрено)

1.4. Преобразуване от десетична в двоична и шестнайсетична система

За съжаление, 10 не е степен на двойката и затова преобразуването от десетична в двоична или шестнайсетична система не е толкова проста операция.

Най-общо алгоритъмът е следният: "Делим числото на основата на бройната система и записваме остатъците в обратен ред."

Знам че не е ясно но с един пример ще стане:

Да преобразуваме числото 123 в двоична система:

123:2=61:2=30:2=15:2=7:2=3:2=1:2=0 --- -- -- -- - - - 1 1 0 1 1 1 1 ← остатъци ← Записваме ги в обратен ред.

Сега записваме остатъците в обратен ред: 1111011b Да проверим: 1+2+8+16+32+64 = 123

Всъщност, тъй като деленето на 2 е лесно дори на ум, с малко упражнения и ако числата не са твърде големи, горната операция не е чак толкова трудна.

А като имаме двоичното представяне, лесно можем да го превърнем в шестнайсетично:

123 = 0111 1011b = $7b

Упражнение:

Задача 2: Преобразувайте дадените числа от десетична в двоична и шестнайсетична система. Направете обратно преобразуване в десетична за да проверите резултата:

423, 321, 111, 255, 128, 192, 65535, 65536

Отговори на задача1: 170, 85, 204, 51

Отговори на задача2:

423 = 110100111b = $1а7

321 = 101000001b = $141

111 = 1101111b = $6f

255 = 11111111b = $ff

128 = 10000000b = $80

192 = 11000000b = $c0

65535 = 1111111111111111b = $ffff

65536 = 10000000000000000b = $10000

Last modified on: 11.11.2017 19:09:25

Preview

Comments

Title: Filename: