Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пример программы на FASM для Windows здесь ! Скачайте пример программы для WIN32. 
:(
    Опции темы
sgi1981
Дата 4.4.2006, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Кому интересно, вот пример простой программы, составленной на ассемблере FASM для платформы WINDOWS. smile
Программа после своего запуска создает окно и выводит надпись в этом окне.
Для полной работы программы нужны ещё три звуковых файла "*.wav", которые я к сожалению поместить в этом сообщении не могу. Я постараюсь выложить их в нескольких сообщениях.
Ну и без них прога будет работать, только вместо воспроизведения будет BEEP.

Внимание. Данная программа составлена на плоском ассемблере FASM.
Скачать его можно вот от сюда
http://fresh.flatassembler.net/

Я поместил это сообщение чтобы разнообразить взгляды на ассемблер. А то в большинстве случаев... по DOS да под DOS...
smile
Код

;Пример каркасного приложения для Win32
format PE GUI 4.0
entry start
include 'win32a.inc'
section '.data' data readable writeable

hwnd    dd    0
hInst    dd    0
hdc    dd    0
;lpVersionInformation   OSVERSIONINFO   <?>
wcl    WNDCLASSEX    <?>
wcllen=$-wcl
message MSG    <?>
ps    PAINTSTRUCT    <?>
szClassName    db    'Приложение Win32',0
szTitleName    db    'Каркасное приложение Win32 на ассемблере',0
MesWindow    db    'Привет! Ну, как вам процесс разработки приложения на ассемблере?'
MesWindowLen    =    $-MesWindow
playFileCreate    db    'create.wav',0
playFilePaint    db    'paint.wav',0
playFileDestroy db    'destroy.wav',0
winmmdllname db 'winmm.dll',0
user32dllname db 'user32.dll',0
namef1 db 'PlaySound',0
HL1 dd 0
addrf1 dd ?
section '.code' code readable executable
 start:
    invoke    GetModuleHandle,0
    mov    [hInst], eax       ; по которому загружен модуль.
;Определяем адрес функции воспроизведения звукового файла
push winmmdllname;
call [LoadLibrary];
push namef1;
push eax;
call [GetProcAddress];
mov  [addrf1], eax;

WinMain:
    mov    [wcl.cbSize], wcllen      ;размер структуры в wcl.cbSize
    mov    [wcl.style], CS_HREDRAW+CS_VREDRAW
    mov    [wcl.lpfnWndProc],WindowProc       ;адрес оконной процедуры
    mov    [wcl.cbClsExtra],0
    mov    [wcl.cbWndExtra],0
    mov    eax,hInst
;дескриптор приложения в поле hInstance структуры wcl
    mov    [wcl.hInstance],eax
    push  IDI_APPLICATION          ;стандартная иконка
    push  0;
    call [LoadIcon];
    mov    [wcl.hIcon],eax   ;дескриптор иконки в поле hIcon структуры wcl
    push    IDC_ARROW    ;стандартный курсор - стрелка
    push    0
    call    [LoadCursor]
    mov    [wcl.hCursor],eax ;дескриптор курсора в поле hCursor структуры wcl
;определим цвет фона окна - белый
;готовим вызов HGDIOBJ GetStockObject(int fnObject)     ;type of stock object
    push    WHITE_BRUSH
    call    [GetStockObject]
    mov    [wcl.hbrBackground],eax
    mov    dword    ptr wcl.lpszMenuName,0    ;без главного меню
    mov    dword ptr wcl.lpszClassName, szClassName  ;имя класса окна  szClassName
    mov    [wcl.hIconSm],0
;регистрируем класс окна - готовим вызов RegisterClassExA (&wndclass)
    push    wcl;
    call    [RegisterClassEx]
    test    ax,ax    ;проверить на успех регистрации класса окна
    jz    end_cycl_msg    ;неудача
;создаем окно:
    push    0    ;lpParam
    push    [hInst]   ;hInstance
    push    NULL    ;menu
    push    NULL    ;parent hwnd
    push    CW_USEDEFAULT    ;высота окна
    push    CW_USEDEFAULT    ;ширина окна
    push    CW_USEDEFAULT    ;координата y левого верхнего угла окна
    push    CW_USEDEFAULT    ;координата x левого верхнего угла
    push    WS_OVERLAPPEDWINDOW    ;стиль окна
    push    szTitleName     ;Строка заголовка окна
    push    szClassName     ;имя класса окна
    push    NULL
    call    [CreateWindowEx]
    mov    [hwnd],eax      ;hwnd - дескриптор окна
;показать окно:
    push    SW_SHOWNORMAL
    push    [hwnd]
    call    [ShowWindow]
;перерисовываем содержимое окна
    push    [hwnd]
    call    [UpdateWindow]
;запускаем цикл сообщений:
cycl_msg:
    push    0
    push    0
    push    NULL
    push    message
    call    [GetMessage]
    cmp    ax,0
    je    end_cycl_msg
;трансляция ввода с клавиатуры
    push    message
    call    [TranslateMessage]
;отправим сообщение оконной процедуре
    push    message
    call    [DispatchMessage]
    jmp    cycl_msg
end_cycl_msg:
;выход из приложения
push    NULL
   call    [ExitProcess]

;-------------------WindowProc-----------------------------------------------
proc WindowProc   @@hwnd:DWORD, @@mes:DWORD, @@wparam:DWORD, @@lparam:DWORD
;ebx,edi, esi       ;эти регистры обязательно должны сохраняться
;uses ebx, esi, edi
local    @@hdc:DWORD
;push    ebx esi edi
push ebx
push edi
push esi
    cmp    [@@mes],WM_DESTROY
    je    wmdestroy
    cmp    [@@mes],WM_CREATE
    je    wmcreate
    cmp    [@@mes],WM_PAINT
    je    wmpaint
    jmp    default
wmcreate:
;обозначим создание окна звуковым эффектом
    push    00020000h
    push    NULL
    push    playFileCreate
       call    [addrf1]
    mov    eax,0    ;возвращаемое значение 0
       jmp     exit_wndproc
wmpaint:
    push    00020000h
       push    NULL
       push    playFilePaint
    call    [addrf1]
;получим контекст устройства HDC BeginPaint( HWND hwnd, // handle to window LPPAINTSTRUCT lpPaint // pointer to structure for paint information);
push    ps
    push    [@@hwnd]
    call    [BeginPaint]
    mov    [@@hdc],eax
;выведем строку текста в окно BOOL TextOut(
    push    MesWindowLen
    push    MesWindow
    push    100
    push    10
    push    [@@hdc]
    call    [TextOut]
;освободить контекст BOOL EndPaint(
push    ps
push    [@@hdc]
call    [EndPaint]
    mov    eax,0    ;возвращаемое значение 0
    jmp    exit_wndproc
wmdestroy:
    push    00020000h
       push    NULL
       push    playFileDestroy
       call    [addrf1]
;послать сообщение WM_QUIT
    push    0
    call    [PostQuitMessage]
    mov    eax,0    ;возвращаемое значение 0
    jmp    exit_wndproc
default:
;обработка по умолчанию
    push    [@@lparam]
    push    [@@wparam]
    push    [@@mes]
    push    [@@hwnd]
    call    [DefWindowProc]
    jmp exit_wndproc
;... ... ...
exit_wndproc:pop esi
pop edi
pop ebx
    ret
       endp

      section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
      user32,'USER32.DLL',\
      gdi32,'GDI32.DLL'

include 'kernel32.inc'
include 'user32.inc'
include 'gdi32.inc'




Присоединённый файл ( Кол-во скачиваний: 76 )
Присоединённый файл  create.zip 110,43 Kb


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sgi1981
Дата 4.4.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Ребята, когда скачаете FASM, если кто ещё не скачивал, то все файлы и каталоги из папки Include, что находится в каталоге с файлом Fasmw.exe, скопируете в каталог со своим исходным файлом "*.asm", а то компилятор не будет знать где искать подключаемые файлы.
Сам файл Fasmw.exe - это простая IDE среда для написания, редактирования и компиляции программы под WINDOWS. Это не такой компилятор, который запускается из командной строки. Это удобная во всяком случае среда программирования для ассемблера. Когда его запустите, перед вами откроется окно, где вы можете спокойно набирать текст на ассемблере FASM. Компиляция - "Ctrl - F9". Запуск - "F9". При ошибке компиляции IDE выделит ошибочную строку. После компиляции текст программы автоматически сохраняется. Единственное, на что обращаем внимание - это синтаксис FASM. Ну посмотрите мою програмку и все поймете.

А вот и второй звуковой файл - воспроизводится при перерисовке содержимого окна WINDOWS.


Присоединённый файл ( Кол-во скачиваний: 57 )
Присоединённый файл  paint.zip 104,54 Kb


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sgi1981
Дата 4.4.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Третий файл.
Все вопросы по FASM и по программированию для платформы WINDOWS - в эту тему.

Присоединённый файл ( Кол-во скачиваний: 51 )
Присоединённый файл  destroy.zip 103,61 Kb


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Urff
Дата 4.4.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Привет, я тоже учусь программировать на fasme.Правда на форуме оффсайта, поговорив с разработчиком FreshGui, скачал кроме нее и просто fasmw1.65.17.zip под винду, там все попросче...Там есть описание, как настроить fasmw.exe, чтоб не копировать файлы из INCLUDE в папку с примером.....
В pdf файле в этом архиве есть описание языка fasm1.65, но хотелось бы найти сие описание на русском языке.....

Это сообщение отредактировал(а) Urff - 4.4.2006, 19:43
PM MAIL   Вверх
sgi1981
Дата 4.4.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Скачал новую среду ассемблера

http://fresh.flatassembler.net/files/FreshAlpha114.exe

Редактор лучше.
Но.
Непонимает русских символов раз.
Немогу запустить пошаговую отладку два.

Для пошаговой отладки есть некие отладчики DEBUGGER-ы, где можно скачать дебюггер под XP ?

И что-то надо решать с русскими символами.
Добавлено @ 23:04
И ещё непонимает почему то собственной настройки
Указана папка с включаемыми файлами, но все равно выдает ошибку, что файл не найден.

И ещё курсор невидим до тех пор, пока не выдаст ошибку.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Urff
Дата 4.4.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Привет, ты на оффоруме не в тот подфорум запостил,надо сюда постить про Fresh IDE Development
ник разработчика - decard

Деббагеры можешь под XP найти на www.wasm.ru в разделе инструменты...или я тут могу подвесить пару небольших....

p.s. откуда взял пример, из первого поста?

Это сообщение отредактировал(а) Urff - 4.4.2006, 23:54
PM MAIL   Вверх
sgi1981
Дата 5.4.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10




Цитата(Urff @ 4.4.2006, 23:51)
Привет, ты на оффоруме не в тот подфорум запостил,надо сюда постить про Fresh IDE Development
ник разработчика - decard


Я сразу же и туда запостил.
Я запостил сразу на два форума : в этот и в форум по Fresh.
Чтобы больше ответов было.

Цитата(Urff @ 4.4.2006, 23:51)
Деббагеры можешь под XP найти на www.wasm.ru в разделе инструменты...


Хорошо, посмотрю что там...

Цитата(Urff @ 4.4.2006, 23:51)

p.s. откуда взял пример, из первого поста?


Из книги Виктора Юрова
Assembler Учебник.
Только я переделал ту програмку под синтаксис FASM.
Я долго не мог раздуплиться, каким образом в стек закачивать адреса строк и структур, а оказывается что
идентификатор без прямоугольных скобок - это и есть адрес переменной
идентификатор в прямоугольных скобках - это значение переменной.
Ведь описанные переменные - это ж метки на области памяти в сегменте данных.
А ещё с самого начала я вызывал API функции не так как можно в FASM с помощью invoke,
а с помощью call. Так не знал тогда что в таком случае нужно идентификатор функции тоже в прямоугольных скобках писать, и получалось, что адреса функций были не правильными, а ссылались на область памяти в секции импорта "*.exe" - файла. Естественно, программа запускалась с ошибкой.

Я скачал более совершенную версию ФЛАШ
http://fresh.flatassembler.net/files/FreshAlpha114.exe

Только там в комментариях не отображаются нормально русские символы. Надо что-то решать по ним.

Это сообщение отредактировал(а) sgi1981 - 5.4.2006, 01:25


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Exekutor
Дата 5.4.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Тоже недавно купил книгу Юрова. Потрясающе. Ассемблер - сила. Программирование под виндовс на ассемблере, конечно геморройно, но те плюсы которые оно дает намного превосходят минусы. Для примера. Простое, ничего не делающее окошко, написанное на ассемблере ввесит 7 кб. Такое-же окошко созданное и скомпилированное в Borland C++ 6 - 75 кб.

P.S. никто не знает, где можно скачать редактор ресурсов в виде отдельной проги?

Это сообщение отредактировал(а) Exekutor - 5.4.2006, 09:09


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
sgi1981
Дата 5.4.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Цитата
Тоже недавно купил книгу Юрова. Потрясающе. Ассемблер - сила.

А интересно, какого года выпуска ты купил книгу, потому что у меня книга от 2001 года.
У тебя новее ?

Цитата

.....
Такое-же окошко созданное и скомпилированное в Borland C++ 6 - 75 кб.


Да ты наверно недотянул "малость".

Вообще, если в настройках компиляции проекта в среде Borland C++ Builder 6.0 настроить режим компиляции без использования библиотек времени исполнения, то минимум 440 КБ выходит проект.
Вот проверь :
1) Зайди в пункт меню Project/Options
2) сними галочку на закладке "Packages" с опции "Build with runtime packages"
3) сними галочку на закладке "Linker" с опции "Use dynamic RTL"
4) на закладке "Compiler" нажми кнопку Release, чтобы компилятор не помещал отладочную информацию.
Теперь перекомпилируй и проверь, сколько весит "*.exe".

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

