Тема 1

DEBUG.EXE

DEBUG.EXE

Това е първото нещо в курса. "Дебъг" означава "премахване на бъгове". Тази програма се използва за диагностика и тестване на вече съществуващи програми. Нейното предназначение не е да създава нови програми. (Почти) никой не е достатъчно луд, за да пише на асемблер.
Какво представлява DEBUG.EXE? Това е програма, която позволява директен достъп до регистрите на компютъра. С нея може да се види точно какво и къде е записано в RAM паметта, както и да се променят неща. Могат също така и да се създават кратки програми, използващи директно езика на който говори компютърът - машинен код, асемблер. В последните версии на Windows DEBUG не работи с истинските регистри в паметта, а само с тяхно копие. Това означава, че каквото и да правите, не може да счупите компютъра си непоправимо с тази програма. Което като цяло е хубаво нещо.
Програмата изпълнява предназначението си в курса, но е добре да се знае, че е остаряла, бедна откъм възможности и работи единствено под Windows.
Всеки ентусиаст, желаещ да научи Асемблер, би направил добре да си намери по-качествено приложение за целта. Две предложения са програмата Debug на FreeDOS - безплатна, мощна, работи под Windows, както и GDM - може би най-популярната такава програма на света.

Но нека да започнем от самото начало.

Шестнайсетична бройна система.

В целия курс ще се използва почти ексклузивно бройната система с основа 16(Hexadecimal, Hex). Числата се формират по същия начин, както в десетичната, важат същите правила, единствената разлика е, че има 16 цифри:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Тъй като имаме само 10 конвенционални знака за цифри, за останалите използваме букви.
А e 10, B е 11 … F е 15. Ето няколко примера:
0009 = 9
0010 = 16
00F0 = 240 ( = 15 * 16)
00FF = 255
0C7A = 3194 (= 12*256 + 7*16 + 10)
D4ZX = не е истинско шестанедестично число. Но ако беше, щеше да е сравнително голямо :)

Означение

Най-често, шестнадесетичните числа се отбелязват като пред тях се сложи 0x (нула-хикс). 0xFF = 255. Друг запис е след числото да се сложи H.

Защо използваме Hex?

Тъй като осем бита се обединяват в един байт, а както всички знаем в 16, 32 и 64-битовите архитектури самите тези байтове се разглеждат като…

Просто защото на хората им е по-удобно да четат 16-тични числа, отколкото двоични. В паметта на компютъра информацията е, общо казано, организирана като дълга поредица от единици и нули. Всичко се записва в двоична бройна система. Но е по-лесно да се прочете една цифра от 0 до 15, отколкото като четири цифри от 0 до 1.
Кое е това число: 11000110? А това: 0xC6? И двете са равни на 198. А когато числата станат по-големи?
1001101011110011 = 0x9AF3

Асемблер

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

Почти всички други езици се "компилират" до асемблер/машинен код - това означава, че всяка C++ програма първо се превръща в поредица асемблерски инструкции и чак след това се изпълнява. Някои езици се интерпретират до език, който след това се компилира до асемблер, или вървят на виртуална машина, която всъщност комуникира с компютъра. Но, в крайна сметка, всичко стига до едно и също място.

Недостатъци

Да се пише на този език е трудно! Изисква се голяма концентрация и няма никакво място за грешки. Компютърът не проверява за неправилно въведени данни, не предупреждава, когато програмата пипа там, където не би трябвало да пипа и не гледа дали подавате цяло число на променлива от тип цяло число. Всъщност, в асемблер дори няма цели числа. Или каквито и да било други типове променливи - нещата стават на по-ниско ниво от това. Всичко са нули и единици, включително самият код на програмата.

Предимства

Асемблер е Бърз. В екстремни случаи може да се окаже хиляди пъти по-бърз от еквивалентна програма, написана на C++ или Python, например. Освен това, когато се работи директно с машинен код и се пипа директно в регистрите на паметта, може да се правят наистина драстични манипулации. Още 9999 живота? Няма проблем, само сменяме правилната стойност в паметта. Под секрет - искате програмата да не проверява за валидна регистрация? Да смени кода си по време на изпълнение от нещо безобидно до нещо, което трие хард-дискове? Да се събере цяла, красива, триизмерна игра в 96 килобайта? Това е начинът.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License