ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠœΠ°ΠΊΡ€ΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π° ассСмблСра Π² Windows

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠœΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ (ΠΈΠ»ΠΈ макросом) называСтся участок ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присвоСно имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ассСмблируСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ассСмблСр встрСчаСт это имя Π² Ρ‚СкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠœΠ°ΠΊΡ€ΠΎΡ начинаСтся Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ MACRO ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ся ENDM. Π’ Ρ‚Π°ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SendMessage добавляСтся символ А, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ANSI-стандарт, символ @ Π² Ρ€ΠΎΠ»ΠΈ раздСлитСля ΠΈ Ρ‡ΠΈΡΠ»ΠΎ N Π² ΠΊΠΎΠ½Ρ†Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ количСство… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠœΠ°ΠΊΡ€ΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π° ассСмблСра Π² Windows (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

1. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

1. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

2. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

3. ОписаниС использованного Π½Π°Π±ΠΎΡ€Π° макросрСдств.

4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹Π΅ константы.

4.1 Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€.

4.2 Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

4.3 ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

5. ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

5.1 Листинг

5.2 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

6. Π’Ρ‹Π²ΠΎΠ΄

2. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ЦСлью курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ являСтся ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ основ программирования Π½Π° 32-Π±ΠΈΡ‚Π½ΠΎΠΌ ассСмблСрС, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠžΠ‘ WINDOWS.

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° макросрСдств ассСмблСра Π² WINDOWS. На ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ описанных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ возмоТности макросрСдств.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ сСбС Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡƒΡΠ»Ρ‹ΡˆΠ°Π²ΡˆΠΈΠΉ ΠΎΠ± Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅, — Π° Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½, собствСнно, Π½ΡƒΠΆΠ΅Π½? ОсобСнно Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° всС ΠΏΠΈΡˆΡƒΡ‚ Π½Π° C/C++, Delphi ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языках высокого уровня? Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° Π‘, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ язык, Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠΉ популярный, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС.

Π˜Ρ‚Π°ΠΊ, Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ ΠΏΠΈΡˆΡƒΡ‚:

Β· всС, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ максимальной скорости выполнСния: основныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ³Ρ€, ядра ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΡ€ΠΎΡΡ‚ΠΎ критичСскиС участки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ;

Β· всС, Ρ‡Ρ‚ΠΎ взаимодСйствуСт с Π²Π½Π΅ΡˆΠ½ΠΈΠΌΠΈ устройствами: Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ, Π·Π²ΡƒΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΏΠ»Π°Ρ‚Π°ΠΌΠΈ;

Β· всС, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ возмоТности процСссора: ядра ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, DPMI-сСрвСры ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, пСрСводящиС процСссор Π² Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ;

Β· всС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ возмоТности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы: вирусы ΠΈ Π°Π½Ρ‚ивирусы, Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ Π½Π΅ΡΠ°Π½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ доступа, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, обходящиС эти Π·Π°Ρ‰ΠΈΡ‚Ρ‹, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ;

Β· ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€ΠΎΠΌ ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅, ΠΊΠ°ΠΊ оказываСтся, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΈΡˆΡƒΡ‚ Π½Π° ΡΠ·Ρ‹ΠΊΠ°Ρ… высокого уровня, Π»ΡƒΡ‡ΡˆΠ΅, ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ Π±Ρ‹ΡΡ‚Ρ€Π΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм написано прСимущСствСнно Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСра. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму Windows нагляднСС ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠΌΠ΅Π½Π½ΠΎ этот язык.

Одно ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… ΠΌΠΎΡ‰Π½Ρ‹Ρ… языковых срСдств ассСмблСра — макроопрСдСлСния.

ΠœΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ (ΠΈΠ»ΠΈ макросом) называСтся участок ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присвоСно имя ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ассСмблируСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ассСмблСр встрСчаСт это имя Π² Ρ‚СкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠœΠ°ΠΊΡ€ΠΎΡ начинаСтся Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ MACRO ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ся ENDM.

НапримСр: ΠΏΡƒΡΡ‚ΡŒ описано ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ hex2ascii, пСрСводящСС ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ число, находящССся Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ AL, Π² ASCII-ΠΊΠΎΠ΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹:

hex2ascii macro

cmp al, 10

sbb al, 69h

das

endm

макросрСда ассСмблСр ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° тСкст БСйчас Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слово hex2ascii, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ это Π±Ρ‹Π»ΠΎ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ слово Π½Π° Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, содСрТащиСся Π² ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ. РазумССтся, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ этот ΠΆΠ΅ участок ΠΊΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ CALL — Ссли ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° вызываСтся большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°, этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°ΠΉΠΌΠ΅Ρ‚ мСньшС мСста, Π½ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ станСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ быстрСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ CALL ΠΈ RET. Однако ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния — Π½Π΅ Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство макросов. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ макроопрСдСлСния ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

Вранслятор ассСмблСра состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй — нСпосрСдствСнно транслятора, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΈ ΠΌΠ°ΠΊΡ€ΠΎΠ°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π° (рис. 1).

Рис. 1. ΠœΠ°ΠΊΡ€ΠΎΠ°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€ Π² ΠΎΠ±Ρ‰Π΅ΠΉ схСмС трансляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° TASM

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ макросрСдств нСявно осущСствляСтся транслятором Π² Π΄Π²Π΅ Ρ„Π°Π·Ρ‹ (рис. 1).

На ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„Π°Π·Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ компилятора, называСмая макроассСмблСром.

На Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°Π·Π΅ трансляции Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСпосрСдствСнно ассСмблСр, Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, содСрТащСго тСкст исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

3. ОписаниС использованного Π½Π°Π±ΠΎΡ€Π° макросрСдств

3.1 ΠŸΡΠ΅Π²Π΄ΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ equ

Π­Ρ‚ΠΎΡ‚ псСвдоопСратор ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для присвоСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ символичСского ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. ВпослСдствии, ΠΊΠΎΠ³Π΄Π° Π² Ρ…ΠΎΠ΄Π΅ трансляции этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ встрСтится Π² Ρ‚Π΅Π»Π΅ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, макроассСмблСр подставит вмСсто Π½Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ выраТСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ константы, ΠΈΠΌΠ΅Π½Π° ΠΌΠ΅Ρ‚ΠΎΠΊ, символичСскиС ΠΈΠΌΠ΅Π½Π° ΠΈ ΡΡ‚Ρ€ΠΎΠΊΠΈ Π² Π°ΠΏΠΎΡΡ‚Ρ€ΠΎΡ„Π°Ρ…. ПослС присвоСния этим конструкциям символичСского ΠΈΠΌΠ΅Π½ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ трСбуСтся Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ конструкции.

3.2 Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° STRUC позволяСт ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅. Π­Ρ‚ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ полями. Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ STRUC опрСдСляСтся шаблон структуры, Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ < > ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ любоС количСство структур. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

STRUC COMPLEX

RE DD ?

IM DD ?

STRUC ENDS

;Π² сСгмСнтС Π΄Π°Π½Π½Ρ‹Ρ…

COMP1 COMPLEX

COMP2 COMPLEX

3.3 УсловноС ассСмблированиС УсловноС ассСмблированиС Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ трансляции ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ участок ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БущСствуСт Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π° условного ассСмблирования.

Π°)

