Воробьёвы

(-:

№13. Глубже! Еще глубже! Второе погружение в регистры

КОЛОНКА РЕДАКТОРА (ГРУЖУ!)

Приветствую вас, дZенствующие братья и сестры! Вы обратили внимание, какие проблемы у нас были с 13-м выпуском? Мы все делали как обычно (и даже не пили перед этим пиво), но по неизвестной причине ни черта у нас не получалось :(. Только с третьего раза рассылка ушла более-менее нормально... По здравому размышлению, своей виной мы это признать не смогли, а посему, приносить свои извинения считаем излишним...

Сегодня у нас особенный номер :). Дело в том, что мы учли большинство ваших пожеланий по оформлению рассылки. Теперь вам не надо тягать мышкой горизонтальную полосу прокрутки. Единственное, что мы не будем менять принципиально - это цветовую схему :). Иначе нам придется сменить название, стиль изложения, да и "руководителя проекта" - тоже... Не знаю, как остальное, но смену названия мы не можем себе позволить :).

А еще мы чертовски рады появлению новых людей! Сколотилась мощная оффшорная команда, которая делает зеркало, проводит коррекцию нашей глючной грамматики, регестрит ресурс в поисковых системах и каталогах, отвечает на ваши глупые вопросы... Думаю, вы заметили, что на месте мерзкого зеленого логотипа в верхнем левом углу теперь менее мерзкий? А кнопку нашу "прозрачную" видели? И это тоже - работа оффшорной команда!! Работа людей, которых мы и в глаза-то не видели! Не правда ли, замечательно?

Есть такая хорошая стратегическая игра - Heroes Of Might And Magic. И там есть такое свойство команды, как боевой дух (ну или мораль). Герой с высоким боевым духом в самый неожиданный момент получает возможность сделать два хода вместо одного. Над ним появляется золотая птица, которая "взмахом крыл своих" благословляет боевую единицу на "ратный бой". В некоторых случаях именно это и определяет победу над противником...

Мы чувствуем за своей спиной крылья! Нас с каждым днем все больше и больше! С каждым запуском дебага мы становимся сильнее! Каждое подвисание компьютера только закаляет нас! Каждое падение FAT'а делает нас мудрее! Помните, что самосовершенствование не знает границ...

Следуйте за белым кроликом! Освобождайте свой разум! Поимейте Матрицу!

ВДОГОНКУ К ПРОШЛОМУ НОМЕРУ

1. Было вот как (п.1) "...Итак, запускаем DZEBUG и вводим следующую команду: -e cs:115". На самом деле нужно: "-e ds:115". (Fixed by DZ Sashok).

2. "В прошлой рассылке автор статьи позволил себе несколько вольно интерпретировать сообщение об ошибке на "mov [115],55" как невозможность использовать константы в присваивании ячейке памяти. Более того, это можно даже понять как вообще отсутствие такой возможности в ассемблере.

Не всё так плохо:

  -a
  mov [115],word 55
  mov [115],byte 55
  mov word[115],55
  -u 100,110

Дело в том, что для инструкций с двумя операндами, один операнд произвольный (регистр, адрес, косвенный адрес, косвенный адрес+индекс или косвенный адрес+индекс+адрес), а второй может быть регистром _или константой_ - хотя, разумеется, отсутствуют варианты инструкций, где константа используется на месте операнда-приёмника результата.

По этому поводу я настоятельно рекомендую со временем проштудировать справочники по ассемблеру с описанием соответствия ассемблера машинному языку (кодирование инструкций и их длительность на разных процессорах) - знание "кухни" происходящего всегда полезно, поскольку избавляет от множества недоумений и позволяет более оптимально использовать имеющиеся ресурсы. И Вас не будут всё время посылать: "RTFM!".

В данном же случае, мы столкнулись с типизацией, - любой язык высокого уровня (то есть более близкий к мышлению человека, чем машинный код) должен позволять типизировать данные. Помимо того, что типизация защищает от ошибок и упрощает исходный код, иногда без нее нельзя обойтись (иначе, откуда debug узнает, что мы хотим присвоить - слово или байт?). Уж не знаю, как это соотносится с идеей МАТРИЦы, но это и удобно, и полезно.

И, кстати, отсутствие типизации - одна из бед, в остальном достойного, ассемблера NASM, бесплатного и доступного в исходных кодах.

