Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Flat Assembler 1.64. ΠœΠ°Π½ΡƒΠ°Π» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅Ρ€Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 7

Автор Tomasz Grysztar

Β«forwardΒ», Β«reverseΒ» ΠΈ Β«commonΒ» дСлят ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π½Π° Π±Π»ΠΎΠΊΠΈ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… обрабатываСтся послС окончания ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. Они Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли макроинструкция ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠΏΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π‘Π»ΠΎΠΊ инструкций, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° Β«forwardΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π΄ΠΎ послСднСй, ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Π±Π΅Π· этих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²). Π‘Π»ΠΎΠΊ, ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ Π·Π° Β«reverseΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС β€” ΠΎΡ‚ послСднСй Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ. Π‘Π»ΠΎΠΊ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Β«commonΒ» обрабатываСтся лишь ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, просто для всСх Π³Ρ€ΡƒΠΏΠΏ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ имя, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅, доступно Π²ΠΎ всСх ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ… ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Если ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² Π±Π»ΠΎΠΊΠ΅ Β«commonΒ», ΠΎΠ½ΠΎ доступно Π²ΠΎ всСх ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠ°Ρ…, нСзависимо ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ макроинструкции, которая создаСт Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ адрСсов строк ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° Π½ΠΈΠΌΠΈ строк.

macro strtbl name,[string]

{

 common

 label name dword

 forward

 local label

 dd label

 forward

 label db string,0

}

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ этой макроинструкции, станСт ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ адрСсов, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ строки. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π»ΠΎΠΊ обрабатываСтся ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΈ опрСдСляСт ΠΌΠ΅Ρ‚ΠΊΡƒ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π»ΠΎΠΊ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΈ опрСдСляСт запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, содСрТащий адрСс этой строки. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π±Π»ΠΎΠΊ опрСдСляСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ.

ΠŸΠ΅Ρ€Π²Π°Ρ инструкция, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊ Π² макроинструкции, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ с Π½Π΅ΠΉ Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС, ΠΊΠ°ΠΊ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

macro stdcall proc,[arg]

{

 reverse push arg

 common call proc

}

Π­Ρ‚ΠΎ макрос ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ соглашСниС STDCALL, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² стСкС Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. НапримСр, Β«stdcall foo,1,2,3Β» Π±ΡƒΠ΄Π΅Ρ‚ ассСмблировано Ρ‚Π°ΠΊ:

push 3

push 2

push 1

call foo

Если Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ имя Π²Π½ΡƒΡ‚Ρ€ΠΈ макроинструкции ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (это Π»ΠΈΠ±ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки, Π»ΠΈΠ±ΠΎ локальноС имя, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² Π±Π»ΠΎΠΊΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Β«forwardΒ» ΠΈΠ»ΠΈ Β«reverseΒ») ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π±Π»ΠΎΠΊΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Β«commonΒ», ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° всС значСния, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ запятыми. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ макрос ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ макроинструкции Β«stdcallΒ»:

macro invoke proc,[arg]

{ common stdcall [proc],arg }

Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для нСпрямого Π²Ρ‹Π·ΠΎΠ²Π° (Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² памяти) ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ соглашСниС STDCALL.

Π’Π½ΡƒΡ‚Ρ€ΠΈ макроинструкции Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«#Β». Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сцСпляСт Π΄Π²Π° ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ дСлаСтся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° свои значСния. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ макроинструкция Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ условный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² зависимости ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Β«condΒ»:

macro jif op1,cond,op2,label

{

 cmp op1,op2

 j#cond label

}

НапримСр, Β«jif ax,ae,10h,exitΒ» Π±ΡƒΠ΄Π΅Ρ‚ ассСмблировано ΠΊΠ°ΠΊ инструкции Β«cmp ax,10hΒ» ΠΈ Β«jae exitΒ».

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«#Β» ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для объСдинСния Π΄Π²ΡƒΡ… строк, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Π² строку Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Β«`Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π²Π½ΡƒΡ‚Ρ€ΠΈ макроинструкции. Он ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π·Π° Π½ΠΈΠΌ имя Π² строку, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡƒΡŽ Π² скобки, Π½ΠΎ ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ссли Π·Π° Π½ΠΈΠΌ слСдуСт Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ замСняСтся Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, содСрТащСС большС, Ρ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ символ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Β«`Β» ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символ, ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ нСпосрСдствСнно Π·Π° Π½ΠΈΠΌ. Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этих Π΄Π²ΡƒΡ… свойств:

macro label name