IF Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

ENDIF

Π±)

IF Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

ELSE

ENDIF

Π²)

IF Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 1

ELSEIF Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 2

ELSEIF Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 3

ELSE

ENDIF

УсловиС считаСтся

3.4 ΠœΠ°ΠΊΡ€ΠΎΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΡ

1. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅, Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ число Ρ€Π°Π·. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ°ΠΊΡ€ΠΎΠ΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° REPT. НапримСр:

A EQU 10

REPT 100

DB A

ENDM

Π‘ΡƒΠ΄Π΅Ρ‚ сгСнСрировано 100 Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² DB 10.

2. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° IRP.

IRP ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€,<�список>

ENDM

Π‘Π»ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΡΠΏΠΈΡΠΊΠ΅. НапримСр:

IRP REG,

PUSH REG

ENDM

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… строк:

PUSH EAX

PUSH EBX

PUSH ECX

PUSH EDX

PUSH ESI

PUSH EDI

4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹Π΅ константы

4.1 Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… констант ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€

БообщСния:

WM_SETFOCUS equ 7h — Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, посылаСмоС ΠΎΠΊΠ½Ρƒ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ фокус.

WM_DESTROY equ 2 — Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

WM_CREATE equ 1 — Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ.

WM_PAINT equ 0FH — ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π° ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°.

WM_COMMAND equ 111h — Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, приходящСС Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠΊΠ½Π°, ΠΏΡ€ΠΈ наступлСнии события с ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌ элСмСнтом, ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠΌ мСню, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ Π°ΠΊΡΠ΅Π»Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

WM_SETTEXT equ 0Ch — Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ для посылки тСкстовой строки ΠΎΠΊΠ½Ρƒ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΠΊΠ½Π° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ — Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΊΠ½ΠΎΠΏΠΊΠ° — надпись Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅, ΠΎΠΊΠ½ΠΎ рСдактирования — содСрТимоС этого ΠΎΠΊΠ½Π° ΠΈ Ρ‚. Π΄.).

WM_GETTEXT equ 0Dh — ΠŸΠΎΡΡ‹Π»Π°Π΅Ρ‚ΡΡ ΠΎΠΊΠ½Ρƒ для получСния тСкстовой строки, ассоциированной с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ (строка рСдактирования, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π° ΠΈ Ρ‚. Π΄.).

Π‘Ρ‚ΠΈΠ»ΠΈ ΠΎΠΊΠ½Π°:

CS_VREDRAW equ 1h — ΠŸΠΎΡΡ‹Π»ΠΊΠ° WM_PAINT ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ.

CS_HREDRAW equ 2h — Π Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°.

CS_GLOBALCLASS equ 4000h — Класс ΠΎΠΊΠ½Π°.

WS_OVERLAPPEDWINDOW equ 000CF0000H — Π‘Ρ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π°.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ:

IDI_APPLICATION equ 32 512 — Иконка

IDC_ARROW equ 32 512 — ΠšΡƒΡ€ΡΠΎΡ€

SW_SHOWNORMAL equ 1 — Π Π΅ΠΆΠΈΠΌ

ΠΏΠΎΠΊΠ°Π·Π° ΠΎΠΊΠ½Π°

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹:

WNDCLASS STRUC — Класс ΠΎΠΊΠ½Π°

CLSSTYLE DD? -Π‘Ρ‚ΠΈΠ»ΡŒ ΠΎΠΊΠ½Π°

CLWNDPROC DD? — ΠžΡΠ½ΠΎΠ²Π½Π°Ρ оконная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°

CLSCBCLSEX DD? — ΠŸΡ€ΠΎΡΡ‚ранство для Π΄Π°Π½Π½Ρ‹Ρ…

CLSCBWNDEX DD? — ΠŸΡ€ΠΎΡΡ‚ранство для структур

CLSHINST DD? — ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса

CLSHICON DD? — Π˜ΠΊΠΎΠ½ΠΊΠ°

CLSHCURSOR DD? — ΠšΡƒΡ€ΡΠΎΡ€

CLBKGROUND DD? — Π€ΠΎΠ½

CLMENNAME DD? -Имя ΠΎΠΊΠ½Π°

CLNAME DD? — Π˜ΠΌΡ класса

WNDCLASS ENDS

PAINTSTR STRUC — ΠžΠΊΡ€Π°ΡΠΊΠ° клиСнтской области

hdc DD 0 — Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΠ½Ρ‚Скст устройства

fErase DD 0 — Π‘Ρ‚ΠΈΡ€Π°Ρ‚ΡŒ Π»ΠΈ Ρ„ΠΎΠ½ ΠΏΡ€ΠΈ пСрСрисовкС?

left DD 0 — ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

top DD 0 — Окна для рисования

right DD 0 — ΠŸΡ€Π°Π²Π°Ρ Π³Ρ€Π°Π½ΠΈΡ†Π°

bottom DD 0 — НиТняя Π³Ρ€Π°Π½ΠΈΡ†Π°

fRes DD 0 — Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Windows

fIncUp DD 0 — Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Windows

Reserv DB 32 dup (0) — Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Windows

PAINTSTR ENDS

MSGSTRUCT STRUC — Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° сообщСния

MSHWND DD? — Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠΊΠ½ΠΎ

MSMESSAGE DD? — Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

MSWPARAM DD? — Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

MSLPARAM DD? — Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

MSTIME DD? — Π’рСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния

MSPT DD? — ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ курсора

MSGSTRUCT ENDS

4.2 Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

SetFocus — Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ фокус Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ.

SendMessage — ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ сообщСниС ΠΎΠΊΠ½Ρƒ.

CreateWindow — Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ.

DefWindowProc — ВызываСтся для сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΎΠΊΠ½Π°.

DispatchMessage — Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Windows с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ сообщСния ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ.

ExitProcess — Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ процСсс со Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ (ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ).

GetMessage — ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния.

GetModuleHandle — ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ дСскриптор прилоТСния.

LoadCursor — Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ систСмный курсор ΠΈΠ»ΠΈ курсор, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ рСсурсов.

LoadIcon — Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ ΠΈΠ»ΠΈ ΠΈΠΊΠΎΠ½ΠΊΡƒ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π² Ρ„Π°ΠΉΠ»Π΅ рСсурсов.

PostQuitMessage — ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сообщСниС WM_QUIT.

RegisterClass — Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ класс ΠΎΠΊΠΎΠ½.

ShowWindow — ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ статус ΠΏΠΎΠΊΠ°Π·Π°.

TranslateMessage — Π’Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ сообщСния Π² ASCII-ΠΊΠΎΠ΄Ρ‹.

UpdateWindow — ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°.

BeginPaint — ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ контСкст ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния WM_PAINT

EndPaint — Π£Π΄Π°Π»ΠΈΡ‚ΡŒ контСкст, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ BeginPaint.

TextOut — ВывСсти тСкст Π² ΠΎΠΊΠ½ΠΎ.

SetBkColor — Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° для Π²Ρ‹Π²ΠΎΠ΄Π° тСкста.

InvalidateRect — ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ.

4.3 ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ API Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ способом, схоТим с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π² ΡΠ·Ρ‹ΠΊΠ°Ρ… высокого уровня. Для этого всС ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² ΡΡ‚Π΅ΠΊ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

НапримСр, функция:

SendMessage (

__in HWND hWnd,

__in UINT Msg,

__in WPARAM wParam,

__in LPARAM lParam

);

Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

includelibuser32.lib

EXTERNSendMessageA@16:NEAR

TEXT DB 'Π’Π²Π΅Π΄ΠΈΡ‚Π΅ тСкст', 0

HWNDEDT1 DWORD 0

;

;

PUSH OFFSET TEXT

PUSH 0

PUSH WM_SETTEXT

PUSH HWNDEDT1

CALL SendMessageA@16

Π’ Ρ‚Π°ΠΊΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SendMessage добавляСтся символ А, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ANSI-стандарт, символ @ Π² Ρ€ΠΎΠ»ΠΈ раздСлитСля ΠΈ Ρ‡ΠΈΡΠ»ΠΎ N Π² ΠΊΠΎΠ½Ρ†Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ количСство Π±Π°ΠΉΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, которая пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· стСк.

Π”Π°Π»Π΅Π΅ прСдставим, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

HWND WINAPI SetFocus (

__in_opt HWND hWnd

);

Π’ΠΈΠΏ: HWND

ДСскриптор ΠΎΠΊΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Если этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ NULL, наТатия клавиш ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

HWND WINAPI CreateWindow (

__in_opt LPCTSTR lpClassName,//строка

__in_opt LPCTSTR lpWindowName,//имя окна

__in DWORD dwStyle,//ΡΡ‚ΠΈΠ»ΡŒ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

__in int x,//ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°

__in int y,//ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°

__in int nWidth, //ΡˆΠΈΡ€ΠΈΠ½Π°

__in int nHeight, //высота

__in_opt HWND hWndParent, //ΠΎΠΊΠ½ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° создаваСмого ΠΎΠΊΠ½Π°

__in_opt HMENU hMenu, //ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΌΠ΅Π½ΡŽ

__in_opt HINSTANCE hInstance, //дСскриптор

__in_opt LPVOID lpParam //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

);

LRESULT WINAPI DefWindowProc (

__in HWND hWnd, //дСскриптор ΠΎΠΊΠ½Π°

__in UINT Msg, //сообщСниС

__in WPARAM wParam, //Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация сообщСния

__in LPARAM lParam //Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация сообщСния

);

LRESULT WINAPI DispatchMessage (

__in const MSG *lpmsg //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ сообщСниС

);

VOID WINAPI ExitProcess (

__in UINT uExitCode //ΠΊΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄Π°

);

BOOL WINAPI GetMessage (

__out LPMSG lpMsg, //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° MSG структуру

__in_opt HWND hWnd, //дСскриптор ΠΎΠΊΠ½Π°

__in UINT wMsgFilterMin, // Ρ†Π΅Π»ΠΎΠ΅ число ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… Π½ΠΈΠ·ΠΊΠΈΡ… сообщСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для поиска

__in UINT wMsgFilterMax // Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ самого высокого значСния сообщСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹.

);

HMODULE WINAPI GetModuleHandle (

__in_opt LPCTSTR lpModuleName // имя Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ модуля (Π»ΠΈΠ±ΠΎ DLL ΠΈΠ»ΠΈ EXE-Ρ„Π°ΠΉΠ»), Ссли EXE Ρ„Π°ΠΉΠ» Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π°Π²Π΅Π½ NULL

);

HCURSOR WINAPI LoadCursor (

__in_opt HINSTANCE hInstance, //дСскриптор экзСмпляра модуля

__in LPCTSTR lpCursorName //имя рСсурса курсора для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

);

HICON WINAPI LoadIcon (

__in_opt HINSTANCE hInstance,

__in LPCTSTR lpIconName //имя рСсурса ΠΈΠΊΠΎΠ½ΠΊΠΈ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

);

VOID WINAPI PostQuitMessage (

__in int nExitCode //ΠΊΠΎΠ΄ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ

);

ATOM WINAPI RegisterClass (

__in const WNDCLASS *lpWndClass //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° WINDCLASS структуры

);

BOOL WINAPI ShowWindow (

__in HWND hWnd, //дСскриптор ΠΎΠΊΠ½Π°

__in int nCmdShow //ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΊΡ€Π°Π½Π΅

);

BOOL WINAPI TranslateMessage (

__in const MSG *lpMsg //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° MSG структуру

);

BOOL UpdateWindow (

__in HWND hWnd //обращаСтся ΠΊ ΠΎΠΊΠ½Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ

);

