Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/56: Рейтинг темы: голосов - 56, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 05.02.2019
Сообщений: 48
FASM

Внутренности кода на Ассемблере (оконное приложение)

07.02.2019, 13:46. Показов 10885. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, объясните пожалуйста...нужно разобраться с выданным кодом, и переделать программу...мне интересно разобраться, что, где, как...

сам код:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
format PE GUI 4.0                                                ; 32-разрЯдное оконное приложение WINDOWS EXE
entry start                                                      ; точка входа
 
include 'include\win32a.inc'
 
ID_CAPTION = 101                                                 ; идентификаторы текстовых полей ввода и кнопок
ID_MESSAGE = 102
ID_OK = 103
ID_CANCEL = 104
 
section '.text' code readable executable                         ; секциЯ кода
 
  start:
        invoke GetModuleHandle,0                                     ; получить уникальный идентификатор активного программного модулЯ
        invoke DialogBoxParam,eax,0,HWND_DESKTOP,DialogProc,0        ; запустить цикл обработки сообщений для сктивного программного модулЯ
        or eax,eax                                                   ; если диалог вернул 1 то...
        jz exit
        invoke MessageBox,HWND_DESKTOP,message,caption,0             ; ...вывести сообщение
  exit:
        invoke ExitProcess,0                                         ; завершить выполнение программы
 
proc DialogProc hwnddlg,msg,wparam,lparam                        ; оконнаЯ функциЯ обработки сообщений
        push ebx esi edi
        cmp     [msg],WM_INITDIALOG                                      ; сообщение предшествующее оторажению окна
        je      .wminitdialog
        cmp     [msg],WM_COMMAND                                         ; сообщение отправлЯемое при нажатии на кнопки, меню и т.п.
        je      .wmcommand
        cmp     [msg],WM_CLOSE                                           ; сообщение отправлЯемое перед закрытием окна
        je      .wmclose
        xor     eax,eax                                                  ; если сообщение не обработано возвращаем 0
        jmp     .finish
  .wminitdialog:
        jmp     .processed
  .wmcommand:
        cmp     [wparam],BN_CLICKED shl 16 + ID_CANCEL                   ; если нажата кнопка CANCEL
        je      .wmclose
        cmp     [wparam],BN_CLICKED shl 16 + ID_OK                       ; если нажата кнопка OK
        jne     .processed
        invoke GetDlgItemText,[hwnddlg],ID_CAPTION,caption,40h       ; получение текста заголовка
        invoke GetDlgItemText,[hwnddlg],ID_MESSAGE,message,100h      ; получение текста сообщениЯ
        invoke EndDialog,[hwnddlg],1                                 ; закрыть окно и вернуть вызвавшей программе 1
        jmp     .processed
  .wmclose:
        invoke EndDialog,[hwnddlg],0                                 ; закрыть окно и вернуть вызвавшей программе 0
  .processed:
        mov     eax,1                                                    ; если сообщение обработано возвращаем 1
  .finish:
        pop     edi esi ebx
        ret
endp
 
section '.bss' readable writeable                                ; секциЯ данных
 
  caption rb 40h                                                 ; строки длЯ хранениЯ заголовка и сообщения
  message rb 100h
 
section '.idata' import data readable writeable                  ; секциЯ импортируемых функций
 
  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'
 
  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess'
 
  import user,\
         DialogBoxParam,'DialogBoxParamA',\
         GetDlgItemText,'GetDlgItemTextA',\
         MessageBox,'MessageBoxA',\
         EndDialog,'EndDialog'
 
section '.rsrc' resource data readable                           ; секциЯ объЯвлениЯ ресурсов
 
  directory RT_DIALOG,dialogs
 
  resource dialogs,0,LANG_ENGLISH+SUBLANG_DEFAULT,demonstration
 
  dialog demonstration,'Lab6 example',70,70,190,105,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
    dialogitem 'STATIC','&Caption:',-1,10,10,70,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_CAPTION,10,20,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP
    dialogitem 'STATIC','&Message:',-1,10,40,70,8,WS_VISIBLE
    dialogitem 'EDIT','',ID_MESSAGE,10,50,170,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
    dialogitem 'BUTTON','OK',ID_OK,85,80,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
    dialogitem 'BUTTON','C&ancel',ID_CANCEL,135,80,45,15,WS_VISIBLE+WS_TABSTOP+BS_PUSHBUTTON
  enddialog
интересно вот что:

для чего нужны идентификаторы, и как они тут используются?

как понимать эту строчку: (почему она вот именно такая?)
Assembler
1
 cmp     [wparam],BN_CLICKED shl 16 + ID_CANCEL
как понимать это чудо? (я думал что это область в памяти по адресам 40h и 100h, но по запросу пишет что это функции ввода\вывод )
Assembler
1
2
caption rb 40h
message rb 100h
Почему C&ancel с амперсандом?

заранее спасибо ^^
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2019, 13:46
Ответы с готовыми решениями:

