Assembler – шоколад за програмиста

assembler.jpgАко не знаете какво е Assembler, няма да разберете защо ми е толкова яко. Assembler е бил основният език за програмиране преди 30-40-тина години. После се появяват езици от по-високо ниво като Fortran, Pascal, Ada и т.н. Все още обаче при писането на драйвери се използва асемблер.

Каква е връзката обаче тук? Нашите умни професори са решили, че е от особена важност да научим асемблер и то в късните семестри – след като сме се занимавали бая с Java. По принцип няма лошо – това е част от историята и наистина развива алгоритмичното мислене. Проблемът е, че професорът тази година такива неща дава, че не е истина. Едно, че имаме изпит, трябва да се предават домашни всяка седмица с по две задачи и куп подточки. Освен това всеки две седмици имаме да предаваме проект. И всичко това е на асемблер и не ни влиза в оценката. Ако не го направим обаче, няма да ни допуснат до изпита.

За да ви дам представа какви са проектите, ето кратко описание на последният. Имаме в един файл списък с имена и номера. Форматирани са по определен начин. Трябва да прочетем имената едно по едно и да изградим бинарно дърво за търсене, т.е. всеки корен е по-голям от левият елемент и по-малък от десният. След като построим дървото, трябва да изпишем елементите в определен формат на екрана, като използваме дървото за да са сортирани. Другите изисквания са, че трябва да използваме максимум 512Кб памет и не трябва динамично да резервираме сегменти в паметта.

На пръв поглед изглежда лесно. На C и Java това може да се направи за максимум 15 мин. Тук обаче става дума за асемблер, където си говориш направо с процесора. Затова е обяснимо защо вчера ми трябваха 6 часа висене пред лаптопа да го направя. Пак си е малко. Добре, че вече съм работил с асемблер и имам добър усет към алгоритмите. Кодът стана 400 реда, а паметта, която използвахме – около 250 Кб. Можеше и по-малко, защото примерните списъци за тестване бяха само 14 Кб, но реших да действам на сигурно и направих са поддържа списъци до 100 Кб. или 3300 имена.

Ето кодът на програмата, примерен тест и заданието(на немски). Може да ги тествате с MIPS компилатора Mars:

icon_asm.giftxt.gificon_pdf.gif

Поради това, че не можехме да резервираме памет динамично, се наложи да направя голям буфер. В него един след друг слагах редовете с имената и номера във следният формат: 4 байта за адрес на ляв под-възел (child node), 4 байта за адрес на десен под-възел, фамилно име, „шапация“, първо име, „:“, номер. Когато съответният възел няма ляв под-възел, адресът е равен на нула. Първият ред от данните се взима за главен корен. После всеки следващ елемент се сравнява с него. Ако е по-малък – отива се на адреса на левият под-възел (или съответно десният) и се сравнява с него по същият начин. Така докато не се намери, че някой възел няма под-възел и съответният ред се добавя като такъв на правилното място. Така се изгражда бинарно дърво за търсене. За жалост не е балансирано и предполагам, че би могло лесно да се направи с този формат на данните. Тъй като в задачата пишеше да не го балансираме, реших да не си тровя живота допълнително.

Фактът, че прекарах 6 часа в писане на 10Кб код не ме отчая. Напротив – точно обратното. Накрая като завърших кодът намерих само един малък бъг, в последните 5 реда код, които написах. Като го оправих, всичко тръгна отведнъж. Мед ми капеше на сърцето. Вярно, че тествах двете малки функции – strcmp и онази за обръщане на string в число, но другите две – за въвеждането на възли в дървото и изписването на дървото на екрана, както и четенето от файла, не ги бях тествал. Този вид програмиране е толкова далече от това, което правя по принцип, че факта че стана ме зарадва страшно. Сега остава и проверяващият да е доволен и всичко ще е наред.

[tags]асемблер, assembler, mips, mars, информатика, университета, задача, програмиране, езици[/tags]