(Fixed by DZ Arkady V.Belousov, http://www.vein.hu/~nagyd/)

Serrgio: Посетил я давеча сайт ентого Аркадия В. Белоусова, и он мне понравился! Нашел я там хорошую прогу CuteMouse, весьма интересную, с точки зрения "расколупать как она работает". Чего и вам настоятельно желаю, советую, рекомендую (ненужное зачеркнуть). Да и сайтик-то, надо сказать, не без DZ ;). Да пребудет с тобой сила, Аркадий!!

ВТОРОЕ ПОГРУЖЕНИЕ В РЕГИСТРЫ

[1] Пришло время, братья, с регистрами поближе познакомиться! Я тут вчера подумал: а ведь последовательность, в которой мы материал излагаем, она почти такая же глючная, как и жизнь наша окаянная! Это ж как часто вот что случается: познакомишься с кем-нибудь, тесно пообщаешься несколько ночей напролет... и только потом, в одно прекрасное утро, спрашиваешь: "расскажи что-нибудь о себе!"

С регистрами мы тоже аналогичным образом :). Помучили их, поимели, как могли... ну и они нас тоже... того... поимели... А теперь пора знакомиться!!

Регистры - вещь нервная и сложная! На них практически вся работа компьютера повязана! И число их - 32d :). В смысле это штук их столько. 16 пользовательских и 16 системных. Причем 16 системных состоят из 4-х регистров "управления", 4-х регистров "системных адресов" и 8-ми регистров "отладки". Работать с ними вы, естественно, еще не готовы (это страшный протектед-моде!), поэтому, оставим их в покое до третьего "погружения".

! Все нижесказаное относится к процессорам 386 и выше - хотя начиная с Pentium MMX следует также говорить о регистрах MMX и/или SSE. А ведь ещё есть 3DNow!

Сегодня мы досконально разберемся только с 16-ю пользовательскими регистрами, как то: регистры "общего назначения" (8 шт.), регистры "сегментные" (6 шт.), регистр "указателя команд" и до чертиков навороченный регистр "флагов".

! Сию классификацию придумали В. Юров и С. Хорошенко :). (Книжка "ASSEMBLER, учебный курс" с дискеткой). Если она вас чем-то не устраивает - придумайте свою собственную классификацию и защитите на этом кандидатскую!!

Итак, закупайтесь чаем и бубликами (пьянству - бой) и поехали дальше...

[2] Если вы помните, в 4-м номере в п. 2. мы привели одну нездоровую схемку, иллюстрирующую то, что "целый" регистр (например, AX) состоит из старшей (AH) и младшей (AL) "половинок". Для процессора i8086 это действительно было так :). Но начиная с i80386 "схемка" немножко дополнилась :). Дело в том, что 16-битных регистров народу было мало :). Фантазия народа не умещалась в жалкие 16 разрядов :). Народ думал-думал... с одной стороны 16 - это чертовски мало, но с другой стороны - уже огромная куча прог написана именно под эти проклятые 16 разрядов...

Консенсус был найден! "Емкость" регистра была увеличена до 32-х, но его не стали делить на старшую и младшую половинки... впрочем, сначала лучше привести новую нездоровую "схему", а потом уже растолковывать, что к чему...

EAX

^^32 бита
16 бит >> 
AX

  
8 + 8 бит >> 
AH   |  AL

Означает это вот что: "главное имя" регистра по-прежнему AX и он по-прежнему состоит из двух 8-битных половинок (AH, AL), т.е. обращение ко всяческим BIOS'овским функциям остается без изменений. А вот, дабы убыстрить всякого рода математические вычисления, и отказаться от неудобной сегментной адресации памяти, как раз и обусловленной 16-битной "емкостью" регистров, для последних придумали еще и "расширение".

Только вот тут над одним нюансом надобно вам основательно помедитировать: мы не можем обратиться К РАСШИРЕНИЮ РЕГИСТРА (как обращались к старшей половине регистра AX), но можем обратиться К РАСШИРЕННОМУ регистру, и имя ему в этом случае будет EAX.

Необходимо четко представлять следующее:

1. Мы легко можем обращаться к старшей и младшей части AX (это вы уже знаете).

2. Мы не можем обращаться к "старшей" части EAX - такого "подрегистра" нет, несмотря на то, что AX, вроде бы и является его "младшей частью" (так его обзывать неправильно). Поэтому мы рассматриваем EAX всего лишь как "расширенный AX", а не как "главный, который делится на AX(AH+AL)".

"Главный" - AX. На машинах i486 и выше вы можете обращаться к расширенному регистру - EAX. А можете и не обращаться. Это ваше личное дело...