{

 label name

 if ~ used name

  display `name # "is defined but not used.",13,10

 end if

}

Если ΠΌΠ΅Ρ‚ΠΊΠ°, опрСдСлСнная Ρ‚Π°ΠΊΠΈΠΌ макросом, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅, ΠΎΠ½ извСстит вас ΠΎΠ± этом сообщСниСм, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ, ΠΊ ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅ это относится.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Π²Π΅Π΄ΡƒΡ‰ΡƒΡŽ сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли это строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния Β«eqtypeΒ». Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π³ΠΎ использования для отдСлСния строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

macro message arg

{

 if arg eqtype ""

  local str

  jmp @f

  str db arg,0Dh,0Ah,24h

  @@:

  mov dx,str

 else

  mov dx,arg

 end if

 mov ah,9

 int 21h

}

Π’Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ макрос создан для ΠΏΠΎΠΊΠ°Π·Π° сообщСний Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… DOS. Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ этого макроса Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ число, ΠΌΠ΅Ρ‚ΠΊΠ° ΠΈΠ»ΠΈ пСрСмСнная, показываСтся строка ΠΈΠ· этого адрСса, Π½ΠΎ Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” это строка Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…, Ρ‚ΠΎ созданный ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π΅Ρ‘ послС … ΠΈ … .

Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ макроинструкции, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ макрос ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π½ΠΎ с Ρ‚Π°ΠΊΠΈΠΌΠΈ опрСдСлСниями Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, вызванная Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π½Π°ΠΊ Β«}Β» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ макроинструкции, ΠΎΠ½ всСгда ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† Π΅Π³ΠΎ опрСдСлСния. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΌΠ΅ΡˆΠ°ΡŽΡ‰ΠΈΡ… символов. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ подстановки ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ большС ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… слэшСй ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ символами (Π΄Π°ΠΆΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π·Π½Π°ΠΊΠ°ΠΌΠΈ). ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π²ΠΈΠ΄ΠΈΡ‚ эту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ символ, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚Π°ΠΊΠΎΠΉ символ Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ макроса, ΠΎΠ½ ΠΎΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ слэши с Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Π°. НапримСр, Β«\{Β» трактуСтся ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ символ, Π½ΠΎ Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ макроса ΠΎΠ½ станСт символом Β«\{Β». Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

macro ext instr

{

 macro instr op1,op2,op3

 \{

  if op3 eq

   instr op1,op2

  else

   instr op1,op2

   instr op2,op3

  end if

 \}

}

ext add

ext sub

ΠœΠ°ΠΊΡ€ΠΎΡ Β«extΒ» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, символы Β«\{Β» ΠΈ Β«\}Β» становятся Β«{Β» ΠΈ Β«}Β». Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ³Π΄Π° обрабатываСтся Β«ext addΒ», содСрТаниС макроса становится Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ макроинструкции, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ опрСдСляСтся макрос Β«addΒ». Π’Π°ΠΊ ΠΆΠ΅ Β«ext subΒ» опрСдСляСт макрос Β«subΒ». ИспользованиС символа Β«\{Β» Π½Π΅ Π±Ρ‹Π»ΠΎ здСсь Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π½ΠΎ сдСлано Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π±ΠΎΠ»Π΅Π΅ ясным.

Если Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, спСцифичСскиС для макроинструкций, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Β«localΒ» ΠΈΠ»ΠΈ Β«commonΒ», Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ макросС, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΌ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ символа большС Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ слэшСм Ρ‚Π°ΠΊ ΠΆΠ΅ поддСрТиваСтся, это позволяСт Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ мноТСствСнныС ΡƒΡ€ΠΎΠ²Π½ΠΈ влоТСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ макросов.

Другая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° опрСдСлСния макроинструкций Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… состоит Π² использовании Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Β«fixΒ», которая становится ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ макрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π±Π΅Π· Π΅Π³ΠΎ закрытия. НапримСр:

macro tmacro params

{

macro params {

}

MACRO fix tmacro

ENDM fix }

опрСдСляСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ синтаксис опрСдСлСния макросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выглядит ΠΊΠ°ΠΊ:

MACRO stoschar char

mov al,char

stosb

ENDM

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ создано с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Β«fixΒ», Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ процСссор ΠΈΡ‰Π΅Ρ‚ Π·Π½Π°ΠΊ Β«}Β» Π²ΠΎ врСмя опрСдСлСния макроса, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ константы Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°! ΠœΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ссли трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ задания Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ опрСдСлСния, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Ρ‚Π°ΠΊΠΈΡ… случаях ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ. А ΠΈΠΌΠ΅Π½Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ, ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ сразу послС символа Β«}Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π±Ρ‹Π»Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС.

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

Β«strucΒ» β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Β«macroΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния структур Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ Β«strucΒ», ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΡΡ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ (ΠΊΠ°ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ опрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ…). Π­Ρ‚Π° ΠΌΠ΅Ρ‚ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ присоСдинСна ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с Ρ‚ΠΎΡ‡ΠΊΠΈ, Π² содСрТании макроинструкции. ΠœΠ°ΠΊΡ€ΠΎΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ, опрСдСлСнная с использованиСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Β«strucΒ», ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ имя, ΠΊΠ°ΠΊ макросы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ с использованиСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Β«macroΒ». Бтруктурная макроинструкция Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ макросу, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌΡƒΡΡ Π±Π΅Π· ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ВсС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ свойства, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ стандартных макросов, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ ΠΊ структурным макроинструкциям.