Внутренности кода
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hasan1 { class Program ...

Оконное приложение
Здравствуйте, мне необходимо перевести консольную программу в оконное приложение (в окне имеются: 2 StringGrid, 2 Edit(A,B), Button...

Оконное приложение
И снова здравствуйте. Изучаю С++, только в самом начале. Консольные приложения - это круто, но порою надоедает. Насколько сложно делать...

9
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
07.02.2019, 14:12
Лучший ответ Сообщение было отмечено AgonMountain как решение

Решение

Цитата Сообщение от AgonMountain Посмотреть сообщение
Почему C&ancel с амперсандом?
Потому что когда будет нажата клавиша "Alt" те буквы перед которыми стоит амперсант окажутся подчеркнутыми
Цитата Сообщение от AgonMountain Посмотреть сообщение
caption rb 40h
message rb 100h
под строку "caption" выделяется 64 байта, под строку "message" выделено 256 байт, rb это сокращение reserve byte, есть еще rw, rd, rt
Цитата Сообщение от AgonMountain Посмотреть сообщение
как понимать эту строчку: (почему она вот именно такая?)
cmp [wparam],BN_CLICKED shl 16 + ID_CANCEL
Находятся ли в переменной wparam в разрядах с 31 по 16 значение BN_CLICKED, а в разрядах с 15 по 0 значение ID_CANCEL ?
Цитата Сообщение от AgonMountain Посмотреть сообщение
для чего нужны идентификаторы, и как они тут используются?
Чтобы отличать от какого элемента управления "кнопки", "окна редактирования", "списков" пришел отклик, или с каким из элементов должна работать программа. Представь что у тебя 30 оловянных (одинаковых) солдатиков. Как ты их будешь различать? По индексам (номерам)...
2
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
07.02.2019, 14:26
Лучший ответ Сообщение было отмечено AgonMountain как решение

Решение

AgonMountain, поехали по-порядку:
1) Каждый орган управления окна имеет, как handle, так и идентификатор, некое, заранее указанное программистом число.
Если описатель может меняться от запуска к запуску, то идентификатор окна всегда одно и то же.
Его удобно использовать для однозначной идентификации окна. Т.е. получив этот код, сразу знаем, что общаемся именно с этим окном.
2) Строка
Assembler
1
 cmp     [wparam],BN_CLICKED shl 16 + ID_CANCEL
как раз и показывает, как это используется...
В сообщении WM_COMMAND в параметре wparam в старшем слове приходит код нотификации (оповещения). В данном случае, BN_CLICKED, что говорит, что была нажата кнопка. А какая кнопка - указано в младшем слове, в данном случае, проверяем на ID кнопки ID_CANCEL. У какой кнопки какой ID указано в ресурсах.
3)
Assembler
1
2
caption rb 40h
message rb 100h
Здесь выделяется память указанного размера под строки, которые считываются из двух редакторов.
4)И, наконец, амперсанды служат для указания, какие буковки (вместе с клавишей Alt) будут использованы для быстрого переноса фокуса ввода и нажатия (в случае кнопки).
Нажмите на Alt, и увидите, как соответствующие буковки станут подчеркнутыми

Добавлено через 59 секунд
Mikl___, опоздал немного...
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
07.02.2019, 14:33
Лучший ответ Сообщение было отмечено AgonMountain как решение

Решение

Цитата Сообщение от liv Посмотреть сообщение
Mikl___, опоздал немного...
Нормально, ответы дополняют друг друга, а AgonMountain, необходимо с сайта https://flatassembler.net/ скачать документацию по синтаксису ассемблера. На русском то же самое есть в закрепленных темах Мануал по flat assembler
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
07.02.2019, 14:47
Лучший ответ Сообщение было отмечено AgonMountain как решение

Решение

AgonMountain, рекомендую также ознакомиться с принципами программирования на WinAPI
Мне в свое время чрезвычайно сильно помогла книга Петзольда.
Там на С и писалась во времена Win95. Но актуальна до сих пор.
Programming Windows 95. Part I.pdf
Programming Windows 95. Part II.pdf
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
07.02.2019, 14:52
liv,
похоже, что мы зря сотрясаем воздух, AgonMountain или не видит наши ответы, или считает, что ответ будет ударом по его репутации
0
0 / 0 / 0
Регистрация: 05.02.2019
Сообщений: 48
07.02.2019, 14:55  [ТС]
...да, нас знакомят с этим в универе...будто "блинчики" по воде пускают, мол вот такое есть, вот вам маленький кусочек... разбирайтесь сами

Добавлено через 1 минуту
все вижу, все читаю ^^...долго осознание полученной информации доходит)
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
07.02.2019, 14:59
Хорошие книжки: Чарлз Калверт "Освой самостоятельно программирование в Windows за 21 день" и Герберт Шилдт "Программирование на C и C++ для Windows 95"
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
07.02.2019, 15:38
ещё хорошая дока именно по фасму: Норсеев С.А. Разработка оконных приложений на FASMе
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
07.02.2019, 15:48
  1. Документация по fasm (flat assembler) [english] (примерно то же самое есть в архиве самого fasm [PDF]
  2. русский перевод версии 1.71 от Dm808 (html-архив)
  3. русский перевод версии 1.64 от Paranoik
Кроме книжки о которой написал R71MT, ищи книги того же автора
  1. Норсеев С.А. "Шпаргалка Windows API. Объекты user и gdi"
  2. Норсеев С.А. "Шпаргалка Windows API. Макросы и типы данных"
  3. Норсеев С.А. "Шпаргалка Windows API. Элементы управления"
Вложения
Тип файла: zip B101.zip (806.6 Кб, 42 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2019, 15:48
Помогаю со студенческими работами здесь

Оконное приложение
Добрый день! Помогите, пожалуйста. Вроде много везде написано. Но мне непонятно. Как сделать оконное приложение на Python'е? Можно...

Оконное приложение g++
Как на g++ писать оконные приложения?

Оконное приложение
Напишите код для простейшего оконного приложения на сложение a и b (с комментариями)

Оконное приложение на с++
Здравствуйте. Такой вопрос: можно ли создать оконное приложения на чистых плюсах (ну там типа стандартные библиотеки и т.п.)ю Есть...

Оконное приложение на C++
Товарищи программисты, помогите пожалуйста перейти с делфи на с++. Для начала хочется создать оконную программу с картинкой и кнопкой. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru