логотип нашего сайта о программировании для начинающих

Программирование на ассемблере для начинающих. Ассемблер gas под linux, fasm под windows, tasm под dos, и многое другое.


Сайт для программистов, начинающих кодеров, и людей, желающих заняться программированием.




Меню невыпадающее
Программистам : Другое :

"Hello from FASM !!! "

    ;
; ну вот через мессаджБокс
format PE GUI 4.0
    ; определяем формат выходного файла - PE - портабельный исполнимый
    ; GUI 4.0 - версия gui
    ;
entry start
    ; определяем точку входа -> точка входа - метка "start:"

include '%include%/win32a.inc'
    ; подключаем инклуды
    ;содержимое win32a.inc:
    ;
    ;>>     Win32 programming headers (ASCII)
    ;>>     ;>>     include '%include%/macro/stdcall.inc'
;             здесь определены макросы:
;            -proc
;             -enter
;             -return
;             -stdcall
;             -invoke
;                 //invoke - это альтернатива call, он провереряет сколькопараметров надо вытолкнуть в stack
;                 // например call ExitProcess - выдаст ошибку, т.к. при таком вызове надо
;                 // вытолкнуть в stack двойное слово (д.б. передоваемый параметр)
;                 // (прототип ExitProcess: ExitProcess proto uExitCode:DWORD
;                 // т.е. ей надо передать uExitCode:DWORD - двойное слово)
;                 // invoke ExitProcess - такой ошибки не выдаст
;             //это всё макросы а не фичи ассемблянта
;>>     include '%include%/macro/cdecl.inc'
;         здесь определены макросы:
;             -cproc
;             -enterc
;             -retc
;             -ccall
;             -cinvoke
;             //в принципе то же самое что и stdcall - только передача параметров идёт по C-договорённости
;             // параметры передаются справа налево (т.е. самый правый параметр кладётся в стек первым),
;             // вызывающий должен уровнять стек после вызова.
;>>     include '%include%/macro/import.inc'
;         макросы
;             -library
;             -import
;>>     include '%include%/macro/export.inc'
;         единственный макрос
;             -export
;>>     include '%include%/macro/resource.inc'
;         ресурсные макросы:
;             -directory,resource,bitmap,icon,fileres,menu,menuitem,menuseparator,dialog,dialogitem,enddialog,
;             accelerator,version
;>>     include '%include%/macro/struct.inc'
;         единственный макрос
;             -struct (не путать со "struc" - директивой фасма)
;>>
;>>     CHAR equ rb
;>>
;>>     include '%include%/equates/kernel32.inc'     \\ системные структуры и константы
;>>     include '%include%/equates/user32.inc'     \\ в том числе и TRUE=1,FALSE=0,NULL=0
;>>     include '%include%/equates/gdi32.inc'     \\ (kernel32.inc)
;>>     include '%include%/equates/comctl32.inc'     \\ в kernel32.inc также определён один макрос 'align'
;>>     include '%include%/equates/comdlg32.inc'     \\ *
;>>     include '%include%/equates/shell32.inc'     \\ *
;>>     include '%include%/equates/wsock32.inc'     \\ *
;
;конец win32a.inc
;

section '.data' data readable writeable
; определяем секцию данных (читаемых, писуемых)
title db 'Hello from FASM .',0 ; \\ название окна
message db 'Hello from Amsterdam-city!!! .',0 ; \\ сообщение
; message - метка данных
; db - размер
; '...' - собственно данные
; ,0 - конец данных

section '.code' code readable executable
    ; определяем секцию кода (читаемая, исполнимая)

start:
    ; наша точка входа (entry start - в начале кода делает ссылку именно на неё)