HDC BeginPaint (

__in HWND hwnd, //обращаСтся ΠΊ ΠΎΠΊΠ½Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ

__out LPPAINTSTRUCT lpPaint //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° PAINTSTRUCT структуру

);

BOOL EndPaint (

__in HWND hWnd, //дСскриптор ΠΎΠΊΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΎ

__in const PAINTSTRUCT *lpPaint // ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° PAINTSTRUCT структуру

);

BOOL TextOut (

__in HDC hdc, //дСскриптор контСкста устройств

__in int nXStart, //ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π₯

__in int nYStart, //ΠΊΠΎΠΎΡ€Π΄Π°Π½Π°Ρ‚Π° Y

__in LPCTSTR lpString, //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ

__in int cchString //Π΄Π»ΠΈΠ½Π° строки

);

COLORREF SetBkColor (

__in HDC hdc, //дСскриптор контСкста устройств

__in COLORREF crColor //Π½ΠΎΠ²Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ RGB макрос

);

BOOL InvalidateRect (

__in HWND hWnd, //дСскриптор ΠΎΠΊΠ½Π°

__in const RECT *lpRect, //ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° RECT структуру

__in BOOL bErase //ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Ρ„ΠΎΠ½ Π²Π½ΡƒΡ‚Ρ€ΠΈ области

);

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ структуры. Π’Π°ΠΊ, структурС:

