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

Ассемблер? Это просто! Учимся программировать


Служба Рассылок Subscribe.Ru

Дизайн рассылки разработан для Microsoft Internet Explorer 5.0+
при разрешении экрана 800х600+ точек

Ассемблер? Это просто!
Учимся программировать
Выходит с июня 2000 года

Выпуск № 34
06 марта 2002 года
Выпуск подготовил: Вал.Ик.


 Сегодня в номере:

Информация для новых подписчиков

Уважаемые читатели!

Архив выпусков настоящей рассылки можно скачать по адресу http://asm.kalashnikoff.ru/dos.

Ваши вопросы можно задавать экспертам. Специальную форма находится по адресу http://kalashnikoff.ru/cgi-bin/Message.cgi.

Подписаться на рассылку "Ассемблер? Это просто! Учимся программировать (FAQ)" можно на головной странице сайта http://kalashnikoff.ru. В данной рассылке публикуются частозадаваемые вопросы по программированию на Ассемблере.


Вал.Ик. представляет...

Сегодня в выпуске:
  • Кто здесь Где?
  • MessageBox: Почему такой?
  • У вас начались проблемы!
  • На следующее утро: Интервью с Президентом. (Что думает О.Калашников обо все этом бардаке)

Кто здесь Где?

При написании сего произведения предполагалось, что вы уже опухли от разных нужных прочитанных книжек про ассемблер под DOS, хотя бы с месяц потусовались в клубе читателей-экспертов в одноименной FAQовской рассылке и вполне понимаете разницу между мувами и попами. Если же это не так, мне остается только упасть на пол, задрыгать ногами, изрыгая проклятия на головы невинных чайников и отправить вас к..., в смысле, к первым выпускам рассылки "Ассемблер? Это просто! Учимся программировать" господина Калашникова.

Перед написанием сего документа мне пришлось целых две недели заново читать эти выпуски и опробовать его примеры и я авторитетно заявляю, что там есть АБСОЛЮТНО все необходимое, чтобы понять кто такой стек, зачем нужны вирусы и как их убивать. Кроме того, все это изложено супердоступным языком и ежели после этого кто-нибудь так и не понял конструкций типа push-pop, того пора, пожалуй, выдвигать в начальники. Посему остановимся сейчас на основных аспектах написанной нами с таким трудом программы.

.386 - Это, в общем такая директива ассемблера, указывающая компилятору использовать набор инструкций процессора 80386. Потому что только с 386-го можно полноценно програмить в Win32. Можно также накалякать .486 или .586, но для нашей программы это совершенно все равно. Другое дело, если не поставить ничего, или поставить .286. Тут tasm совершенно справедливо ругнется, куда же ты, мол, прешься с WinAPI, если я компилю для двоечки?

Тут уместно вспомнить, что к прописываемым вами цифирькам можно добавить символ p. Это будет выглядеть так: .386p или, скажем, .486p. Такую штуку прописывают, если надо использовать привилегированные команды процессора, например, для драйверов виртуальных устройств или менеджеров памяти.

Ага! А сейчас вы спросите: А что такое привилегированные команды, а потом что-то еще и еще... И так я на двадцать листов насобачу. Поэтому удовлетворитесь тем, что .386 и баста!

.model flat - Под Windows модель памяти только flat (плоская)!!! Потому что так надо! Потому что любое приложение Windows имеет в своем расположении 4Гб адресного пространства. Вся память собой представляет НЕПРЕРЫВНОЕ пространство размером в 4Гб.

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

Ну а по самой памяти - flat это, в общем хорошо. Ну неужели вам не надоело смотреть на мир сквозь замочную скважину 64Кб сегмента? А теперь сегментов больше нет, как же это не поприветствовать...

extrn - Здесь придется поднажать на мозги. По идее - все просто, эта директива ассемблера описывает функцию MessageBox. Понятно по контексту проги. Вопрос: как она это делает?

Директива сообщает tasmу, что вся последующая за ней белиберда является для данной программы внешней, что действительное ее расположение будет вычисляться позже - при сборке программы в кучу из разных модулей, библиотек и прочей лабуды. Вышеупомянутая белиберда (в данном случае MessageBox) обязательно должна иметь тип для того чтобы tasm знал, сколько зарезервировать под нее места. У нас типом является proc, следовательно tasm "знает", что MessageBox является меткой подпрограммы и значит может использоваться в командах jmp, call и подобных. А искать эту подпрограмму будет tlink во включенных библиотеках и когда найдет (может и не найти) вот тогда и пропишет реальный адрес в программе.