Это сообщение отредактировал(а) sgi1981 - 5.4.2006, 10:42


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Exekutor
Дата 5.4.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



sgi1981,
Я знаю как отключать эти библиотеки. У меня с убраной галочкой окошко получилось размером ровно 76 кб. А. Вот теперь вижу. Packages я не отключал. Что, без них тоже не запустится?


Насчет книжки - не знаю, сейчас на работе. Вечером приду домой - посмотрю.
А как насчет редактора ресурсов?

Это сообщение отредактировал(а) Exekutor - 5.4.2006, 14:38


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
Chingachguk
Дата 5.4.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Цитата

А как насчет редактора ресурсов?


http://www.wasm.ru/toollist.php?list=2



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Exekutor
Дата 5.4.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 1.11.2005
Где: Казахстан. Костан ай

Репутация: нет
Всего: 4



Chingachguk, спасибо!


--------------------
[color=blue][size=2]En taro addun, ma sol larinas[/size][/color]
PM MAIL   Вверх
sgi1981
Дата 5.4.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Цитата(Exekutor @ 5.4.2006, 14:35)
Что, без них тоже не запустится?

НА ЧУЖОЙ МАШИНЕ НЕ ЗАПУСТИТСЯ.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Urff
Дата 5.4.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Хм, у меня учебник Юрова за 1998 год в электронном виде, хотелось бы найти поновее,тоже в электронном.....

По части вопросов про фукции и переменные (не догадываетесь, зачем я так везде спрашиваю описание языка fasm1.65 на русском языке?)

В первую очередь, считаю надо прочесть документацию по языку, я только начинаю программировать и fasm -мой первый язык программирования, посему, счас потихоньку перевожу на русский документацию....

PM MAIL   Вверх
sgi1981
Дата 6.4.2006, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Цитата(Urff @ 5.4.2006, 19:06)
Хм, у меня учебник Юрова за 1998 год в электронном виде

А описание целочисленных команд MMX есть в том учебнике ?
А описание вещественных команд XMM есть в том учебнике ?

У меня это есть.



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.