И да не перепутаете вы божий дар с яичницей!

Медитируйте...

[3] Итак, "делимость" EAX/AX(AH+AL) мы уже рассмотрели :). BX, CX, DX имеют аналогичные "свойства"...

Поехали дальше! Вот вам расширенное "досье" на первые 4 из 8-ми пользовательских регистров:

EAX/AX(AH+AL) - "Аккумулятор" (Accumulator register). Специализация - хранение промежуточных данных. Некоторые команды работают только с этим регистром.

Например, команда DIV (беззнаковое деление) требует, чтобы делимое располагалось именно в AX (делитель задается явно - см. описание команды). Именно это и имелось в виду под "работают только с данным регистром".

Результат этой операции также возвращается в AX - в AL частное, а в AH остаток. Чем вам не аккумулятор?

EBX/BX(BH+BL) - "База" (Base register). Специализация - хранение базового адреса какого либо "объекта".

Помните, в прошлом номере мы к обращались к данным, адрес которых в BX заносился? Мы его еще в скобочки квадратные брали... Так вот, для этой цели, из пользовательских, годится BX и только BX! Специализация? А то!

ECX/CX(CH+CL) - "Счетчик" (Count register). Специализация - "подсчет раз" :).

Помните, при организации цикла в 8-м выпуске мы использовали именно CX для указания числа повторений... и никакой другой для этих целей нам не подходит... Специализация, однако!

EDX/DX(DH+DL) - "Данные" (Data register). Специализация - хранение результатов выполнения подпрограмм.

Именно через этот регистр предпочтительно передавать значения внутрь процедуры. Традиция такая имеет место из-за того, что передача (аки и возвращение) данных в многочисленные функции (прерывания) DOS'а происходит именно через этот регистр...

Мнение: Во-первых, D в названии скорее всего случайность (A, B, C, D). Так же, как и A, и C, и B. Удачная, но случайность. Во-вторых, когда проектировался микропроцессор 8086 (и его предшественники), DOS (и, тем более, MS-DOS) ещё не существовало в природе.

Кроме этого, в большинстве случаев DX "специализируется" еще и на хранении промежуточных (как и AX) данных. Например, при выполнии команды DIV с 32-битными делимым/делителем, первое должно находиться в DX:AX, а результат помещается в AX и DX (частное и остаток соответственно). Специализация? Молчать, я вас спрашиваю!

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

[4] Есть у нас еще два регистра "общего назначения". Мы их не трогали, и не скоро еще тронем. Это регистры, управляющие "цепочечными" (ну или строчными) операциями. Вот они:

ESI/SI - "Адрес источника" (Source Index register). Содержит адрес текущего элемента в "цепочке-источнике".

EDI/DI - "Адрес приемника" (Destination Index register). Содержит адрес текущего элемента в "цепочке-приемнике".

Со "специализацией" этих регистрав мы с вами еще поработаем :). Обещаю :).

Обратите внимания: эти регистры - тоже "специалисты широкого профиля". И вы можете использовать их "по общему назначению" точно так, как и AX, BX, CX, DX... Единственное, что тут нужно отметить - это их неделимость на старшую и младшую части...

[5] Отдельно стоит выделить два регистра, "обслуживающие" стек. Руками вы эту дрянь уже пощупали, а самые продвинутые (было домашнее задание) даже знают один из многочисленных случаев, когда его нужно использовать :).

Так вот, за работу со стеком отвечают следующие регистры:

ESP/SP - "Адрес вершины стека" (Stack Pointer register) - Содержит смещение, по которому в стек был занесен последний элемент, то бишь адрес вершины стека в текущем сегменте стека. При добавлении в стек нового элемента значение SP уменьшается. То есть растет энтот регистр подобно сталагмиту: башкой вверх, в сторону уменьшения адресов...

Команды PUSH/POP помните? Если да, то посмотреть, как меняется содержимое SP, при работе со стеком для вас не составит никакого труда...

EBP/BP - "Адрес базы стека" (Base Pointer register) - Это регистр хитрый! К данным внутри стека вы можете "сообразить" произвольный доступ именно с его помощью. Тема это нервная, поэтому расколупаем мы ее не сегодня. Сегодня все же про регистры, а не про стек.

Помедитируйте, штоль, пол часика?

[6] Что такое сегмент кода/данных/стека мы с вами уже рассматривали. И сделали вывод, что при "сегментно-оффсетной" 16-ти разрядной адресации памяти координировать работу этих трех частей чертовски сложно. Но, тем не менее, как-то нужно...

