На главную  Программирование на Ассемблере в Fasm  Операционные Системы  Написать Автору  Полезные ссылки



Для поиска введите икомое слово в текстовое поле и нажмите Enter:



Часть2.Усложняем программу.
HW2.ASM
format PE GUI 4.0
entry начало


include 'tm.inc'
include 'c:\fasm\include\win32a.inc'
section '.data' data readable writeable                          ;<<NEW!
 TEXT  db 'Привет!Я твоя первая прога на FASM.',0;<<NEW!
 TITLE db 'Моя первая прога!',0    ;<<NEW!

section '.code' code readable executable
  начало:
     invoke InitCommonControls
     invoke  MessageBox,NULL,TEXT,TITLE,MB_OK  ;<<NEW!
     invoke    ExitProcess,NULL

section '.idata' import data readable writeable
   library kernel32,'KERNEL32.DLL',\
               user32,'USER32.DLL',\
              comctl32,"COMCTL32.DLL"
;<<NEW!

include 'c:\fasm\include\apia\kernel32.inc'
include 'c:\fasm\include\apia\user32.inc'
include 'c:\fasm\include\apia\comctl32.inc'  
;<<NEW!

data resource from 'hw2.res'    
;<<NEW!
end data    ;<<NEW!
Итак крутые кодеры что же у нас изменилось?Ну конечноже строки с надписью NEW!Так что же изменилось?
Рассмотрим новенькие строки под микроскопом:
section '.data' data readable writeable                          ;<<NEW!  -Секцию 'data' обявляем секцией  данных (разрешаем чтение и запись).
 TEXT  db 'Привет!Я твоя первая прога на FASM.',0;<<NEW!
 TITLE db 'Моя первая прога!',0    ;<<NEW!   -Здесь нужно разобраться.Что такое строка?Правильно - это набор символов определённой последовательности.То есть байт закодированых в какойто кодировке.Итак мы используем директиву db.Эта директива имеет синтаксис:
Имя db  последовательность байт
Пример:
Число db 030285 -Здесь последовательность байт 030285 мы распологаем по адрессу метки Число.
 TITLE db 'Моя первая прога!',0 -Аналогично распологаем строку db 'Моя первая прога!' по адрессу TITLE.Обратите внимание на запятую и ноль(,0).Это важно:помещая ANSI строку по какомуто адрессу мы должны передать и указатель на конец строки а то вместе со строкой мы можем получить и всякий мусор.
 invoke  MessageBox,NULL,TEXT,TITLE,MB_OK  ;<<NEW!  -Тут всё также только заместо строк мы передали функции указатели на них.
comctl32,"COMCTL32.DLL" ;<<NEW!  -Мы используем библиотеку COMCTL32.DLL.
include 'c:\fasm\include\apia\comctl32.inc'  ;<<NEW!   -подключаем inc-файл comctl32.inc .

data resource from 'hw2.res'    ;<<NEW!   <<----
end data    ;<<NEW!                      <<----Эти строки просто добавляют данные ресурсов из файла hw.res в программу.Ресурсами могут буть:

1.Меню.
2.Курсоры
3.wav файлы
4.Изображения
5.Иконки(значки)
6.Диалоговые окна
7.Файлы манифестов

