| Для поиска введите икомое слово в
текстовое поле и нажмите 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 который вы сможете
сравнить с тем,что у вас получилось.
Уверен вы поняли не всё,но со
временем вы поймёте это и оно покажется вам ясным как день.
Удачи!
|
|