Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
alanor
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 3
1

Процедура создания окна через WinAPI. Объясните одну деталь

11.12.2014, 00:13. Просмотров 412. Ответов 7
Метки нет (Все метки)

Прошу не закидывать помидорами - я только начал осваивать ASM.
В чём суть. В одной из обучающих статей приведён пример создания окна в среде винды. Всё понятно разьяснено, за исключением одной детали. Привожу код и пояснения.

Код процедуры обработки сообщений окна.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 proc WindowProc hwnd,wmsg,wparam,lparam
push ebx esi edi
cmp [wmsg],WM_DESTROY
je .wmdestroy
.defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp .finish
.wmdestroy:
invoke PostQuitMessage,0
mov eax,0
.finish:
pop edi esi ebx
ret
endp
Меня интересует вот что -
Assembler
1
2
 push ebx esi edi
 pop edi esi ebx
Как бы всё понятно, данные заносятся и извлекаются из стэка. Данное место поясняется - " сохраняем мы содержимое этих регистров, чтобы предотвратить потерю данных: функция DefWindowProc спокойно может затереть содержимое этих регистров.". Что я не могу понять - так это откуда нам известно, что эти переменные - параметры WindowProc попадают именно в эти регистры - и не в какие другие. Это всё делается на FASM.
Товарищи гуру, обьясните, чего я недопонимаю)
Заранее спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2014, 00:13
Ответы с готовыми решениями:

FASM + WinAPI, рисование фона окна
Нужно загрузить картинку из ресурса, и использовать её в качестве фона для...

Как запретить сворачивание окна через WinApi?
Как запретить сворачивание окна через WinApi? Нашёл код Delphi как переписать...

запрос,нужно найти поставляющих одну и ту же деталь
привет всем, помоги сдать лабу по аксессу=) сделаны все запросы кроме...

Подскажите пожалуйста одну деталь по оператору точка
$str .= ' PHP'; Зачем он здесь? Чего с чем происходит конкантекация? Это...

Как объединить детали сборки в одну деталь?
Приветствую! в хелпе по solidworks'у написано что нужно сохранить сборку как...

7
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
11.12.2014, 09:10 2
alanor,

сохранение этих регистров в стек можно вобще удалить.
Они не играют в данном куске кода никакой роли.


alanor,

дай ссылку на эту статью посмотреть.тогда можно что-то конкретно будет говорить.
1
alanor
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 3
11.12.2014, 10:35  [ТС] 3
http://fasm.su/Lessons/03

вот ссылка на урок. Спасибо!) Я и сам проверил , что не будет разницы при их удалении, и всё таки решил уточнить.
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
11.12.2014, 11:19 4
alanor,

Но... Имей ввиду,что после выполнения API ф-ции содержимое регистров может измениться.
как минимум EAX возвращая результат выполнения.Поэтому не стоит удивляться,если вдруг цикл с вызовом какой API становиться бесконечным изменив после выполнения ECX.
0
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,537
11.12.2014, 12:08 5
Цитата Сообщение от Thread Посмотреть сообщение
Имей ввиду,что после выполнения API ф-ции содержимое регистров может измениться
Thread,
содержимое регистров EBX, EDI, ESP, ESI, EBP не изменяться WinAPI-функциями и функциями написанными пользователем так же не должно изменяться, регистры EAX, EDX, ECX используются для возвращения результата из WinAPI-функций и функций написанных пользователем, поэтому использование push ebx esi edi и pop edi esi ebx это "правила хорошего тона" при написании функций под Windows
1
alanor
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 3
11.12.2014, 13:00  [ТС] 6
Mikl___,
Если они не должны изменяться этими функциями - зачем их сохранять в стэк? На всякий случай?
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
11.12.2014, 13:25 7
Mikl___,

Цитата Сообщение от alanor Посмотреть сообщение
Данное место поясняется - " сохраняем мы содержимое этих регистров, чтобы предотвратить потерю данных: функция DefWindowProc спокойно может затереть содержимое этих регистров."
FAIL?

alanor,

Насколько известно мне ,в процедуре окна ,которя являеться callback,можно использовать любой РОН .
при этом нет обходимости заботиться о их восстановлении при выходе.
за исключение регистров ,которые участвуют в создании кадра стека esp,ebp.
0
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,537
11.12.2014, 17:55 8
Цитата Сообщение от alanor Посмотреть сообщение
Mikl___,
Если они не должны изменяться этими функциями - зачем их сохранять в стэк? На всякий случай?
В данном конкретном случае в необходимости сохранения ebx, esi, edi нет, об этом написал Thread, но рассматривай процедуру WindowProc как шаблон куда в дальнейшем ты будешь добавлять свои фрагменты и тогда сохранение содержимого регистров ebx, esi, edi при входе в процедуру и восстановление при выходе из процедуры окажется совсем не лишним. Подробности читай в http://www.cyberforum.ru/assembler-articles/thread751124.html
0
11.12.2014, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2014, 17:55

не могу ни как исправить одну деталь в шаблоне! (блоки)
http://s59.***********/i164/0911/6b/186107b40468t.jpg скачать шаблон или...

Может ли оконная процедура различить, изменён ли размер окна функцией MoveWindow, или мышью за рамку окна?
Стиль WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_THICKFRAME...

Окно: создать 4 окна, в центре каждого из окон вывести номер окна в порядке создания(1-4)
Не могу справиться с программой, Нужно создать 4 окна. В центре каждого из окон...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru