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

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


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

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

Сайт подписчиков
Архив выпусков
На сайте Kalashnikoff.ru Вы также можете: подписаться на рассылку FAQ по Ассемблеру, задать вопросы экспертам, зарегистрироваться в качестве эксперта, скачать архив выпусков, посетить форум программистов, оставить информацию о Вашем ресурсе и многое другое. Заходите! Мы ждем Вас!          
Ассемблер? Это просто!
Учимся программировать
Выходит с июня 2000 года
Автор:
Калашников Олег
c 2001, Россия, Москва. Авторское право принадлежит Калашникову Олегу Александровичу (Assembler@Kalashnikoff.ru). Запрещается публичное размещение материала из данной рассылки полностью или частично в коммерческих или иных подобных целях без письменного согласия автора.

Выпуск № 32
22 февраля 2002 года
Выпуск подготовил: MemoBreaker


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

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

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

Настоящий, 32-ый номер рассылки, начинает серию публикаций по программированию на Ассемблере под Windows. Предполагается, что вы уже знакомы с основами программирования на Ассемблере. Если же не так, то прежде всего вам необходимо скачать архив выпусков данной рассылки с сайта http://asm.kalashnikoff.ru/dos. В данном архиве:

  • основные команды процессоров Intel 8086, 80286, 80386;
  • 16-и и 32-х разрядные регистры;
  • основы работы с сопроцессором;
  • сегментация памяти в реальном режиме;
  • XMS (расширенная) память;
  • прямая работа с видеоадаптером;
  • CGA, EGA (кратко);
  • управление клавиатурой на уровне прерываний;
  • основные функции BIOS (ПЗУ) и MS-DOS;
  • работа с дисками, каталогами и файлами;
  • высокоуровневая оптимизация программ.

А также в процессе изучения Ассемблера рассматриваются четыре программы:

  • нерезидентный вирус;
  • резидентный антивирус против нашего вируса;
  • файловая оболочка для DOS типа Norton Commander с поддержкой длинных имен файлов и использованием XMS (пока еще до конца не написана);
  • несколько видов резидентных программ.

А также исследуется работа отладчиков и способы обойти отладку программы.

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

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

Приятного изучения!


Новости

Итак, настоящий долгожданный выпуск по программированию на Ассемблере под Windows открывает эксперт MemoBreaker. За что ему огромное спасибо и низкий поклон от меня. Вполне возможно, что следующий выпуск сделает другой эксперт. Но это мы еще посмотрим. Если такое дело пойдет работать, то я попробую автоматизировать процедуру ввода настоящей рассылки...

Если вы помните, уважаемые читатели, мы не закончили писать оболочку. Но, надеюсь, со временем я все-таки сделаю этот последний выпуск под MS-DOS, где мы рассмотрим то, что не затрагивалось в предыдущих выпусках (например, "мышку"). А пока... Пока у меня очень мало времени, т.к.:

  1. Мы постепенно перемещаемся на домен http://RusFAQ.ru, где будут объединены множества различных FAQ-рассылок, наподобие "Ассемблер? Это просто! Учимся программировать (FAQ)". Поверьте, работы выше крыши...
  2. Доделываю программу обработки сообщений, исправляю ошибки;
  3. Отвечаю на огромное количество ваших писем, разрешаю споры и пр. Мой ящик не дремлет...

Да и вообще, работы хватает.

Ну, не буду долго распинаться. Встречайте: "Hello, world!" от эксперта MemoBreaker.


"Hello, world!"

Первое приложение.
"Hello, world с использованием API MessageBox".


 

Услышав призыв создателя... т.е. Калашникова , решил помочь желающим научиться писать на ассемблере (в дальнейшем просто АСМ) для Windows.

Небольшое вступление.
Для программирования на асме под Windows существует несколько ассемблеров, самые популярные из которых - это TASM, MASM и NASM...

TASM
Этот ассемблер получил большую популярность во времена DOS-приложений, ну да Вы сами знаете :)

NASM
Это, IMHO, "кроссплатформенный" ассемблер... для x86-процессоров :) Этот ассемблер есть как для Windows, так и для Linux, API в этих ОС'ах конечно же разные, зато этот компилятор позволяет использовать одинаковый синтаксис ассемблера - такой, каким его придумала Intel. Дело в том, что в UNIX-системах принят другой стандарт ассемблера, который отличается от Intel'овского очень значительно. Чтобы программерам не пришлось переучивать асм, который они уже знают, и был придуман этот компилятор, хотя я могу и ошибаться в последнем утверждении, но для нас это не так важно.

MASM
А этот зверь создан "самой любимой" компанией - M$... Преимущество этого компилятора в том, что количество приложений, написанных для него, больше, чем для других компиляторов ассемблера. Сильно этому способствует существование пакета программ MASM32 от сторонних разработчиков, который включает в себя компилятор MASM. Популярность данного пакета объясняется тем, что он включает множество примеров, заголовочных файлов, также содержит некоторые дополнительные приложения. Именно наличие множества заголовочных файлов придает большое удобство в работе с данным компилятором, для других асм'ов зачастую объявлять используемые функции приходится вручную, что ОЧЕНЬ не удобно. В своем примере я буду использовать именно этот компилятор ассемблера, и именно этот пакет программ (MASM32).