.data - чуть не ляпнул "сегмент данных"... Это не сегмент! Сегментов теперича у нас нету. Это просто секция инициализированных данных. Если добавить вопросик (.data?) получится секция неинициализированных данных. А ежели написать .const будет секция констант. Все что в этой секции есть не может быть модифицировано.

Ну и последняя директива с точкой .code. Секция кода программы. Это вкратце полный заголовок программы. Причем все секции можно не использовать, а объявлять только те, которые нужны. В данном случае нам нужна только .data.

Ну объявленные строки сообщений в .data вопросов не должны вызывать. Первая из них, собственно, само пикантное сообщение. Вторая - заголовок в окне MessageBoxA. Правда одно смущает - что это за нолики в конце строк? Где же наши любимые Досовские доллары?

Никто до сих пор не знает, какой программист в Microsoft придумал в качестве метки окончания строки знак доллара ($). По одной версии это поляк Солкович, который бредил повышением зарплаты, по другой сам Билл, который бредил тем же. Факт остается фактом - доллар очень не понравился оставшейся части программеров и, сколько я себя помню, всегда вызывал нарекания. Поэтому Биллу пришлось прислушаться к гласу народа и в Windows он со вздохами и сдерживаемыми рыданиями отказался от доллара и пришел к кодировке ANSI, в которой строки завершаются нулем (NULL-termineted строки). Сюда можно приплести еще кодировку Unicode, но мы покамест ограничимся вышесказанным...

Ну и наконец мы подошли к главному: вызов функции MessageBox.


MessageBox: Почему такой?

Это самый сложнейший вопрос, который мучает всех взявшихся объяснить в ассемблерной рассылке, почему программирование с помощью функций API является программированием на ассемблере, а не, скажем, на С. Вы программировали на языках высокого уровня? Да? Ну тогда вам понятно, что мы просто вызываем какую-то функцию из библиотеки и передаем ей параметры. Но как объяснить это ассемблерщикам? Для них функция - это call <адрес>, а не какой-то там неизвестно какой МесаджБокс или МодифМеню, неизвестно кем написанный и непонятно что делающий.

Да, дорогие мои асмы, придется смирится с тем, что под Windows нам придется пользоваться чужими процедурами, чужими переменными, чужими типами... Не будем же мы в самом деле переделывать Windows. У нас не было времени посмотреть даже реализацию досовских функций в "чистом" коде, а уж WinAPI... Грустно...

Теоретически, конечно, можно разобраться в ассемблерном коде всех Winовских функций, но тогда мы никогда не успеем написать что-то свое и так и помрем в недоумении, каким образом такая операционная система завоевала весь мир. Теперь вы, наверное, поймете пионеров-героев, умирающих на амбразурах Окон с лозунгами "Линух - РУЛЕЗЗЗЗ ФОРЕВА!" и "ВИНДОВУЗ-МАСТДАЙ!"

Короче говоря, функция MessageBox имеет четыре параметра. MessageBox (P1,Р2,Р3,Р4). Это я не знаю на каком языке написал. Просто для наглядности. Пока не важно, что за параметры и зачем нужны. Давайте будем подбираться к этому MessageBoxу медленно и по-пластунски.

Для функционирования этой функции эти параметры надо ей передать. Как? Ну, ясное дело через стек.. Как же еще в асме передавать параметры. Ну, берем и четырьмя pushaми загоняем параметры в стек, по очереди, начиная с последнего:

push P4
push P3
push P2
push P1
call MessageBox

Такая конструкция вполне нас устраивает. Однако что-то тут не так: Что-то мучит и не дает спать спокойно. Хотя все, в принципе, работает... Но что? Те, у кого такого чувства нет, бросайте компьютер и покупайте Dendy - вы прирожденные пользователи, а никак не программисты. Остальные уже давно рвут на себе волосы и плюются в монитор. А ГДЕ ЖЕ POPЫ??? Аксиома: Стек должен быть восстановлен! Но popов-то нет? Кто восстанавливает стек?

Вот первый спотычок на ровном месте.... Тут мы натолкнулись на один из подводных камней, которого в тексте программы не видно, но на самом деле он есть. Разные языки программирования по-разному обрабатывают параметры подпрограмм, по-разному входят и выходят из этих подпрограммы и много еще чего делают по-разному. Вы ведь не настолько наивны, что бы думать, что Windows написана на асме? Да, правильно, она написана на Си. Следовательно, наш Tasm должен подчиняться некоторым условностям этого языка. Но есть ведь и другие языки. Значит наш бедный Tasm должен подчиняться и их условностям.