invoke MessageBox,HWND_DESKTOP,message,title,MB_OK
    ;вызываем MessageBox
    ;параметры:
    ;     1) хэндл родительского окна - у нас окна нет, поэтому передаём HWND_DESKTOP (ксати говоря HWND_DESKTOP=0 [можно просто передать 0])
    ;     2) адрес строки сообщения
    ;     // в FASM - message=адрес, [message]=значение (в квадратных скобках)
    ;     3) адрес строки заголовка
    ;     4) тип MessageBox -
    ;     // MB_OK = 000000h     // мы выбрали этот - можно другой или несколько других
    ;     // MB_OKCANCEL = 000001h     // типа MB_OK+MB_TOPMOST
    ;     // MB_ABORTRETRYIGNORE = 000002h     // это всё прописано в user32.inc
    ;     // MB_YESNOCANCEL = 000003h
    ;     // MB_YESNO = 000004h
    ;     // MB_RETRYCANCEL = 000005h
    ;     // MB_ICONHAND = 000010h
    ;     // MB_ICONQUESTION = 000020h
    ;     // MB_ICONEXCLAMATION = 000030h
    ;     // MB_ICONASTERISK = 000040h
    ;     // MB_USERICON = 000080h
    ;     // MB_ICONWARNING = MB_ICONEXCLAMATION
    ;     // MB_ICONERROR = MB_ICONHAND
    ;     // MB_ICONINFORMATION = MB_ICONASTERISK
    ;     // MB_ICONSTOP = MB_ICONHAND
    ;     // MB_DEFBUTTON1 = 000000h
    ;     // MB_DEFBUTTON2 = 000100h
    ;     // MB_DEFBUTTON3 = 000200h
    ;     // MB_DEFBUTTON4 = 000300h
    ;     // MB_APPLMODAL = 000000h
    ;     // MB_SYSTEMMODAL = 001000h
    ;     // MB_TASKMODAL = 002000h
    ;     // MB_HELP = 004000h
    ;     // MB_NOFOCUS = 008000h
    ;     // MB_SETFOREGROUND = 010000h
    ;     // MB_DEFAULT_DESKTOP_ONLY = 020000h
    ;     // MB_TOPMOST = 040000h
    ;     // MB_RIGHT = 080000h
    ;     // MB_RTLREADING = 100000h
    ;     // MB_SERVICE_NOTIFICATION = 200000h
invoke ExitProcess,0
    ;завершаем процесс - передаём 0 (можно ничё не передовать - invoke обо всём по заботится)

section '.idata' import data readable writeable
    ; импортные данные - какие функции и из каких библиотек мы используем

library kernel,'KERNEL32.DLL',\
    user,'USER32.DLL'

        ; подключённые библиотеки

import kernel,\
ExitProcess,'ExitProcess'

    ; из библиотеки kernel32.dll подключаем функцию ExitProcess - завершение приложения
    ; ExitProcess - как мы будем называть функцию; 'ExitProcess' - как она называется в библиотеке

import user,\
MessageBox,'MessageBoxA'

    ; на самом деле в винде нет функции MessageBox - функции обробатывающие строки делятся на 2 категории - ****A и ***W
    ; (типа MessageBoxA и MessageBoxW)
    ; ***A - это если ты хочешь напечатать строку в формате ASCII (т.е. каждый знак занимает один байт),
    ; ***W - если в Unicode (W - от wide, широкий. В Unicode знаки не 8-битные, а 16-битные, и занимают два байта),
    ; если строки не обрабатываются - то такого разделения нет - неважно на каком языке произойдёт ExitProcess



;
; ну вроде бы усё
; таже шляпа только с использованием простого окна
; будет следом за этой (попозже)
;
; P.S. на самом деле - в examples/hello/hello.asm всё гораздо проще
;>>> include '%include%/win32ax.inc'
;>>>
;>>> .code
;>>>
;>>> start:
;>>>         invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Win32 Assembly",MB_OK
;>>>         invoke ExitProcess,0
;>>>
;>>> .end start
; там подключён win32ax.inc
; который делает всё автоматически - sections, .idata и т.д.
; но тогда на объяснение ушло бы в 2 раза больше времени и места
;
; ***LINKS***
;     весь используемый материал взят с http://www.wasm.ru

С уважением Костик.


Непосредственно вводимый код выделен фиолетовым цветом , все остальное(зеленым) - комментарии.
Примечание Pauk_pv.

Скачать исходный код и исполняемый файл этого примера в zip-архиве

сайт о программировании на ассемблере под Windows - http://www.wasm.ru

Fasm - http://flatassembler.net


Информер ТИЦ


Сайт создан Pauk_pv // Pauk@paukpv.pp.ru


При использовании информации с сайта обязательна ссылка на сайт
Pauk_pv ©