13 коментара

  1. Toва са основни неща на асемблер. Не знам с какво точно се занимаваш професионално, но има области в програмирането, в които това ще ти е невероятно полезно – даже се чудя защо не се учи в по-първите курсове.

  2. Pingback: Vasil Kolev
  3. Pingback: krokodilerian
  4. Pingback: Vasil Kolev
  5. Pingback: Vasil Kolev
  6. Настрана от факта, че трябва да се учи по-рано, не знам защо толкова ни мъчат на него. Ако не се бях се занимавал преди с него нямаше да мога да го направя. Това е толкова архаично, че няма накъде. Вярно е, че в ако се занимава някой с драйвери, хардуер, чипове, VHDL и тем подобни ще е полезно. Аз обаче точно тази сфера от програмирането не я понасям. Може би защото ми се налагаше в началото да работя за един асистент по темата. Писах софтуер за тестване на VHDL дизайн качен на FPGA. Опитваха се да направят чип, който да умножава бързо много големи числа – от порядъка на 2 К.битови – за целите на криптографията и май успяха.

  7. Аз съм писал подобни задачи на упражнения в първи курс, но тогава C++ беше върхът на програмирането…
    Assembler учи на дисциплина и показва как работи процесора, само не знам сега дали може да се паралелизира кода – отдавна се занимавам с други неща.

  8. При нас препоръчват да си напишем програмата на С и после да я „преведем“ на асемблер. Наистина учи на дисциплина в програмирането. Особено при структурирането на кода и коментарите.

  9. Не съм програмист. Някой ще ми каже ли как се работи с XML?
    Налага ми се да го ползвам за онлайн продажби в Интернет, но не мога да схвана как точно се ползва.
    Хванах се да работя дистрибутор на електронни магазини и те ми дават всеки месец нов XML-файл със стоките, но то си изглежда като програма. Не е готов HTML-файл за излъчване. По-скоро прилича на структурата на DBASE 4. с която се мъчех едно време.
    Доста четох по Интернет как се работи с XML, но това което прочетох е доста сложно. Трябва да се прави програма за обработка на всяка една структура от данни.
    Няма ли някакъв по прост метод за ползване на тези файлове, например като FrontPage Builder за HTML-файловете? Така че веднага и директно данните от XML да се интегрират на нужното място в HTML? В XML от всяка фирма структурата на данните е различна, но общото е че навсякъде има име на продукта, цена, снимка или снимки и описание. Опитвах се да вкарам XML в HTML, но всичко стана нагъчкано, неподредено и не всички снимки се виждаха…
    Благодаря предварително за отговора!
    С уважение – Иво – f15@mail15.com

  10. XML е структурен език за съхранение на данни. Точно като база данни, но по-добро. Можеш да я обърнеш в html, но трябва да напишеш един специфичен за случая XSL – това е XML базиран език, с който се избират данни и се представят като интернет страница. Щом не разбираш обаче от XML, тепърва трябва да го учиш и ти трябва за работа, препоръчвам ти да платиш на някой web програмист да ти го направи. Не е лека работа и надали някой ще се захване ей така.

  11. Благодаря ти Бояне!
    И аз така и предполагах.
    Има много хубави примерни алгоритми за обработка на XML, но си е голяма въртележка.
    В бизнеса най-важна е рекламата, а това отнема много време. Особено с тия антиспам защити дето ги въведоха. Нямам време да пиша и програми. Не, XML не е труден като С или Асемблер, но изисква време! Не мога да плащам и на програмист!…
    Ама защо навсякъде дават на дистрибуторите тия XML-файлове? Било нов, модерен и по-лесен метод?!? Какво е по-лесно? И за кого?
    Преди няколко месеца свалих рекламния HTML-код директно от сайтовете на търговците и го приспособих за моите реклами. Отне ми цял ден…
    Но ако наистина се стигне до програмиране, то по-добре да работя като програмист, а не като търговец…

  12. Това ако е Асемблер аз съм морско свинче. 🙂 Това си е някаква имитация на Асемблер която е за MIPS архитектура и MIPS платформи.

Вашият коментар

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

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.