Каким образом Tasm определяет все эти условности пока углубляться не будем - это весьма и весьма обширная тема, затрагивающая и Си и Паскль и Бесик и др. Пока же будем знать, что основными такими условностями являются:

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

Фу-у-у-уххх... Одно сложней другого... Ну, поехали дальше.

Далее, что собой представляют параметры. Что мы, в принципе, загоняем в стек? Правильно, всего лишь цифирьки, которые имеют значение только для вызываемой нами функции. Поэтому совершенно неважно, будет называться параметр NULL, ЭТОНОЛЬ или просто 0. Читабельность программы при этом конечно очень страдает, но спрашивается, когда ассемблерные программы были читабельны?

Поэтому:

Первый параметр - Окно, владеющее блоком сообщение (Handle окна)
Второй параметр - Указатель на отображаемое сообщение
Третий параметр - Указатель на заголовок окна сообщения
Четвертый параметр - Константа(ы), определяющая иконку, кнопки и тип окна.

По идее, вопросы должны вызывать только первый и четвертый параметры. С остальными и ежу все понятно. Первый параметр - это handle окна. Что такое handle? С аглицкого среди прочего переводится как "кличка, кликуха". С новозеландским акцентом переводится как "кружка для пива". А в общем это уникальный номер, присвоенный окну. Для нас в принципе не важно, какой этот номер, лишь бы мы помнили, что данный номер соответствует данному окну. Ежели вы всю жизнь будете считать, что это так, вы ничего не потеряете. Меня пока это определение устраивает.

Однако надо сказать, что на самом деле handle - это не совсем номер. Довольно давно, в одном мануале я встретил определение, что handle - "это линейный адрес программы в памяти" (?). По своему тупоумию фразу эту я не понял совершенно. И ежели вы человеческим языком объясните мне, что же такое handle на самом деле, я буду рад. У нас же этот самый handle равен нулю, так как никакого окна у нас нет, и наш МесаджБох все равно что глас вопиющего в пустыне, то есть никакому окну он не принадлежит и не с кем не общается, кроме вас самих. Присваивать же вам хэндл - дело неблагодарное и глупое:))))))).

Четвертый параметр - константы, начинающиеся на MB_. Это они так в справочниках называются. А на самом деле опять же цифирьки. У нас, например, ноль, что соответствует константе MB_OK. Они определяют тип сообщения, кнопки, сколько их и т.д., и т.п.

Сколько этих констант? А я считал? До фига! Вот в следующем выпуске возьмем и побалуемся со всем этим благополучием.

Ну и последнее, что требует объяснения, что это за буковка А прилепилась в конце нашей функции? Тут все просто. Функции API бывают двух типов - те которые поддерживают кодировку ANSI и те которые для китайцев:))), то есть поддерживают кодировку Unicode.

Что бы Windows достоверно знала с какими именно функциями она работает к первым (кодировка ANSI) добавляют окончание А, а ко вторым (кодировка Unicode) окончание W. Ежели хотите, можете изменить окончание нашей функции на W и посмотрите, что она вам выведет (MessageBoxW).

Может возникнуть вопрос - что ж это значит две разные функции? Да нет, в общем, функция одна - MessageBox. В большинстве случаев в программу добавляется файл, с помощью которого Windows сама определяет какие функции использовать, а вы в программе просто пишете имя функции безо всяких окончаний.


У вас начались проблемы!

Ну, я понял. Вы уже изнываете просто и ругаетесь благим матом на мое красноречие. Хочется же быстрее все это богатство засобачить в экзешник и с удовольствием понаблюдать как сама Windows сдаст Билла с потрохами. Ну что ж, поехали...

Скорее всего вы уже без моей помощи свой написанный текст программы сохранили в файле и как-то его (файл) обозвали. Ну я, например, назову его val.asm. Далее производим следующие манипуляции:

tasm32 /ml val.asm

После чего у вас получается (вернее у меня ) файл val.obj. Далее:

tlink32 /Tpe /aa /c val.obj /o import32.lib

Вот после этого получаем val.exe, который и пытаемся запустить. Ежели вы все выдержали в правильном тоне (то есть не ошиблись в ключах), все должно получится. У меня получилось. О ключах пока не будем. Я вас предупреждал, что ключи пока без комментариев. Мне надо самому плотно разобраться на что и как они влияют. А то потом скажете - вот, свинья, наврал. Пока же запускаем файл val.exe.