typedef struct tagMSG { // msg

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

БоотвСтствуСт ΠΊΠΎΠ΄:

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCT ENDS

typedef struct tagWNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS, *PWNDCLASS;

БоотвСтствуСт ΠΊΠΎΠ΄:

WNDCLASS STRUC

CLSSTYLE DD ?

CLWNDPROC DD ?

CLSCBCLSEX DD ?

CLSCBWNDEX DD ?

CLSHINST DD ?

CLSHICON DD ?

CLSHCURSOR DD ?

CLBKGROUND DD ?

CLMENNAME DD ?

CLNAME DD ?

WNDCLASS ENDS

typedef struct tagPAINTSTRUCT { // ps

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT;

БоотвСтствуСт ΠΊΠΎΠ΄:

PAINTSTR STRUC

hdc DWORD 0

fErase DWORD 0

left DWORD 0

top DWORD 0

right DWORD 0

bottom DWORD 0

fRes DWORD 0

fIncUp DWORD 0

Reserv DB 32 dup (0)

PAINTSTR ENDS

5. ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

5.1 Листинг:

Π€Π°ΠΉΠ» edit. inc:

; константы

WM_SETFOCUS equ 7h

; сообщСниС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΎΠΊΠ½Π°

WM_DESTROY equ 2

; сообщСниС ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈ содании ΠΎΠΊΠ½Π°

WM_CREATE equ 1

; сообщСниС, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит с ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π½Π° ΠΎΠΊΠ½Π΅

WM_COMMAND equ 111h

; сообщСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ элСмСнту строку

WM_SETTEXT equ 0Ch

WM_PAINT equ 0FH

; сообщСниС, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строку

WM_GETTEXT equ 0Dh

; ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠ²

RED equ 49

GREEN equ 106

BLUE equ 197

RGBW equ 195 shl 13

RGBT equ 0; Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ

; свойства ΠΎΠΊΠ½Π°

CS_VREDRAW equ 1h

CS_HREDRAW equ 2h

CS_GLOBALCLASS equ 4000h

WS_OVERLAPPEDWINDOW equ 000CF0000H

STYLE equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

; CS_HREDRAW equ 2h

BS_DEFPUSHBUTTON equ 1h

WS_VISIBLE equ 1 000 0000h

WS_CHILD equ 4 000 0000h

WS_BORDER equ 80 0000h

WS_TABSTOP equ 1 0000h

STYLBTN equ WS_CHILD + BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP

STYLEDT equ WS_CHILD + WS_VISIBLE + WS_BORDER + WS_TABSTOP

; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ стандартной ΠΈΠΊΠΎΠ½ΠΊΠΈ

IDI_APPLICATION equ 32 512

; ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ курсора

IDC_ARROW equ 32 512 ;

; Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠΊΠ°Π·Π° ΠΎΠΊΠ½Π° — Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ

SW_SHOWNORMAL equ 1

; ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

EXTERN SetFocus@4:NEAR

EXTERN SendMessageA@16:NEAR

EXTERN MessageBoxA@16:NEAR

EXTERN CreateWindowExA@48:NEAR

EXTERN DefWindowProcA@16:NEAR

EXTERN DispatchMessageA@4:NEAR

EXTERN ExitProcess@4:NEAR

EXTERN GetMessageA@16:NEAR

EXTERN GetModuleHandleA@4:NEAR

EXTERN LoadCursorA@8:NEAR

EXTERN LoadIconA@8:NEAR

EXTERN PostQuitMessage@4:NEAR

EXTERN RegisterClassA@4:NEAR

EXTERN ShowWindow@8:NEAR

EXTERN TranslateMessage@4:NEAR

EXTERN UpdateWindow@4:NEAR

EXTERN BeginPaint@8:NEAR

EXTERN EndPaint@8:NEAR

EXTERN TextOutA@20:NEAR

EXTERN GetStockObject@4:NEAR

EXTERN CreateSolidBrush@4:NEAR

EXTERN SetBkColor@8:NEAR

EXTERN SetTextColor@8:NEAR

EXTERN InvalidateRect@12:NEAR

; структуры

; структура сообщСния

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCT ENDS

;——структура класса ΠΎΠΊΠΎΠ½

WNDCLASS STRUC

CLSSTYLE DD ?

CLWNDPROC DD ?

CLSCBCLSEX DD ?

CLSCBWNDEX DD ?

CLSHINST DD ?

CLSHICON DD ?

CLSHCURSOR DD ?

CLBKGROUND DD ?

CLMENNAME DD ?

CLNAME DD ?

WNDCLASS ENDS

PAINTSTR STRUC

hdc DWORD 0

fErase DWORD 0

left DWORD 0

top DWORD 0

right DWORD 0

bottom DWORD 0

fRes DWORD 0

fIncUp DWORD 0

Reserv DB 32 dup (0)

PAINTSTR ENDS

Π€Π°ΠΉΠ» edit. asm:

.386P

; плоская модСль

.MODEL FLAT, stdcall

include qq. inc

; ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

includelib user32. lib ;ΠœΠΎΠ΄ΡƒΠ»ΡŒ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса

includelib kernel32. lib ;ΠœΠΎΠ΄ΡƒΠ»ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΠ΄Ρ€ΠΎΠΌ ОБ

includelib gdi32. lib ;ΠœΠΎΠ΄ΡƒΠ»ΡŒ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ графичСского интСрфСйса

;—————————————————————————————-;

; сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ…

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

NEWHWND DD 0 ;хэндлСр ΠΎΠΊΠ½Π°

MSG MSGSTRUCT

WC WNDCLASS

PNT PAINTSTR

HINST DD 0; дСскриптор прилоТСния

TITLENAME DB 'Macro Assembler', 0

CLASSNAME DB 'CLASS32', 0

CPBUT DB 'ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ', 0

CPBUT1 DB 'ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ 20 Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ REPT', 0

CPEDT DB ' ', 0

CLSBUTN DB 'BUTTON', 0

CLSEDIT DB 'EDIT', 0

TMP DB 0

HWNDBTN DWORD 0

HWNDBTN1 DWORD 0

HWNDEDT DWORD 0

HWNDEDT1 DWORD 0

XT DWORD 10

YT DWORD 90

TEXT DB 'Π’Π²Π΅Π΄ΠΈΡ‚Π΅ тСкст', 0

DB 50 DUP (0); ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π°

TEXTM DB 'Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° 10 Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ REPT', 0

DB 50 DUP (0); ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π°

_DATA ENDS

; сСгмСнт ΠΊΠΎΠ΄Π°

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ дСскриптор прилоТСния

PUSH 0

CALL GetModuleHandleA@4; Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор модуля, содСрТащСго Ρ‚ΠΈΠΏ, прСдставлСнный Π΄Π°Π½Π½Ρ‹ΠΌ экзСмпляром

MOV [HINST], EAX

REG_CLASS: ;рСгистрация класса ΠΎΠΊΠ½Π°

; Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ структуру ΠΎΠΊΠ½Π°

; ΡΡ‚ΠΈΠ»ΡŒ

MOV [WC.CLSSTYLE], STYLE

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

MOV [WC.CLWNDPROC], OFFSET WNDPROC

MOV [WC.CLSCBCLSEX], 0

MOV [WC.CLSCBWNDEX], 0

MOV EAX, [HINST]

MOV [WC.CLSHINST], EAX

;————— ΠΈΠΊΠΎΠ½ΠΊΠ° ΠΎΠΊΠ½Π°

PUSH IDI_APPLICATION

PUSH 0

CALL LoadIconA@8 ;Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠΊΠΎΠ½ΠΊΡƒ

MOV [WC.CLSHICON], EAX

;————— курсор ΠΎΠΊΠ½Π°

PUSH IDC_ARROW

PUSH 0

CALL LoadCursorA@8 ;Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ курсор

MOV [WC.CLSHCURSOR], EAX

;————-;

MOV [WC.CLBKGROUND], 28; Ρ†Π²Π΅Ρ‚ ΠΎΠΊΠ½Π°

MOV DWORD PTR [WC.CLMENNAME], 0

MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME

PUSH OFFSET WC

CALL RegisterClassA@4 ;РСгистрируСт класс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ конструктором, с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ интСрфСйса

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ зарСгистрированного класса

PUSH 0

PUSH [HINST]

PUSH 0

PUSH 0

PUSH 600; DY — высота ΠΎΠΊΠ½Π°

PUSH 1200; DX — ΡˆΠΈΡ€ΠΈΠ½Π° ΠΎΠΊΠ½Π°

PUSH 100; Y — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π°

PUSH 100; X — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΡƒΠ³Π»Π°

PUSH WS_OVERLAPPEDWINDOW

PUSH OFFSET TITLENAME; имя окна

PUSH OFFSET CLASSNAME; имя класса

PUSH 0

CALL CreateWindowExA@48

; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ

CMP EAX, 0

JZ _ERR

MOV [NEWHWND], EAX; дСскриптор ΠΎΠΊΠ½Π°

PUSH SW_SHOWNORMAL

PUSH [NEWHWND]

CALL ShowWindow@8; ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ созданноС ΠΎΠΊΠ½ΠΎ

;—————————————————————————————-;

PUSH [NEWHWND]

CALL UpdateWindow@4; ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ

; Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°, сообщСниС WM_PAINT

; Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний

MSG_LOOP:

PUSH 0

PUSH 0

PUSH 0

PUSH OFFSET MSG

CALL GetMessageA@16 ;ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

CMP EAX, 0 ;Ссли Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡ€ΠΈΡˆΠ΅Π» ноль, Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

JE END_LOOP

PUSH OFFSET MSG

CALL TranslateMessage@4

PUSH OFFSET MSG

CALL DispatchMessageA@4

JMP MSG_LOOP

END_LOOP:

; Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ процСсс)

PUSH [MSG.MSWPARAM]

CALL ExitProcess@4

_ERR:

JMP END_LOOP

;—————- функция опрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ строки ———————————-;

; Π΄Π»ΠΈΠ½Π° строки

; [EBP+08H] - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ

LENSTR PROC

PUSH EBP

MOV EBP, ESP

PUSH ESI

MOV ESI, DWORD PTR [EBP+8]

XOR EBX, EBX

LBL1:

CMP BYTE PTR [ESI], 0

JZ LBL2

INC EBX

INC ESI

JMP LBL1

LBL2:

POP ESI

POP EBP

RET 4

LENSTR ENDP

; ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠΊΠ½Π°

; располоТСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΡΡ‚Π΅ΠΊΠ΅

; [EBP+014Н]; LPARAM

; [EBP+10H]; WAPARAM

; [EBP+0CH]; MES

; [EBP+8]; HWND

WNDPROC PROC

PUSH EBP

MOV EBP, ESP

; PUSH EBX

; PUSH ESI

; PUSH EDI

IRP REG,; ΠΌΠ°ΠΊΡ€ΠΎΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ IRP

PUSH REG

ENDM

CMP DWORD PTR [EBP+0CH], WM_DESTROY

JE WMDESTROY

CMP DWORD PTR [EBP+0CH], WM_CREATE

JE WMCREATE

CMP DWORD PTR [EBP+0CH], WM_PAINT

JE WMPAINT

CMP DWORD PTR [EBP+0CH], WM_COMMAND

JE WMCOMMND

JMP DEFWNDPROC

WMCOMMND:

MOV EAX, HWNDBTN

CMP DWORD PTR [EBP+14H], EAX; опрСдСляСм Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° «Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ 1»

JNE BUTT1

; ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку

PUSH OFFSET TEXT

PUSH 150

PUSH WM_GETTEXT

PUSH HWNDEDT

CALL SendMessageA@16; ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ эту строку

; Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку тСкстовоС ΠΏΠΎΠ»Π΅ HWNDEDT1

PUSH OFFSET TEXT

PUSH 0

PUSH WM_SETTEXT

PUSH HWNDEDT1

CALL SendMessageA@16

JMP NODESTROY

BUTT1:

MOV EAX, HWNDBTN1

CMP DWORD PTR [EBP+14H], EAX; опрСдСляСм Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° «Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ 2»

JNE NODESTROY

PUSH [NEWHWND]

PUSH 0

PUSH 0

CALL InvalidateRect@12; ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСрисовка ΠΎΠΊΠ½Π°

.IF TMP==0; ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ условий пСрСрисовки ΠΎΠΊΠ½Π°

MOV TMP, 1

.ELSE

MOV TMP, 0

.ENDIF

JMP NODESTROY

NODESTROY:

MOV EAX, 0

JMP FINISH

WMPAINT:

PUSH OFFSET PNT

PUSH DWORD PTR [EBP+08H]

CALL BeginPaint@8

PUSH EAX; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ контСкст (дСскриптор)

;———————— Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° = Ρ†Π²Π΅Ρ‚ ΠΎΠΊΠ½Π°

PUSH RGBW

PUSH EAX

CALL SetBkColor@8

;———————— контСкст

POP EAX

PUSH EAX

;———————— Ρ†Π²Π΅Ρ‚ тСкста

PUSH RGBT

PUSH EAX

CALL SetTextColor@8

POP EAX

.IF TMP==1; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° условия прорисовки тСкста ΠΏΠΎ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ 2

REPT 20; ΠΌΠ°ΠΊΡ€ΠΎΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ REPT

PUSH EAX

;———————— вывСсти тСкст

PUSH OFFSET TEXT

CALL LENSTR; Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ опрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ сообщСния

PUSH EBX; Π΄Π»ΠΈΠ½Π° строки

PUSH OFFSET TEXT; адрСс строки

ADD YT, 20

PUSH YT; Y

PUSH XT; X

PUSH EAX; контСкст ΠΎΠΊΠ½Π°

CALL TextOutA@20

POP EAX

ENDM

.ENDIF

MOV YT, 90

PUSH OFFSET PNT

PUSH DWORD PTR [EBP+08H]

CALL EndPaint@8

MOV EAX, 0

JMP FINISH

WMCREATE:

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ-ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅1»

PUSH 0

PUSH [HINST]

PUSH 0

PUSH DWORD PTR [EBP+08H]

PUSH 20; DY

PUSH 300; DX

PUSH 10; Y

PUSH 10; X

PUSH STYLBTN

PUSH OFFSET CPBUT; имя окна

PUSH OFFSET CLSBUTN; имя класса

PUSH 0

CALL CreateWindowExA@48

MOV HWNDBTN, EAX; Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ дСскриптор ΠΊΠ½ΠΎΠΏΠΊΠΈ

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ-ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅2»

PUSH 0

PUSH [HINST]

PUSH 0

PUSH DWORD PTR [EBP+08H]

PUSH 20; DY

PUSH 300; DX

PUSH 85; Y

PUSH 10; X

PUSH STYLBTN

PUSH OFFSET CPBUT1; имя окна

PUSH OFFSET CLSBUTN; имя класса

PUSH 0

CALL CreateWindowExA@48

MOV HWNDBTN1, EAX; Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ дСскриптор ΠΊΠ½ΠΎΠΏΠΊΠΈ

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ рСдактирования1

PUSH 0

PUSH [HINST]

PUSH 0

PUSH DWORD PTR [EBP+08H]

PUSH 20; DY

PUSH 300; DX

PUSH 40; Y

PUSH 10; X

PUSH STYLEDT

PUSH OFFSET CPEDT; имя окна

PUSH OFFSET CLSEDIT; имя класса

PUSH 0

CALL CreateWindowExA@48

MOV HWNDEDT, EAX

; ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ рСдактирования 2

PUSH 0

PUSH [HINST]

PUSH 0

PUSH DWORD PTR [EBP+08H]

PUSH 20; DY

PUSH 300; DX

PUSH 60; Y

PUSH 10; X

PUSH STYLEDT

PUSH OFFSET CPEDT; имя окна

PUSH OFFSET CLSEDIT; имя класса

PUSH 0

CALL CreateWindowExA@48

MOV HWNDEDT1, EAX

;————- ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ строку Π² ΠΎΠΊΠ½ΠΎ рСдактирования

PUSH OFFSET TEXT

PUSH 0

PUSH WM_SETTEXT

PUSH HWNDEDT

CALL SendMessageA@16

;————- ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ фокус Π½Π° ΠΎΠΊΠ½Π΅ рСдактирования

PUSH HWNDEDT

CALL SetFocus@4

;—————————————————————————————-;

MOV EAX, 0

JMP FINISH

DEFWNDPROC:

PUSH DWORD PTR [EBP+14H]

PUSH DWORD PTR [EBP+10H]

PUSH DWORD PTR [EBP+0CH]

PUSH DWORD PTR [EBP+08H]

CALL DefWindowProcA@16; вызываСтся ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ,

;Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ любого сообщСния ΠΎΠΊΠ½Π°,

;ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚

JMP FINISH

WMDESTROY:

PUSH 0

CALL PostQuitMessage@4; сообщСниС WM_QUIT

MOV EAX, 0

FINISH:

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

_TEXT ENDS

END START

5.2 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

6. Π’Ρ‹Π²ΠΎΠ΄

Π’ Ρ…ΠΎΠ΄Π΅ выполнСния курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½Ρ‹ основы программирования Π½Π° 32-Π±ΠΈΡ‚Π½ΠΎΠΌ ассСмблСрС. Π˜Π·ΡƒΡ‡Π΅Π½Ρ‹ макросрСдства. БоставлСна ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСра для 32 разрядных микропроцСссоров сСмСйства Intel, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ макросрСдств Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π΅.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