Скачать MASM32 v7 можно здесь, размер не маленький, но это того стоит.

Теперь можно приступить к "обучению"...
Приложение:

; #########################################################################

      .386   ; процессор, использование команд которого разрешено
      .model flat, stdcall ; Windows использует "плоский" (FLAT) тип памяти, stdcall указывает способ передачи параметров функций
      option casemap :none ; "включает" различие больших и малых букв, это нужно для того, чтобы можно было использовать API функции, насколько я помню

; подключим необходимые заголовочные файлы.
; помните, что вам нужно указать путь к этим файлам на ВАШЕМ диске

 include C:\MASM32\INCLUDE\windows.inc
 include C:\MASM32\INCLUDE\user32.inc
 include C:\MASM32\INCLUDE\kernel32.inc
 includelib C:\MASM32\LIB\kernel32.lib
 includelib C:\MASM32\LIB\user32.lib

 .data
 szMBText db "Hello world!",0 ; текст в окне MessageBox
 szMBHead db "First App",0 ; текст в заголовке MessageBox'а

 .code

start:

 invoke MessageBox,NULL,ADDR szMBText,ADDR szMBHead,MB_OK; покажем наш MessageBox
 invoke ExitProcess,0     ; корректно завершим приложение

end start
; #########################################################################
Теперь сохраните этот текст в файле Project.asm, например.
Осталось скомпилировать и отлинковать, для этого в командной строке наберите сначала:
 C:\MASM32\BIN\Ml.exe /c /coff Project.asm
а затем:
 C:\MASM32\BIN\Link.exe /SUBSYSTEM:WINDOWS Project.obj
Вот Ваше приложение и готово.

Краткие пояснения и замечания.
  • Вы уже заметили, что не используется ни одного CALL'а? Если нет, то вернитесь в начало статьи :) Зато есть странные "INVOKE". Это еще одно удобство, которое мы получаем, используя MASM - если раньше нам было необходимо занести все параметры в стэк, и только потом вызвать функцию:
     PUSH MB_OK
     PUSH OFFSET szMBHead
     PUSH OFFSET szMBText
     PUSH 0
     CALL MessageBox
    
    то сейчас мы можем просто написать:
     invoke MessageBox,NULL,ADDR szMBText,ADDR szMBHead,MB_OK
    
  • Функция MessageBox имеет следующие параметры:
    1. HWND окна, у нас его пока нет, поэтому пишем NULL
    2. смещение по которому находится ASCIIZ текст, для отображения в MessageBox, пишем ADDR szMBText, где ADDR - встроенный макрос, который передает в функцию адрес, по которому находится переменная, указанная после ADDR (подобие OFFSET)
    3. смещение по которому находится ASCIIZ текст, для отображения в заголовке MessageBox
    4. тип MessageBox'а - у нас MB_OK, то есть MessageBox с кнопкой OK, другие стили MessageBox'ов смотрите либо в MSDN, либо в WINDOWS.INC, ищите константы, начинающиеся на MB_(кроме MB_PRECOMPOSED, MB_COMPOSITE, MB_USEGLYPHCHARS)
     
  • Наше приложение завершилось функцией ExitProcess, которая "закрывает" текущий процесс. Можно было бы просто написать RET, приложение скомпилилось бы, и даже запустилось и завершилось не выводя сообщений об ошибках, но это "не корректно", раз правила требуют завершать приложение ExitProcess'ом, значит так надо. И лучше от этого правила не отступать, так как новые версии Windows могут по-другому отнестись к нарушению ее правил.
  • Хочу обратить Ваше внимание на строку:
     C:\MASM32\BIN\Link.exe /SUBSYSTEM:WINDOWS Project.obj
    здесь опция /SUBSYSTEM:WINDOWS указывает линкеру, что будет создано обычное приложение для Windows, если же Вы решите написать консольное приложение, то будет необходимо указать:
     C:\MASM32\BIN\Link.exe /SUBSYSTEM:CONSOLE Project.obj
    Можете попробовать :)

     

  • Ну и последнее, что хотелось бы сказать: если для Вас ОЧЕНЬ критичен размер приложения, или просто захотелось сэкономить место на жестком диске, то при линковке используйте следующую строку:
     C:\MASM32\BIN\Link.exe /filealign:512 /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,EWR /IGNORE:4078 /SUBSYSTEM:WINDOWS Project.obj
    Дается без объяснения :)


  • Для сведения - в поставку MASM32 v7 входят:
  • Утилита Prostart - позволяет быстро создать шаблон приложения, с выбранными Вами настройками
  • QEditor и TheGun - два текстовых редактора, один похож на NotePad, другой помощнее
  • BinToDB - программка, которая любой файл конвертирует в ASM-файл, содержащий соответствующие строки с данными (DB xx,xx,xx,...)
  • Другие программы
  • Куча, просто КУЧА примеров, от простых, до COM-ориентированного программирования
  • MASM32Lib - библиотека, содержащая множество "стандартных" функций, например для работы со строками и т.д.
  • И еще много чего - всего и не вспомнишь...

  • Вот теперь все, шатдаун, так сказать... С Вами был MemoBreaker.

    P.S. Вопросы по настоящему материалу задавайте MemoBreaker'у или экспертам по указанному выше адресу.


    С уважением,

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



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

    В избранное