Ну? Все нормально? Я вас поздравляю! Потому что у восьмидесяти процентов в окошке оказался бред. А дело-то в кодировочке!!! Буковки-то нашенские, рассейские... А набирали, наверное, в FARовском редакторе, или где-нибудь под DOSом, используя 866 кодовую страницу? Так делать низзя!

Что бы пока не морочить себе голову с кодировками, набирайте текст программы с кириллицей где-нибудь в Windows (например, в том же Блокноте).


На следующее утро...

А на следующее утро у вас кружится голова от выпитого за ночь кофе, за окном идет дождь со снегом и шеф уже полчаса орет на меня, хотя сам, сволочь, всего неделю назад продал на девятую шахту мои программы, якобы от киевской фирмы. И я подумываю, а не натравить ли мне на него толпу разных прокуроров и адвокатов из законодательной рассылки уважаемого Калашникова? А потом вспоминаю, что дочку надо летом свозить на море, потому что она уже любую лужу больше метра называет морем, и для этих целей пришлось загнать свой старенький Celeronчик со всеми потрохами и все равно денег не хватит. А написанная вчера с таким энтузиазмом программа выглядит как-то коряво и некрасиво. Явно требует оптимизации. И вообще, что это за программа? Всего лишь вызов чужой функции. Где стройные ряды кодов? Где бесчисленное множество callов и retов? Да, народ, вдохновенье имеет свое похмелье, которое намного хуже алкогольного и называется депрессуха.

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


Интервью с Президентом. (Что думает О.Калашников обо все этом бардаке)

1. В преддверии годовщины рассылки "Ассемблер? Это просто! Учимся программировать?" можете сказать, каким образом Вам пришла в голову мысль открыть подобный ресурс? С чего все началось?

Все началось летом 2000 года. Я просто решил попробовать открыть свою рассылку на Subscribe.ru. Помню, как только открыл рассылку, все ждал, когда же, наконец, она появится в каталоге, подпишется ли кто-нибудь или нет. И - не поверите - сколько было радости, когда на основную (и тогда единственную) рассылку подписалось на следующий день 11 человек!!! Потом было 32... А там уж и не помню.
Мысли открыть сразу сайт не было. Когда рассылку перевели в разряд "серебряных" и на нее подписалось сразу несколько тысяч(!) человек, я чуть не упал: "Оказывается Ассемблер еще кого-то интересует!".
Ну, конечно, архивы высылал почтой. Тогда был у меня модем какой-то "левый", приходилось отправлять архив (100 Кб) по почте, причем, запросов приходило примерно 30 в час! Можете представить себе бедный модем, но свои испытания он прошел.
Затем, как я уже писал в FAQ-рассылке, я создал сайт в MS Word 98. Это было нечто "экзотическое". Да и до сих пор я не считаю себя даже более-менее хорошим дизайнером, т.к. нет у меня способностей к рисованию и - тем более - подбору цветов.


2. Как обстоят дела в рассылке сейчас? Есть ли новые планы?

Безусловно, планы есть. Вкратце:
1. Максимально объединить FAQ-рассылку и основную.
2. Создать хороший информационный портал разных направлений.
3. Объединить всех любителей-программистов, помочь им.


3. Подробнее, что будет представлять собой вновь создаваемый ресурс RusFAQ.ru?

Это - прежде всего - огромный информационный ресурс, цель которого не только создать множество FAQ-рассылок разных направлений, но и, как уже упоминалось выше, объединение людей по интересам, регионам, городам, оперативная помощь в освоении того или иного предмета, будь то программирование или законодательство, грамотные советы специалистов. Мы сейчас активно работаем с экспертом DivX над написанием мощных скриптов, способных обрабатывать огромные потоки информации. С момента создания FAQ-рассылки по Ассемблеру, я понял, что у всех нас есть много вопросов. Есть также люди, желающие безвозмездно помочь новичкам добрым советом, поделиться своими знаниями.
Вот именно для таких целей и создается http://RusFAQ.ru. О его официальном открытии будет сообщено в рассылке.


4. Кто принимает участие в его создании?

В создании RusFAQ.ru могут принять участие все желающие, обладающие определенными знаниями. Нам сейчас очень нужны специалисты по работе с PhotoShop или CorelDraw, а также программисты на Perl, PHP, HTML, MySQL.
Для того, чтобы принять участие и присоединиться к нам (а именно: ко мне и DivX), необходимо просто написать письмо в произвольной форме по адресу rusfaq@kalashnikoff.ru и сообщить, чем реально вы можете помочь. Всю необходимую информацию мы предоставим.