Делает это процессор при помощи так называемых "сегментных регистров":

CS - "Регистр кода" (Code Segment register) - Содержит адрес сегмента кода, фактически (ну... почти) это адрес его начала.

DS - "Регистр данных" (Data Segment register) - Содержит адрес сегмента данных текущей программы.

SS - "Регистр стека" (Stack Segment register) - Содержит адрес сегмента стека текущей программы.

ES, GS, FS - "Регистры дополнительных сегментов данных" (Extension Data Segment registers) - Используются они когда данных настолько много, что в один сегмент они у вас не помещаются. Лично мы их никогда не использовали, поэтому грузить по этому поводу не станем...

Помните, мы уже упоминали о том, что компьютер не в силах самомтоятельно отличить данные от кода? О функциональном назначении "блока шестнадцатеричных циферек" мы "сообщаем" процессору путем "привязки" оных к соответствующему регистру. Привяжем к CS - процессор будет считать это кодом. Привяжем к DS - процессор будет считать это данными...

[7] Есть еще и два "служебных регистра". ("Наша служба и опасна, и трудна"):

EIP/IP - "Указатель команды" (Instruction Pointer register) - Содержит адрес команды (смещение в сегменте кода), которую процессор собирается выполнить. Естественно, каждая выполняемая команда меняет его содержимое...

Ну и, наконец, есть еще один регистр, но тот вообще навороченый...

EFLAGS/FLAGS - "Регистр флагов" (Flag register). Каждый из 32/16 битиков этого регистра - это отдельный "флаг", значение которого (0 или 1) отображает и/или управляет работой компьютера...

На счет флагов, в общем-то, будет разговор отдельный и обстоятельный...

[8] Для обобщения мы сейчас табличку одну нарисуем, чтоб немножко нагляднее показать группировку регистров "по функциональному признаку"...

Итак, "системные" мы еще не трогали, а вот "пользовательские" у нас группируются следующим извращенным образом:

 "Общего назначения"
"Сегментные"
"Служебные"
"Универсальные"
"Цепочечные"
"Стековые"
EAX/AX(AH+AL),
EBX/BX(BH+BL),
ECX/CX(CH+CL),
EDX/DX(DH+DL)
CCC"> ESI/SI,
 EDI/DI
 ESP/SP,
 EBP/BP
 CS, DS, SS, ES, GS, FS
 EIP/IP,
 EFLAGS/FLAGS

Обратите внимание вот на что: все регистры имеют свою "расширенную версию", а сегментные не имеют... Все регистры не делятся на старшую и младшую части, а "универсальные" - делятся...

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

На процессорах 386+ они означают не адрес сегмента, а дескриптор сегмента, а полный адрес сегмента с описанием его характеристик находится в соответствующей таблице, адресуемой через регистры системных адресов - процессор выбирает необходимый элемент из этой таблицы в соответствии со значением в сегментном регистре. Надеюсь, все все поняли?

Естественно, что в дебаге, лет которому очень много, отображаются только 16-битные "версии" регистров... А помните при просмотре регистров у нас там буковки наряду с регистрами есть? "NV UP EI PL NZ NA PO NC". Это и есть флажки! Но с ними мы в следующий раз разберемся...

Спать тоже иногда нужно... А еще нужно иногда спать одному, если хочешь в кои-то веки выспаться...

Господа начинающие!! Не пугайтесь! Каждый из упомянутых регистров мы еще неоднократно поимеем! Как, надеюсь, сдели это с "универсальными"... AX вы уже не боитесь, верно? А если бы я вам изначально сказал, что какой-нить BX это не просто одна из переменных, а "регистр базы" - вы бы поняли? Понять-то может и поняли, но еще десять раз задумались бы над тем, что получится, если загадочную "базу" сложить с загадочным "аккумулятором"...

Да пребудет с вами сила, братья! В следующее воскресенье мы расколупаем флаги...

НЕ БОЙТЕСЬ!

Братья! Я повторюсь! Если "завернутость" этого номера слегка вас шокировала (ну не поняли вы ничерта!) - не пугайтесь! Это всего лишь своего года "обзор" всех регистров! Запоминать вам их "специализацию" и назначение 100 лет не нужно! Истинное понимание приходит лишь с опытом!

AX, BX, CX, DX "понимате"? Сточили уже зубы на них? И правильно! На остальных регистрах вы со временем тоже зубы сточите... а также почки, сердце, печень, член, предстательную железу (нужное подчерхнуть, ненужное зачеркнуть)...