И немало других вешей (например текстовые и иные файлы).
Итак зачем нам функция  invoke InitCommonControls ,которая ничего не делает?Она нам нужна для того чтобы программа поддерживала XP стили(Кнопочки и иные детали интерфейса были XP'шными,а не в стиле Win9X.).
А зачем файл ресурсов подумаете вы?В нём спрятан файл иконки для нашей программы,а также Манифест(Документ заверяющий вашу XP'ху что программа написана под WinXP и поддерживает стили визуального оформления.).
Вот содержимое hw2.rc:
HW2.RC
10                    ICON      DISCARDABLE "Hearts.ico"
1                    24  DISCARDABLE "MANIFEST.xml"

10     ICON      DISCARDABLE "Hearts.ico" -Тут10 - это персональный номер ресурса.Вы сами его назначаете.ICON      DISCARDABLE -Это тип ресурса."Hearts.ico"  -Файл иконки которую мы момещаем как ресурс.
1      24        DISCARDABLE "MANIFEST.xml" -Один-это персональный номер,24  DISCARDABLE -тип ресурса(Манифест),"MANIFEST.xml" -файл манифеста.

Теперь о компиляции.Вот содержимое bat-файла(примерное):
Less1fasm.bat
echo FASM Lesson's by Andrew Michael Gutsu (Steelman)
echo 19:21 04.10.2005
echo Compile first lesson
echo Press any key
@pause > nul

C:\fasm\BRCC32 -r hw2.rc
C:\fasm\fasm hw.asm
C:\fasm\fasm hw2.asm
C:\fasm\fasm hw3.asm
del hw.obj
hw.exe
hw2.exe
hw3.exe
echo Press any key
@pause > nul
Итак что же мы видим?
echo FASM Lesson's by Andrew Michael Gutsu (Steelman)
echo 19:21 04.10.2005
echo Compile first lesson
echo Press any key  - Оператор echo выводит следующую за ним строку.Мы просто выводим сообщения.
@pause > nul  - ожидаем нажатие клавиши(любой).
C:\fasm\BRCC32 -r hw2.rc -Мы запускаем BRCC32.EXE и передаём ему наш rc-файл(чтобы получить res-файл).Для BRCC32 обязательно нужно указать ключ -r ,что-бы  получить .RES файл а не .OBJ.
C:\fasm\fasm hw.asm
C:\fasm\fasm hw2.asm
C:\fasm\fasm hw3.asm  -Мы запускаем FASM.EXE и передаём ему наш asm-файл(чтобы получить нашу программу).FASM не использует параметры командной строки так что мы просто передаём FASM'у наш .ASM-файл.

hw.exe
hw2.exe
hw3.exe -Запускаем полученые программы.Я думаю тут всё ясно и вы и сами сможете писать похожие bat-файлы.
Заключение(happy end).
Теперь немного голой теории после моря практики.Вы должны знать о том что програмирование под Windows состоит из умения вызывать и использовать Win API функции и умения  создавать свои функции и куски кода.Система берёт на себя работу с устройствами,Интерфейсом,памятью.Вы должны уметь использовать эту бездну полезных вещей.Тогда вам не прийдётся "изобретать велосипед" создавая функцию которую сиситема предлагает вам даром.
Кроме того я хочу показать вам на примере как  работает программа в которой используются и функции Win API и оригинальный код.Заодно мы освоим несколько ассемблерных инструкции(команд процессора).
Итак нам надо чтобы наша программа посчитала (135+200-56):2 и вывела результат.
Итак заместо переменных используются регистры процессора или ячейки памяти.
Итак код который посчитает нам результат этих вычислений:
mov eax,135
add eax,200
sub eax,55
mov bl,2
div bl 
Теперь объясняю:
mov eax,135 -заносим в регистр eax значение 135.
add eax,200 -прибавляем к eax 200.
sub eax,56  -отнимаем от результата 56.
mov bl,2   -заносим делитель в BL.
div bl     -делим EAX на BL.
Результат получаем в eax.В ASCII число преобразуем так:
invoke wsprintf,ebx,szformat,eax
Выводим:
invoke  MessageBox,NULL,ebx,TITLE,MB_OK
В секцию 'data' надо добавить:
szformat db "%u",0
Я убедительно прошу вас-попытайтесь написать программу сами.Я поместил в архив файл  hw3.asm который вы сможете сравнить с тем,что у вас получилось.

Уверен вы поняли не всё,но со временем вы поймёте это и оно покажется вам ясным как день.
Удачи!

Страница1 из 2-хНаверхСтраница2 из 2-х
Сайт управляется системой uCoz