5. На рассылку "Ассемблер? Это просто! Учимся програмировать" подписано 11671 подписчик, а на рассылку "А..? Это п..! Уч. пр. ( FAQ) " - всего 5365, хотя основное действо протекает в последней. Чем это можно объяснить?

Здесь скорее всего играет важную роль время существования рассылки. Т.к. основная рассылка была открыта раньше, нежели FAQ-рассылка, да и информация в ней набиралась "ручками", а не автоматом, то и интерес к первой выше. Более того, рассылка "Ассемблер? Это просто! Учимся программировать" обучает программированию, в отличие от последней, в которой просто приводятся вопросы и ответы.


6. Что для Вас лично дороже: Основная рассылка или FAQ?

Раньше была основная, а теперь я бы сказал, что FAQ-рассылка, т.к. я больше ударился в программирование в Интернете, и для меня, естественно, важно наблюдать за работой написанных мной программ. Хотя, честно признаться, я иногда с огромным удовольствием перечитываю свои "творения" из основной рассылки.


7. Говорят, труднее всего руководить интеллектуальным коллективом. Как Вы справляетесь с Клубом Экспертов?

В принципе, всю работу делают эксперты, за что им от меня ОГРОМНОЕ спасибо! Я даже и не думал, что найду столько единомышленников. Спасибо вам всем, друзья мои!


8. Рассылка славится отсутствием модератора, Ваше отношение к этому? Каким образом удается поддерживать порядок в рассылке без модератора?

Да, в общем-то, за это опять-таки спасибо нашим экспертам, которые прилагают максимум усилий для поддержания рассылки. Личная благодарность от меня и многих-многих подписчиков следующим экспертам за их нелегкий труд:

Broken Sword
Painbringer
DiGiT
Dron
DivX
baldr
Sensey
змей
Ayl

а также многим-многим другим.


9. Можно ли считать спамом, по Вашему мнению, безинформативные ответы экспертов? Зачем они публикуются в рассылке?

Я думаю, что можно. А по поводу того, зачем они публикуются, то скажу, что НИКТО еще не придумал надежного механизма защиты от спама. Вы знаете, что все поступающие вопросы и ответы обрабатываются автоматом, поэтому вероятность проскакивания "ненормальных" ответов очень высока. Даже, как Вы помните, были подобные случаи, о которых не очень-то хочется вспоминать. Но, надеюсь, новая система на RusFAQ.ru будет совершенней.


10. В чем основное различие Вашей рассылки (FAQ) и Интернетовскими конференциями.

Думаю, в оперативности. Обратите внимание на дату и время отправки вопросов и ответов.


11. Личный вопрос, можно не отвечать. Как относится Ваша жена ко всему этому безобразию?

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


12. Как продвигаются дела с Вашей книгой? Скоро ли она увидит свет?

Вот это - не знаю, т.к. последнее время занят написанием скриптов для RusFAQ.ru. Жена меня тоже все время спрашивает, когда, мол, ты книгу доделаешь. И что самое интересное - осталось-то всего процентов 20 доделать, да вот руки не дотягиваются. Но о выходе книги я обязательно сообщу в рассылке.


13. Ваши пожелания экспертам и читателям.

Скорее не пожелания, а благодарности. Это, прежде всего, всем активным читателям и экспертам. Без них ничего бы этого не было. Еще хочу попросить подождать немного, пока Kalashnikoff.ru не переедет на RusFAQ.ru. Очень надеюсь, что новая система удовлетворит всех подписчиков и экспертов. Удачи вам всем, друзья мои!


В следующем номере:

  • А вам нужен отладчик? (Кто нибудь знает, кто такой SoftICE?)
  • Побалуемся с MessageBox. (А почему одна кнопка?)
  • Надоел! (Может напишем что-нибудь еще?)
  • Давно здесь сидим.... (Интервью со старейшинами. Эксперт Dron)

С уважением, Вал.Ик.

P.S. Да, кстати, а женщины в рассылке есть? Ну тогда с 8-ым мартом вас!

Странно, как это март может быть восьмым? Если он третий................

Все пинки, благодарности, критика и маты принимаются в неограниченном количестве по адресу: p_avtom@amk.lg.ua.


Управляющий:
Электронный адрес:
Адрес сайта:
ICQ №
Калашников Олег
Assembler@Kalashnikoff.ru
http://www.Kalashnikoff.ru
68951340
 
 
 
 
(C) 2002, Россия, Вал.Ик.

SpyLOG be number one SUPERTOP


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

В избранное