Крепите дух, братья... годы темные страшные все ближе и ближе!!

ЗЫ: Что будут стачивать DZ сестры - я не знаю_.

ОБЗОР ДZЕНСКИХ САЙТОВ - DORE.RU

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

^^^ это на тарабарском языке написано. А если на русский перевести, то вот что получится:

"Народ! Ты попал в обитель программерского разврата! Ты круто влип! Если откроешь еще хоть одну страничку нашей паги, то заразишься болезнью пострашнее спида! А если не заразишься - мы постаремся помочь тебе заразиться!"

Ох, DoRE Федоре, DoRE...

Была Федора простая, а стала золотая. Раньше на Дельфях лабала, а теперь c пивОм сидит, чужой BIN дизассемблит... и с опухшими глазами в окно браузера глядит...

Ресурс этот "типа крутой и все такое"... Давно о нем знал, но все как-то "поисследовать" его времени не хватало... Собрался таки посмотреть, что там! В рейтингах программерских сайтов он довольно высоко находится!! Уровень, однако!

Заглавная страничка выглядела многообещающе :))). Тута мне и новости обещались, и статьи, и компютерный клуб какой-то, и алгоритмы, и библиотека, и форум, и загадочные софтул. игры, и инструменты, и книжный магазин, и исходные тексты, и справочники, и ссылки...

Вот, думаю, щас оттянусь и задовнлоадюсь!!

Ну и первое, куда пошел (ну а куда ж еще кликать?) - это раздел "статьи".

Ух ты, думаю, как здорово! Прикиньте подборочку: криптография (мое любимое!), windows, ассемблер, бейсик, С и С++, теория, исследование программ, unix, java, perl, паскаль и прочие...

Заинтересовался я в первую очередь, естественно, ассемблером... кликнул... Загрузилась первая часть странички... Читаю и чуть ли не писаюсь от восторга!

Цитирую: "В разделе представлены книги по программированию на языке ассемблер под Dos, Windows 95, Windows 98, Windows NT, Windows 2000, Win32 и Unix. В книгах вы найдете описание команд процессора x86, работы с компиляторами MASM, TASM, WASM и другими, компоновщиками LINK, TLINK, отладчиками debug, CodeView, SoftICE и другими, дизассемблерами WinDasm, Hiew, IDA Pro"

Во, рулез, думаю... и жду пока дальше страничка загрузится...

А ПОТОМ Я ПРОСТО ВООБЩЕ ОФИГЕВАЮ!!!

"К сожалению, в настоящий момент ни одной статьи в данном разделе нет. Вероятно они появятся в ближайшее время, так что следите за новостями!"

Черт!! Обидно! А я ж столько баннеров ихних просмотрел!!

Ладно, ползу в другой раздел... в "криптографию"...

"В разделе представлены книги посвященные изучению криптографии, криптологии, криптоанализа, криптографических алгоритмов и криптосистем. Среди прочей полезной информации, в книгах вы найдете описание криптографических алгоритмов, таких как DES, RC5, ГОСТ, BLOWFISH и многих других."

А ниже - тоже самое:

"К сожалению, в настоящий момент ни одной статьи в данном разделе нет. Вероятно они появятся в ближайшее время, так что следите за новостями!"

Тут я вообще в непонятках и начинаю ругаться нехорошими словами...

Делаю третюю попытку - лезу в раздел "исследование программ". Там-то уж точно должно хоть что-то быть! В конце концов название сайта обязывает!!

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

И тут же: "К сожалению, в настоящий момент ни одной статьи в данном разделе нет. Вероятно они появятся в ближайшее время, так что следите за новостями!"

И тут же меня пропала потенция смотреть на их "инструменты" "алгоритмы", "исходные тексты" и т. д. :((

...

А сейчас я перечитал свою аннотацию к этому ресурсу и еще больше офигел! Это надо же, столько слов своего дZенского драгоценного авторского текста такому отстойному ресурсу посвятил!!

Эх, DoRe... Горе, фиDORE, горе...

Так... что там мне предлагается? Следить за новостями? Немножко подождать то бишь?

И тут же я вспомнил одну симпатявую песенку...

"Подождем мою маму..." Ну что же...

Подождем, твою мать...

АНОНС

Вроде флаги у нас по плану... к кирпичам, систематически сваливающимся на нашу совокупную голову мы уже привыкли. Если не начет падать чего потяжелее - следующий номер тоже будет! Зуб даю! Отвечаю!! Ой... вроде еще один кирпич...