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

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ компилятора

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

Достоинство чистого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°: отсутствиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… дСйствий для трансляции ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ, Π² Ρ‚ΠΎΠΌ числС Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. НСдостаток — ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. А ΡΠ²ΠΎΠΉΡΡ‚Π²ΠΎ чистого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎ ошибки Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ компилятора (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Расчёт Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° задания Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ОписаниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ ассСмблСра Π’Ρ‹Π±ΠΎΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° построСния ассСмблСра, описаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Ρ‚Π°Π±Π»ΠΈΡ† Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Алгоритм Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ компилятора Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Основной Ρ†Π΅Π»ΡŒΡŽ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ являСтся созданиС ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π‘ΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» (COM ΠΈΠ»ΠΈ EXE). ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π΅Ρ‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСниС осущСствляСт транслятор, поэтому Π΅Π³ΠΎ программная рСализация Ρ‚Π°ΠΊΠΆΠ΅ являСтся Ρ†Π΅Π»ΡŒΡŽ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Вранслятор — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ (Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ) языкС Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ Π΅ΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ (Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ) языкС.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ транслятор выступаСт ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ прСдлоТСния Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½Ρ‹Π΅ ΠΈΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, само слово «Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ‚ΠΎΡ€» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ».

Вранслятор ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСт Ρ‚Π°ΠΊΠΆΠ΅ диагностику ошибок, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ словари ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², Π²Ρ‹Π΄Π°Ρ‘Ρ‚ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ тСксты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ‚. Π΄.

Π―Π·Ρ‹ΠΊ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдставлСна входная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, называСтся исходным языком, Π° ΡΠ°ΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° — исходным ΠΊΠΎΠ΄ΠΎΠΌ. Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ язык называСтся Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ языком ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

Врансляторы ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚:

β€’ Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ использованиС языка программирования Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ раздСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

β€’ БинтаксичСски-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ (синтаксичСски-управляСмый). ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ описаниС синтаксиса ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠΈ языка ΠΈ Ρ‚Скст Π½Π° ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Ρ‚ранслируСтся Π² ΡΠΎΠΎΡ‚вСтствии с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ описаниСм.

β€’ ΠžΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΉ. Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ просмотр исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

β€’ ΠœΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΉ. Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ просмотров исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

β€’ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ. ВыполняСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° Π² ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.

β€’ ВСстовый. Набор ΠΌΠ°ΠΊΡ€ΠΎΠΊΠΎΠΌΠ°Π½Π΄ языка ассСмблСра, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, составлСнных Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСра.

β€’ ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ. Для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ языкС программирования.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции состоит ΠΈΠ· Π΄Π²ΡƒΡ… основных этапов? Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΈΠ½Ρ‚Π΅Π·Π° (рис. 1).

На ΡΡ‚Π°ΠΏΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° распознаСтся тСкст исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ся Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π° являСтся Π½Π΅ΠΊΠΎΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, понятноС компилятору.

На ΡΡ‚Π°ΠΏΠ΅ синтСза ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ прСдставлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², получаСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

Π’ ΡΠΎΡΡ‚Π°Π²Π΅ компилятора присутствуСт Ρ‡Π°ΡΡ‚ΡŒ, отвСтствСнная Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΈΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ошибок. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ошибок Π² Ρ‚СкстС исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ максимально ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ ошибки ΠΈ ΠΌΠ΅ΡΡ‚Π΅ Π΅Ρ‘ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·. Π­Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ компилятора выполняСт сканСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π»ΠΈΡ‚Π΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (символы) Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ языкС ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ ΠΈΠ· Π½ΠΈΡ… слова (лСксСмы) исходного языка. На Π²Ρ…ΠΎΠ΄Π΅ сканСра (лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°) тСкст исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, выходная информация пСрСдаётся для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° ΡΡ‚Π°ΠΏ синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π°.

БинтаксичСский Ρ€Π°Π·Π±ΠΎΡ€? это основная Ρ‡Π°ΡΡ‚ΡŒ компилятора Π½Π° ΡΡ‚Π°ΠΏΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°. Π—Π΄Π΅ΡΡŒ Π² Ρ‚СкстС исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ синтаксичСскиС конструкции. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, провСряСтся синтаксичСская ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Рис. 1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ основных Ρ„Π°Π· компиляции:

БСмантичСский Π°Π½Π°Π»ΠΈΠ·? это Ρ‡Π°ΡΡ‚ΡŒ компилятора, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ тСкста исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния сСмантики Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°? Π½Π° ΡΡ‚ΠΎΠΉ Ρ„Π°Π·Π΅ компилятор выполняСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ дСйствия, нСпосрСдствСнно связанныС с ΡΠΈΠ½Ρ‚Π΅Π·ΠΎΠΌ тСкста Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: идСнтификация элСмСнтов языка, распрСдСлСниС памяти ΠΈ Ρ‚. ΠΏ. Π­Ρ‚Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ тСкста Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ языкС.

ГСнСрация ΠΊΠΎΠ΄Π°? это Ρ„Π°Π·Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ нСпосрСдствСнно ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ прСдлоТСния Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка ΠΈ Ρ‚Скст Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ†Π΅Π»ΠΎΠΌ. Π€Π°Π·Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° основная Π½Π° ΡΡ‚Π°ΠΏΠ΅ синтСза Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠšΡ€ΠΎΠΌΠ΅ этого, гСнСрация ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΡΠ΅Π±Ρ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ? это процСсс, связанный с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΡƒΠΆΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Ρ‘Π½Π½ΠΎΠ³ΠΎ тСкста ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ сущСствСнноС влияниС Π½Π° ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² — это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ… исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для пороТдСния тСкста Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ компиляции Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, константах, функциях ΠΈ Ρ‚. ΠΏ. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ состав Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² зависит ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка программирования.

Достоинство компилятора: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ Ρ‚рСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. БоотвСтствСнно, Π½Π΅ Ρ‚рСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ компилятора Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компилируСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. НСдостаток: ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ этап компиляции замСдляСт написаниС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ Π·Π°Ρ‚рудняСт исполнСниС Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ…, нСслоТных ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π’ ΡΠ»ΡƒΡ‡Π°Π΅ Ссли исходный язык являСтся языком ассСмблСра (Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ языком, Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ языку), Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ языка называСтся ассСмблСром.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ — ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° исполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±Π΅Π· трансляции. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Ρ†ΠΈΠΊΠ» Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ-исполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π½Π° ΡΠ·Ρ‹ΠΊΠ°Ρ… высокого уровня, Π° Π½Π΅ с ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ. Π’Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ создаёт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ язык. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ называСтся чистой ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ. Чистая интСрпрСтация примСняСтся ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для языков с ΠΏΡ€ΠΎΡΡ‚ΠΎΠΉ структурой (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΠŸΠ› ΠΈΠ»ΠΈ Лисп). Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² ΡΠΊΡ€ΠΈΠΏΡ‚Π°Ρ… Π² UNIX ΠΈΠ»ΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… (.bat) Π² MS-DOS Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чистой ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ.

Достоинство чистого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°: отсутствиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… дСйствий для трансляции ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠΈ, Π² Ρ‚ΠΎΠΌ числС Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. НСдостаток — ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС, Π³Π΄Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. А ΡΠ²ΠΎΠΉΡΡ‚Π²ΠΎ чистого ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, Ρ‡Ρ‚ΠΎ ошибки Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (ΠΈΠ»ΠΈ строки) с ΠΎΡˆΠΈΠ±ΠΊΠΎΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ нСдостатком, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΡΡ‚оинством.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ компромиссныС ΠΌΠ΅ΠΆΠ΄Ρƒ компиляциСй ΠΈ Ρ‡ΠΈΡΡ‚ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языков программирования, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ транслируСт Π΅Ρ‘ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ язык (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ p-ΠΊΠΎΠ΄), Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎΠ± ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ со Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹ΠΌ транслятором). Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ называСтся смСшанной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ смСшанной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языка ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Perl. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сочСтаСт ΠΊΠ°ΠΊ достоинства компилятора ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° (большая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ исполнСния ΠΈ ΡƒΠ΄ΠΎΠ±ΡΡ‚Π²ΠΎ использования), Ρ‚Π°ΠΊ ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΠΊΠΈ (для трансляции ΠΈ Ρ…ранСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌ языкС Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСсурсы; для исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ прСдставлСн ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€). Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ компилятора, смСшанная рСализация Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм исходный ΠΊΠΎΠ΄ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π» ошибок (лСксичСских, синтаксичСских ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ичСских).

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

Достоинством динамичСской компиляции являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ становится сравнимой со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… языках, ΠΏΡ€ΠΈ этом сама ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° хранится ΠΈ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚раняСтся Π² Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, нСзависимом ΠΎΡ‚ Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ. НСдостатком являСтся большая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ΅ трСбования ΠΊ Ρ€Π΅ΡΡƒΡ€ΡΠ°ΠΌ, Ρ‡Π΅ΠΌ Π² ΡΠ»ΡƒΡ‡Π°Π΅ простых компиляторов ΠΈΠ»ΠΈ чистых ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ².

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. БоотвСтствСнно, динамичСская компиляция появилась ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ся Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡΡ… Java,.NET Framework, Perl, Python.

Расчёт Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° задания

Расчёт задания для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ΄Ρ‘Ρ‚ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅:

(1)

Π“Π΄Π΅: NG — послСдниС Π΄Π²Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹ ΡƒΡ‡Π΅Π±Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ студСнта, NS — Π½ΠΎΠΌΠ΅Ρ€ студСнта Π² ΡΠΏΠΈΡΠΊΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹, KV — количСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄.

Π’ΠΎΠ³Π΄Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:

Β· ((83+9) mod 12) = 8;

Β· ((83+9) mod 15) = 2;

Β· ((83+9) mod 10) = 2;

Β· ((83+9) mod 8) = 4;

Β· ((83+9) mod 6) = 2.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄: NOP, JG, ADD, ROR, DEC. Π’Π°ΠΊ ΠΆΠ΅ Π½Π°ΠΌ понадобятся ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ MOV, INT.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

.286

datasegment

a1dw 1001h

a2 dw 100h

a3 dw 101h

c dw 4c00h

data ends

code segment

assume ds: data, cs: code

main:

mov ax, a1

add ax, 101h

dec a3

ror ax, 5h

jg @2

nop

@2:

mov ax, c

int 21h

code ends

end main

Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· ошибок компилируСтся ΠΈ Π»ΠΈΠ½ΠΊΡƒΠ΅Ρ‚ся стандартными компиляторами ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°ΠΌΠΈ.

ОписаниС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ ассСмблСра

транслятор ассСмблСр компилятор

— r8, r16, r32 — ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±Π°ΠΉΡ‚, слово ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово;

— m8, m16, m32 — ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±Π°ΠΉΡ‚, слово ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово;

— i8, i16, i32 — нСпосрСдствСнный ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±Π°ΠΉΡ‚, слово ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово;

— a8, a16, a32 — ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ адрСс (смСщСниС) Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°;

Π’Ρ‹Π±ΠΎΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° построСния ассСмблСра, описаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†

MOV:

ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ слово ΠΌΠ΅ΠΆΠ΄Ρƒ рСгистрами ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ рСгистром ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ нСпосрСдствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ ΠΈΠ»ΠΈ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Команда MOV Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя адрСсами памяти (для этой Ρ†Π΅Π»ΠΈ слуТит ΠΊΠΎΠΌΠ°Π½Π΄Π° MOVS).

ADD:

DEC:

ROR:

JG:

NOP:

INT:

Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, ComCtrls, Menus, math;

type

Directive = record //запись — Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

part1:string;

part2:string;

part3:string;

MashCode:string;

exist:boolean; //ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° описана ΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‘тся

end;

Command = record //запись — ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

mark:string;

oper:string;

arg1:string;

arg2:string;

MashCode:string;

ByteLen:string;

exist:boolean; //ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ описан ΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‘тся

end;

Prog = record

isCodeSeg:boolean; //Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сСгмСнта ΠΊΠΎΠ΄Π°

isDataSeg:boolean; //Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…

end;

TForm1 = class (TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

Label4: TLabel;

Code: TMemo;

marks: TStringGrid;

Title: TMemo;

CodeSeg: TMemo;

DataSeg: TMemo;

EndFile: TMemo;

MainMenu1: TMainMenu;

Program1: TMenuItem;

Exit1: TMenuItem;

exeAll: TButton;

CreateObjFile: TButton;

Varibles: TStringGrid;

ScrollBar1: TScrollBar;

DataSourceSeg: TMemo;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

markslinks: TStringGrid;

GroupBox1: TGroupBox;

ComBytePosMemo: TMemo;

MashCode: TMemo;

Label1: TLabel;

Label3: TLabel;

SaveMenu: TMenuItem;

ClearCodeButton: TButton;

Edit1: TEdit;

TranslAndSaveMenu: TMenuItem;

NewProgramButton: TButton;

OpenDialog1: TOpenDialog;

Memo1: TMemo;

SaveDialog1: TSaveDialog;

procedure NewProgramButtonClick (Sender: TObject); //ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅

procedure TranslAndSaveMenuClick (Sender: TObject);//ΠœΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ трансляция

procedure ClearCodeButtonClick (Sender: TObject);//ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΊΠΎΠ΄Π°

procedure CreateObjFileClick (Sender: TObject);//ВычислСниС сСгмСнтов Π΄Π°Π½Π½Ρ‹Ρ…

procedure exeAllClick (Sender: TObject);//Врансляция ΠΊΠΎΠ΄Π°

procedure Exit1Click (Sender: TObject);//Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

procedure FormCreate (Sender: TObject);

//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ

function GerArgType (arg:string):string;//ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°

function IsVar (arg:string):boolean;//пСрСмСнная

function isImm (arg:string):boolean; //число

function isData (str:string):boolean;//[si+n]

function isReg (arg:string):boolean; //рСгистр 16

//рассчСт ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Π°

function insRegMul (mem:string; arg: string; koef: integer):string;

function insReg (mem:string; arg: string):string;

function InvertBytes (s:string):string;

function ImmToHex (imm:string;len:string):string;

function cnvData (dat:string):string;

function AddControlByte (s:string):string;

function HexByteToByte (s:string):byte;

function CharToByte (C:char):byte;

function NexStrToStr (nexstr:string):string;

function IntToHexStr (int:integer):string;

function AnalysisCommand (comstr:string):command;

function ComNext: string;

function ComRead: string;

function ComIs: string;

function DeleteSpace (str:string):string;

function DecompositeCommand (comstr:string):Command;

function ModifyMarkAdress: string;

procedure AddLinksInMarkers;

procedure MarkTableWrite (Mname, LBytepos, CBytepos, Strpos: string);

procedure MarksLinksTableWrite (Mname, LBytepos: string);

procedure ComExe;

function AnalysisDirective (DrcStr:string):directive;

function DecompositeDirective (DrcStr:string):directive;

procedure DataTableWrite (Varible:string; Len: string;Code:string);

function GetVarCodeByName (name:string):string;

//ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ

procedure SlideDown;

procedure SlideUp;

procedure ScrollBar1Change (Sender: TObject);

//Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅

procedure CodeDblClick (Sender: TObject);

procedure SaveMenuClick (Sender: TObject);

procedure WriteHexStr (ss:string);//запись строки Π² Ρ„Π°ΠΉΠ»

//ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈΠ· Ansi Π² hex

function StrToHexStr (str:string):string;

function StrDelSpaseHex (s:string):string;

private

{ Private declarations }

public

{ Public declarations }

end;

//Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

var

Form1: TForm1;

ThisProgram:Prog; //ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ сСгмСнтов)

Reg16,Reg8:arrayofstring; //динамичСский список ΠΈΠΌΠ΅Π½ рСгистров (нумСрация для ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄ΠΎΠ²)

ComReadPos:integer; //cчСтчик команд

ComBytePos:integer; //cчСтчик байтов

DataBytes:integer; //для формирования сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…

ErrorControl:string; //для хранСния ошибки

VariableAdr:string; //для формирования Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ссылок

RegLen:string; //Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° рСгистра ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

VarLen:string; //Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

VarCode:string; //Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

FileSave:file of byte;//Ρ„Π°ΠΉΠ» с ΠΊΠΎΠ΄ΠΎΠΌ

FileLoad:textfile;//Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»

implementation

{$R *.dfm}

//Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Ρƒ Π½ΠΎΠΌΠ΅Ρ€ Ρ€eгистра*k, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅: ('A0' + 'cx' = 'A1')

function TForm1. insRegMul (mem:string; arg: string; koef: integer):string;

var pos: integer; intcode: integer;

begin

IsReg (arg);

pos:=0;

intcode:=ord (NexStrToStr (mem)[1]); //16-Ρ‹ΠΉ ΠΊΠΎΠ΄ — строка (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'A0') пСрСводится Π² Ρ†Π΅Π»ΠΎΠ΅ число

//ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° рСгистра:

if (RegLen='R16') then for pos:=0 to length (Reg16) do if arg=Reg16[pos] then break;

if (RegLen='R8') then for pos:=0 to length (Reg8) do if arg=Reg8[pos] then break;

intcode:=intcode+pos*koef; //Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ рСгистра ΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Ρƒ

mem:=IntToHex (intcode, 2); //ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² 16-Ρ‹ΠΉ ΠΊΠΎΠ΄ — строку

insRegMul:=mem;

end;

//Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Ρƒ Π½ΠΎΠΌΠ΅Ρ€ Ρ€eгистра, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅: ('A0' + 'cx' = 'A1')

function TForm1. insReg (mem:string; arg: string):string;

var pos: integer; intcode: integer;

begin

isReg (arg);

pos:=0;

intcode:=ord (NexStrToStr (mem)[1]); //16-Ρ‹ΠΉ ΠΊΠΎΠ΄ — строка (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'A0') пСрСводится Π² Ρ†Π΅Π»ΠΎΠ΅ число

//ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° рСгистра:

if (RegLen='R16') then for pos:=0 to length (Reg16) do if arg=Reg16[pos] then break;

if (RegLen='R8') then for pos:=0 to length (Reg8) do if arg=Reg8[pos] then break;

edit1.Text:=edit1.Text+'$pos='+inttostr (pos);

intcode:=intcode+pos; //Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ рСгистра ΠΊ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Ρƒ

mem:=IntToHex (intcode, 2); //ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² 16-Ρ‹ΠΉ ΠΊΠΎΠ΄ — строку

insReg:=mem;

end;

function TForm1. StrToHexStr (str:string):string; //ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ тСкста Π² ΡΡ‚Ρ€ΠΎΠΊΡƒ Π² ΠΊΠΎΠ΄ 16 с/c

var pos: integer; hexstr: string;

begin

hexstr:='';

for pos:=1 to length (str) do hexstr:=hexstr+IntToHex (ord (str[pos]), 2);

StrToHexStr:=hexstr;

end;

procedure TForm1. SlideDown;

begin

Code.Perform (WM_VSCROLL, SB_LINEDOWN, 1);

MashCode.Perform (WM_VSCROLL, SB_LINEDOWN, 1);

ComBytePosMemo.Perform (WM_VSCROLL, SB_LINEDOWN, 1);

end;

procedure TForm1. SlideUp;

begin

Code.Perform (WM_VSCROLL, SB_LINEUP, 1);

MashCode.Perform (WM_VSCROLL, SB_LINEUP, 1);

ComBytePosMemo.Perform (WM_VSCROLL, SB_LINEUP, 1);

end;

procedure TForm1. TranslAndSaveMenuClick (Sender: TObject);

begin

ExeAll.Click; //транслированиС всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

CreateObjFile.Click; //Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

SaveMenu.Click; //сохранСниС

end;

functionTForm1.GetVarCodeByName (name:string):string; //ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π²Π·ΡΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

var row: integer; adrs: string;

begin

adrs:='';

for row:=1 to Varibles. RowCount-1 do if Varibles. Cells[0,row]=name then begin GetVarCodeByName:=Varibles.Cells[1,row]; VarLen:=Varibles.Cells[3,row];exit;end;

ErrorControl:='<�НСобъяв. ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½.>';

end;

procedure TForm1. DataTableWrite (Varible:string; Len: string;Code:string); //запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

varrow:integer;

begin

//ComBytePos глобальная пСрСмСнная — счСтчик Π±Π°ΠΉΡ‚ΠΎΠ² для записи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Π½Ρ‹Ρ…

Varibles.RowCount:=Varibles.RowCount+1;

row:=Varibles.RowCount-1;

Varibles.Cells[0,row]: =Varible;

Varibles.Cells[1,row]:=IntToHex (DataBytes, 4);

Varibles.Cells[2,row]:=Code;

if Len='db' then Begin

DataBytes:=DataBytes+1;

Varibles.Cells[3,row]: ='V8';

end;

if Len='dw' then Begin

DataBytes:=DataBytes+2;

Varibles.Cells[3,row]: ='V16';

end;

end;

function TForm1. DecompositeDirective (DrcStr:string):directive;

varpos:integer;

begin

//Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния

DecompositeDirective.part1:='';

DecompositeDirective.part2:='';

DecompositeDirective.part3:='';

//установка ограничСния для строки-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹

DrcStr:=DrcStr+' ';

//1)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части:

for pos:=1 to length (DrcStr) do if DrcStr[pos]=' ' then begin

DecompositeDirective.part1:=copy (DrcStr, 1, pos-1);

Delete (DrcStr, 1, pos);

Break;

end;

//2)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части:

for pos:=1 to length (DrcStr) do if DrcStr[pos]=' ' then begin

DecompositeDirective.part2:=copy (DrcStr, 1, pos-1);

Delete (DrcStr, 1, pos);

Break;

end;

//3)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ части:

for pos:=1 to length (DrcStr) do if DrcStr[pos]=' ' then begin

DecompositeDirective.part3:=copy (DrcStr, 1, pos-1);

Delete (DrcStr, 1, pos);

Break;

end;

end;

function TForm1. AnalysisDirective (DrcStr:string):directive;

var drc: directive;

begin

drc:=DecompositeDirective (DrcStr);

with drc do BEGIN

exist:=false;

//dd, dw

if (part1<>'') and ((part2='dw')or (part2='db')) and isImm (part3) then begin

MashCode:=ImmToHex (part3,part2);

DataTableWrite (part1,part2,MashCode);

exist:=true;

end;

//dd, dw Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

if ((part1='dd')or (part1='dw')) and isImm (part2) then begin

MashCode:=ImmToHex (part2,part1);

DataTableWrite ('', part1, MashCode);

exist:=true;

end;

if (part1='masm') then exist:=true;

if (part1='.code') then exist:=true;

if (part1='.data') then exist:=true;

if (part1='.model') and (part2='small')then exist:=true;

if (part1='.stack') then exist:=true;

if (part1='.286') then exist:=true;

if (part1='end') then exist:=true;

if (part1='data') and (part2='segment') then exist:=true;

if (part1='data') and (part2='ends') then exist:=true;

if (part1='code') and (part2='segment') then exist:=true;

if (part1='code') and (part2='ends') then exist:=true;

if (part1='assume') then exist:=true;

if (part1='ends') then exist:=true;

if (part1='end') and (part2='main') then exist:=true;

END;

AnalysisDirective:=drc;

end;

procedure TForm1. ComExe; //транслированиС строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

varcom:command; //ΠΊΠΎΠΌΠ°Π½Π΄Π° записанная Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ записи — ΠΊΠΎΠΌΠ°Π½Π΄Π°

drc:directive; //Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° записанная Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ записи — Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°

comstr:string; //ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² Ρ‚Скстовом Π²ΠΈΠ΄Π΅

pos:integer;

begin

//Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строк Π² Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ счСтчик, ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΈ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…

MashCode.Lines.Add ('');

ComBytePosMemo.Lines.Add ('');

//ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ-пустоту ΠΈΠ»ΠΈ строку — сплошной ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ:

//.Ссли встрСчаСтся такая строка, Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

comstr:=ComRead;

//Ссли строка Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ:

if length (comstr)>=1 then begin

pos:=1; while (comstr[pos]=' ')and (pos

if comstr[pos]=';' then exit;

end;

//Ссли строка являСтся пустой:

if comstr='' then exit;

ComBytePosMemo.Lines[ComReadPos]: =IntToHex (ComBytePos, 4);

//ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ — ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

com:=AnalysisCommand (comstr);

MashCode.Lines[ComReadPos]: =com.MashCode;

if com. ByteLen<>'' then ComBytePos:=ComBytePos + strtoint (com.ByteLen);

//ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ — Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²

drc:=AnalysisDirective (ComRead);

//MashData.Lines[ComReadPos]: =drc.MashCode;

//——————————————————————————————————————->

//выявлСниС ошибок Π² ΡΠΈΠ½Ρ‚аксисС:

ifcom.MashCode<>'' thencom. exist:=true; //Ссли Π΅ΡΡ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ распознан

if (notcom.exist) and (notdrc.exist) //Ссли Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°, Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π½Ρ‹ Ρ‚ΠΎ:

then MashCode. Lines[ComReadPos]: ='<�НСизв. ком.>';

//Π°Π½Π°Π»ΠΈΠ· сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…:

if ErrorControl<>'' then MashCode. Lines[ComReadPos]: =ErrorControl;

ErrorControl:=''; //стираниС сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

//——————————————————————————————————————->

end;

procedure TForm1. MarksLinksTableWrite (Mname, LBytepos: string);

varrow:integer;

begin

//поиск Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ срСди ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…

row:=1; while (row<=markslinks.RowCount-1) do begin

if markslinks. Cells[0,row]=Mname then begin

//Ссли поиск ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ — Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ ошибки (ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ описаниС ссылки ΠΌΠ΅Ρ‚ΠΊΠΈ)

ErrorControl:='<οΏ½ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€. ΠΌΠ΅Ρ‚ΠΊΠΈ>';

exit;

end;

inc (row);

end;

//Ссли вносимой ссылки Π½Π΅Ρ‚ — Ρ‚ΠΎ Π²Π½Π΅ΡΡ‚ΠΈ Π΅Ρ‘

markslinks.RowCount:=row+1; //row ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

if Mname <>'' then markslinks. Cells[0,row]: =Mname;

if LBytepos<>'' then markslinks. Cells[1,row]: =LBytepos;

markslinks.FixedRows:=1; //Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

end;

procedure TForm1. MarkTableWrite (Mname, LBytepos, CBytepos, Strpos: string);

var row: integer;

begin

//Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ссылки ΠΌΠ΅Ρ‚ΠΊΠΈ:

ifLBytepos<>'' thenbegin

//Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ ссылок

row:=1; while (row<=marks.RowCount-1) do begin

if marks. Cells[0,row]=Mname then if LBytepos<>'' then

marks.Cells[1,row]: =LBytepos;

inc (row);

end;

end;

//Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΊΡƒ

if CBytepos<>'' then begin

marks.RowCount:=marks.RowCount+1;

marks.FixedRows:=1;

row:=marks.RowCount-1;

if Mname <>'' then marks. Cells[0,row]: =Mname;

if CBytepos<>'' then marks. Cells[2,row]: =CBytepos;

if Strpos <>'' then marks. Cells[3,row]: =Strpos;

exit;

end;

end;

function TForm1. ModifyMarkAdress:string; //расчСт смСщСний ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡ… Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°

var row, l: integer;

begin

for row:=1 to marks. RowCount-1 do begin

if MashCode. Lines[strtoint (marks.Cells[3,row])]='E8' then l:=4

else l:=2;

if (marks.Cells[0,row]<>'')and (marks.Cells[2,row]<>'') then begin

if (strtoint (marks.Cells[1,row])

MashCode.Lines[strtoint (marks.Cells[3,row])]: =

MashCode.Lines[strtoint (marks.Cells[3,row])]+

InvertBytes (IntToHex (256-(strtoint (marks.Cells[2,row])-strtoint (marks.Cells[1,row])), l)); end

else

MashCode.Lines[strtoint (marks.Cells[3,row])]: =

MashCode.Lines[strtoint (marks.Cells[3,row])]+

InvertBytes (IntToHex (strtoint (marks.Cells[1,row])-strtoint (marks.Cells[2,row]), l));

end;

end;

procedure TForm1. AddLinksInMarkers; //Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ссылок Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠ΅Ρ‚ΠΎΠΊ

var row: integer;

begin

row:=1; while row<=markslinks.RowCount do begin

MarkTableWrite (markslinks.Cells[0,row], markslinks. Cells[1,row],'','');

inc (row);

end;

end;

function TForm1. IntToHexStr (int:integer):string; //ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π² ΡΡ‚Ρ€ΠΎΠΊΡƒ — 16-ΡƒΡŽ запись этого числа

var res: string;

begin

res:=IntToHex (int, 2);

while length (res)>2 do delete (res, 1,1);

IntToHexStr:=res;

end;

function TForm1. DecompositeCommand (comstr:string):Command;

var posi: integer; oper, mark, arg1, arg2:string;

begin

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

mark:='';

oper:='';

arg1:='';

arg2:='';

//для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² «mark:movax, bx; comments» =ΠΌΠ΅Ρ‚ΠΊΠ° + ΠΊΠΎΠΌΠ°Π½Π΄Π° с Π΄Π²ΡƒΠΌΡ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ + ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

// «movax, bx» =ΠΊΠΎΠΌΠ°Π½Π΄Π° с Π΄Π²ΡƒΠΌΡ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ

// «incax» =ΠΊΠΎΠΌΠ°Π½Π΄Π° с ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ

// «aam» =ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²

//Ссли строка являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ

if length (comstr)>=1 then begin

posi:=1; while (comstr[posi]=' ')and (posi

if comstr[posi]=';' then comstr:='';

end;

//установка ограничСния для строки-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

comstr:=comstr+' ';

//Π·Π°ΠΌΠ΅Π½Π° раздСлитСля коммСнтария (символ ';') Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π»

posi:=pos (';', comstr); if posi>0 then comstr[posi]: =' ';

//1)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ

for posi:=1 to length (comstr) do if comstr[posi]=':' then begin

mark:=copy (comstr, 1, posi-1);

Delete (comstr, 1, posi);

Break;

end;

//2)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

for posi:=1 to length (comstr) do if comstr[posi]=' ' then begin

oper:=copy (comstr, 1, posi-1);

Delete (comstr, 1, posi);

Break;

end;

//3)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°

for posi:=1 to length (comstr) do if comstr[posi]=',' then begin

arg1:=copy (comstr, 1, posi-1);

Delete (comstr, 1, posi);

Break;

end;

//4)ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°

for posi:=1 to length (comstr) do if (comstr[posi]=' ') then begin

arg2:=copy (comstr, 1, posi-1);

Delete (comstr, 1, posi);

Break;

end;

//Для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°: Ссли Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π΅ΡΡ‚ΡŒ, Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π½Π΅Ρ‚ Ρ‚ΠΎ ΡΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° одноаргумСнтная:

//.Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ пСрСсылку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ· 2 Π² 1:

if (arg1='')and (arg2<>'') then begin

arg1:=arg2;

arg2:='';

end;

//Π—Π°ΠΏΠΈΡΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ:

DecompositeCommand.mark:=mark;

DecompositeCommand.oper:=oper;

DecompositeCommand.arg1:=arg1;

DecompositeCommand.arg2:=arg2;

end;

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²

//.ΠΏΠ΅Ρ€Π΅Π΄ символами раздСлСния (запятая ΠΈ Ρ‚. Π΄.)

function TForm1. DeleteSpace (str:string):string;

var ps: integer;

begin

if str=' ' then str:='';

if str='' then exit;

ps:=1;

while ps <= length (str) do begin

if (str[ps]=#9) then begin delete (str, ps, 1); continue end;

inc (ps);

end;

//ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π΄ΠΎ ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

while ((str[1]=' ')and (length (str)>1)) do delete (str, 1,1);

while ((str[length (str)]=' ')and (length (str)>1)) do delete (str, length (str), 1);

//ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²:

ps:=1; while ps <= length (str)-1 do begin

if (str[ps]=' ') then while (str[ps+1]=' ') do begin delete (str, ps, 1); end;

inc (ps);

end;

//ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² рядом с Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ — запятой

ps:=Pos (',', str);

if ps>0 then begin

if str[ps+1]=' ' then delete (str, ps+1,1);

if str[ps-1]=' ' then delete (str, ps-1,1);

end;

DeleteSpace:=str;

end;

function TForm1. ComIs:string; //Π•ΡΡ‚ΡŒ Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ»ΠΈ ΡƒΠΆΠ΅ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°

begin

if (ComReadPos

else ComIs:='EOF';

end;

function TForm1. ComNext:string; //ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΠ»ΠΈ сброс:

begin

inc (ComReadPos);

end;

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ считанной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² Ρ‚Скстовом Π²ΠΈΠ΄Π΅

function TForm1. ComRead:string;

begin

//LowerCase — всС Π±ΡƒΠΊΠ²Ρ‹ (ΠΎΡ‚ A Π΄ΠΎ Z) устанавл. прописными

ComRead:=LowerCase (DeleteSpace (Code.Lines[ComReadPos])); //DeleteSpace — ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²

end;

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Imm16 с ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ² Π² Imm16 ΠΈ ΡƒΠ±ΠΈΡ€Π°Π½ΠΈΠ΅ символа 'h'/'a'

function TForm1. ImmToHex (imm:string;len:string):string;

const HexChar: set of char=['0'.'9','A'.'F','a'.'f'];

var i, l, temp:integer;

c:char;

begin

if imm='' then exit;

l:=-1;

c:= imm[Length (imm)];

Delete (imm, Length (imm), 1);

if len ='dw' then l:=4;

if len ='db' then l:=2;

i:=1;

while i<=Length (imm) do

if imm[i] in HexChar then inc (i)

else Delete (imm, i,1);

if imm='' then exit;

While (imm[1]='0') and (length (imm)>1) do Delete (imm, 1,1);

temp:=0;

if c='b' then begin for i:=Length (imm) to 1 do

if imm[i]='1' then temp:=temp+ round (intpower (2,length (imm)-i));

imm:=IntToHex (temp, l);end;

If length (imm)>l then begin ErrorControl:='<�НСсоотвСтствиС Ρ‚ΠΈΠΏΠΎΠ²>';exit; end;

while length (imm)

ImmToHex:=Uppercase (imm);

end;

//ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² 16 c/c, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ смСщСниСм ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ полоТСния si (для ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π²ΠΈΠ΄Π° [si+N])

function TForm1. cnvData (dat:string):string;

begin

ifpos ('+', dat)>0 then //Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ смСщСниС Ρ‚. Π΅. si+N, Π³Π΄Π΅ N — Π²Π΅Π»ΠΈΡ‡. смСщСния

cnvData:=copy (dat, pos ('+', dat)+1,2) //ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ 2-Ρ… символов послС символа +, подразумСваСтся Ρ‡Ρ‚ΠΎ эти символы число Π² 16 с/c

elsecnvData:='*'; //смСщСниС Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ

end;

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ movax, 0140h — 0140h = Imm16):

function TForm1. isImm (arg:string):boolean;

const hexset: set of char=['0'.'9','a'.'f'];

typeset: set of char=['b','h'];

var pos: integer;

begin

If Length (arg)<=1 then begin isImm:=false;exit;end;

isImm:=true;

if not (arg[length (arg)] in typeset) then begin isImm:=false;exit;end;

for pos:=1 to length (arg)-1 do if not (arg[pos] in hexset) then begin isImm:=false;exit;end;

//Π½Π΅ являСтся Π»ΠΈ нСпосрСдствСнный ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ рСгистром:

for pos:=0 to length (Reg16)-1 do if (Reg16[pos]<>'') then if (arg=Reg16[pos]) then begin isImm:=false; break; end;

for pos:=0 to length (Reg8)-1 do if (Reg8[pos]<>'') then if (arg=Reg8[pos]) then begin isImm:=false; break; end;

end;

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ movax, 0140h — 0140h = Imm16):

function TForm1. isReg (arg:string):boolean;

var pos: integer;

begin

isReg:=false; //ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ рСгистр

RegLen:=''; //ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄Π»ΠΈΠ½Π΅ рСгистра

//являСтся Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ — рСгистром:

for pos:=0 to length (Reg16)-1 do if (Reg16[pos]<>'') then

if (arg=Reg16[pos]) then begin isReg:=true; RegLen:='R16'; exit; end;

for pos:=0 to length (Reg8)-1 do if (Reg8[pos]<>'') then

if (arg=Reg8[pos]) then begin isReg:=true; RegLen:='R8'; exit; end;

end;

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· si (movax,[si+4]):

function TForm1. isData (str:string):boolean;

begin

isData:=false;

if Pos ('[', str)>0 then if Pos (']', str)>0 then if Pos ('si', str)>0 then isData:=true;

end;

// Ѐункция прСобразования строки с ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌΠΈ символами эквивалСнтной 1 Π±Π°ΠΉΡ‚Ρƒ Π² ΡΠΈΠΌΠ²ΠΎΠ»:

function TForm1. NexStrToStr (nexstr:string):string;

begin

if length (nexstr)=2 then NexStrToStr:=chr (strtoint ('$'+nexstr));

if length (nexstr)=4 then NexStrToStr:=chr (strtoint ('$'+copy (nexstr, 1,2)))+

chr (strtoint ('$'+copy (nexstr, 3,2)));

if length (nexstr)=6 then NexStrToStr:=chr (strtoint ('$'+copy (nexstr, 1,2)))+

chr (strtoint ('$'+copy (nexstr, 3,2)))+

chr (strtoint ('$'+copy (nexstr, 5,2)));

end;

procedure TForm1. NewProgramButtonClick (Sender: TObject);

begin

//установка указатСля для считывания Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ComReadPos:=0;

//установка счСтчика полоТСния ΠΊΠΎΠΌΠ°Π½Π΄ Π² Π±Π°ΠΉΡ‚Π°Ρ… Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ

ComBytePos:=0;

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ счСтчика для записи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Ρ‹Ρ…

DataBytes:=0;

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅

marks.RowCount:=1; //Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠΏΡ€Π°Π²ΠΎΠΊ

varibles.RowCount:=1; //Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

markslinks.RowCount:=1; //Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠΊ

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² — содСрТимых сСгмСнтов

VariableAdr:='';

ComBytePosMemo.Text:='';

MashCode.Text:='';

Title.Text:='';

CodeSeg.Text:='';

DataSeg.Text:='';

end;

function TForm1. IsVar (arg:string):boolean; //ЯвляСтся Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

var i: integer;

begin

IsVar:=False;

for i:=1 to Form1.Varibles.RowCount do

if Varibles. Cells[0,i]=arg then begin

IsVar:=True;

VarCode:=Varibles.Cells[2,i];

VarLen:=Varibles.Cells[3,i];

Exit;

end;

end;

function TForm1. GerArgType (Arg:string):string;

begin

GerArgType:='';

if isReg (arg) then GerArgType:=RegLen;

if isVar (arg) then GerArgType:=VarLen;

if IsImm (arg) then GerArgType:='Imm';

if IsData (arg) then GerArgType:='Data'

end;

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ машинного ΠΊΠΎΠ΄Π° послС распознавания ΠΌΠ½Π΅ΠΌΠΎΠΊΠΎΠ΄Π°, установка Π΄Π»ΠΈΠ½Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сущСствования ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

function TForm1. AnalysisCommand (comstr:string):command;

var com: command;

Arg1Type, Arg2Type: string;

begin

com:=DecompositeCommand (comstr);

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² — Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΠΎΠΏΠΎΠ·Π½Π°Π½Π° Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ся

//.ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Π½Π΅ΠΈΠ·Π². ΠΊΠΎΠΌΠ°Π½Π΄Π΅

com.MashCode:='';

com.ByteLen:='';

com.exist:=false; //ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° считаСтся Π½Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π½Π½ΠΎΠΉ

with com do BEGIN

Arg1Type:=GerArgType (arg1);

Arg2Type:=GerArgType (arg2);

oper:=Lowercase (oper);

arg1:=Lowercase (arg1);

arg2:=Lowercase (arg2);

if (oper='mov') then begin//————————————————————————MOV

//ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

//ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ использования ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

if (Arg1Type='R8') and (Arg2Type='R16') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

if (Arg1Type='R16') and (Arg2Type='R8') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

if (Arg1Type='V8') and (Arg2Type='R16') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

if (Arg1Type='R16') and (Arg2Type='V8') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

if (Arg1Type='V16') and (Arg2Type='R8') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

if (Arg1Type='R8') and (Arg2Type='V16') then begin ErrorControl:='<�НСcΠΎΠΎΡ‚Π². Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³.>'; exit; end;

//ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° указания всСх Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

if (arg1='')or (arg2='') then begin ErrorControl:='<�НСуказ. всС Π°Ρ€Π³ΡƒΠΌ.>'; exit; end;

if (arg1='ds') then if (arg2='ax') then begin //mov ax-ds

MashCode:='8ED8';

ByteLen:='2'; end;

//reg to reg

if (Arg1Type='R16')and (Arg2Type='R16') then begin MashCode:='8B'+InsReg (InsRegMul ('c0', arg1,8), arg2); ByteLen:='2'; end;//mov R16-R16

if (Arg1Type= 'R8')and (Arg2Type= 'R8') then begin MashCode:='8A'+InsReg (InsRegMul ('c0', arg1,8), arg2); ByteLen:='2'; end; //mov R8-R8

//imm to reg

if (Arg1Type= 'R16')and (Arg2Type= 'Imm') then begin MashCode:=InsReg ('B8', arg1)+InvertBytes (ImmToHex (arg2,'dw')); ByteLen:='3'; end; //mov R16-Imm16

if (Arg1Type= 'R8')and (Arg2Type= 'Imm') then begin MashCode:=InsReg ('8A', arg1) +ImmToHex (arg2,'db'); ByteLen:='2'; end; //mov R8-Imm8

//var to reg

if (Arg1 = 'al')and (Arg2Type= 'V8') then begin MashCode:='A0'+InvertBytes (GetVarCodeByName (arg2));ByteLen:='3';VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+1,2)+'5401 ';end//mov al-var8

else if (Arg1Type= 'R8')and (Arg2Type= 'V8') then begin MashCode:='8A'+InsRegMul ('06', arg1,8)+InvertBytes (GetVarCodeByName (arg2));VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+2,2)+'5401 ';ByteLen:='4';end;//mov R8-var8

if (Arg1 = 'ax')and (Arg2Type='V16') then begin MashCode:='A1'+InvertBytes (GetVarCodeByName (arg2));ByteLen:='3';VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+1,2)+'5401 ';end//mov ax-var16

else if (Arg1Type='R16')and (Arg2Type='V16') then begin MashCode:='8B'+InsRegMul ('06', arg1,8)+InvertBytes (GetVarCodeByName (arg2));VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+2,2)+'5401 ';ByteLen:='4';end;//mov R16-var16

//reg to var

if (Arg2 = 'al')and (Arg1Type= 'V8') then begin MashCode:='A2'+InvertBytes (GetVarCodeByName (arg1));ByteLen:='3';VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+1,2)+'5401 ';end//mov var8-al

else if (Arg2Type= 'R8')and (Arg1Type= 'V8') then begin MashCode:='88'+InsRegMul ('06', arg2,8)+InvertBytes (GetVarCodeByName (arg1));VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+2,2)+'5401 ';ByteLen:='4';end;//mov var8-R8

if (Arg2 = 'ax')and (Arg1Type='V16') then begin MashCode:='A3'+InvertBytes (GetVarCodeByName (arg1));ByteLen:='3';VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+1,2)+'5401 ';end//mov ax-var16

else if (Arg2Type='R16')and (Arg1Type='V16') then begin MashCode:='89'+InsRegMul ('06', arg2,8)+InvertBytes (GetVarCodeByName (arg1));VariableAdr:=VariableAdr+'C4'+IntToHex (combytepos+2,2)+'5401 ';ByteLen:='4';end;//mov var16-R16

if (arg1='ax') then if (arg2='@data') or (arg2='data') then begin //mov ax-segname @Data

MashCode:='B8'+'0000';

ByteLen:='3';

//Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСгмСнт 9Π‘05 для установки сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½:

ThisProgram.isDataSeg:=True; end;

if isReg (arg1) then if isData (arg2) then begin //mov Reg — data [si+n]

if cnvData (arg2)<>'*' then begin MashCode:='8B'+InsRegMul ('44', arg1,8)+cnvData (arg2); ByteLen:='3'; end

else begin MashCode:='8B'+InsRegMul ('04', arg1,8); ByteLen:='2' end;

end;

//послСпровСрка

if mashcode='' then ErrorControl:='<�НСизв. Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚>';

end;//——————————————————————————————————-/MOV

//Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:——————————————————————————————->

//int

if (oper='int') then if arg1type='Imm' then begin

MashCode:='CD'+ImmToHex (arg1,'db');

ByteLen:='2';

end;

//nop

if (oper='nop') then begin MashCode:='90'; ByteLen:='1'; end;

// dec mark

if (oper='dec') then begin

MashCode:='FF'+'0E'+InvertBytes (GetVarCodeByName (arg1));

ByteLen:='5';

end;

//jmp mark

if (oper='jg') then begin

MarkTableWrite (arg1,'', inttostr (ComBytePos+2), inttostr (ComReadPos));

MashCode:='7F';

ByteLen:='2';

end;

//add R16 — imm16

if (oper='add') then begin

if (arg1='ax') and (arg2Type='Imm') then begin MashCode:='05'+InvertBytes (ImmToHex (arg2,'dw')); ByteLen:='3'; end

end;

//ror R16 — imm8

if (oper='ror') then begin

if (Arg1Type='R16') and (Arg2Type='Imm') then begin

MashCode:='C1'+InsReg ('C8', arg1)+ImmToHex (arg2,'db'); ByteLen:='3'; end;

end;

//mark: (мСсто, ΠΊΡƒΠ΄Π° осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΊΠ΅)

if (mark<>'') then begin

MarksLinksTableWrite (mark, inttostr (ComBytePos));

exist:=true;

end;

END;

If Com. MashCode<>'' then Com. exist:=true;

AnalysisCommand:=com;

end;

procedure TForm1. Exit1Click (Sender: TObject);

begin

Application.Terminate; //Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

end;

procedure TForm1. FormCreate (Sender: TObject);

var pos: integer;

begin

//ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

//ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ствуСт

ThisProgram.isCodeSeg:=False;

ThisProgram.isDataSeg:=False;

//ΠΈΠΌΠ΅Π½Π° рСгистров 16Ρ€Π°Π·Ρ€:

SetLength (Reg16,20); //число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… рСгистров

for pos := 0 to Length (Reg16)-1 do Reg16[pos]: ='';

Reg16[0]:='ax';

Reg16[1]:='cx';

Reg16[2]:='dx';

Reg16[3]:='bx';

Reg16[6]:='si';

Reg16[7]:='di';

//ΠΈΠΌΠ΅Π½Π° рСгистров 8Ρ€Π°Π·Ρ€:

SetLength (Reg8,8); //число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… рСгистров

for pos := 0 to Length (Reg8)-1 do Reg8[pos]: ='';

Reg8[0]:='al';

Reg8[1]:='cl';

Reg8[2]:='dl';

Reg8[3]:='bl';

Reg8[4]:='ah';

Reg8[5]:='ch';

Reg8[6]:='dh';

Reg8[7]:='bh';

//установка указатСля для считывания Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ComReadPos:=0;

//установка счСтчика полоТСния ΠΊΠΎΠΌΠ°Π½Π΄ Π² Π±Π°ΠΉΡ‚Π°Ρ… Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ

ComBytePos:=0;

//ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ счСтчика для записи ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΡΠ΅Π³ΠΌΠ΅Π½Ρ‚ Π΄Π°Π½Ρ‹Ρ…

DataBytes:=0;

//Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠ΅Ρ‚ΠΎΠΊ

marks.RowCount:=1;

marks.Cells[0,0]: ='Имя ΠΌΠ΅Ρ‚ΠΊΠΈ';

marks.Cells[1,0]: ='ΠœΠ΅Ρ‚ΠΊΠ°';

marks.Cells[2,0]:='Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΊΠΈ';

marks.Cells[3,0]: ='Π‘Ρ‚Ρ€ΠΎΠΊΠ°';

//Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

varibles.RowCount:=1;

varibles.Cells[0,0]: ='Имя';

varibles.Cells[1,0]:='АдрСс';

varibles.Cells[2,0]:='Код';

varibles.Cells[3,0]:='Π”Π»ΠΈΠ½Π°';

//Ρ‚Π°Π±Π»ΠΈΡ†Π° ссылок ΠΌΠ΅Ρ‚ΠΎΠΊ

markslinks.RowCount:=1;

markslinks.Cells[0,0]: ='Имя';

markslinks.Cells[1,0]:='ΠœΠ΅Ρ‚ΠΊΠ°';

ErrorControl:=''; //стираниС сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

end;

function TForm1. CharToByte (C:char):byte;

var cc: byte;

begin

cc:=0;

case c of

'0'.'9': cc:=strtoint (c);

'A':cc:=$A;

'B':cc:=$B;

'C':cc:=$C;

'D':cc:=$D;

'E':cc:=$E;

'F':cc:=$F;

end;

CharToByte:=cc;

end;

function TForm1. HexByteToByte (s:string):byte;

begin

HexByteToByte:=((CharToByte (s[1]) shl 4) and (240))or ((CharToByte (s[2])) and (15))

end;

procedure TForm1. WriteHexStr (ss:string);

var

bb:byte;

i:integer;

begin

i:=1;

while i<=Length (ss) do begin

bb:=HexByteToByte (copy (ss, i,2));

Write (FileSave, bb);

i:=i+2;

end;

end;

function TForm1. StrDelSpaseHex (s:string):string;

const HexSet: set of Char=['0'.'9','A'.'F'];

var ss: string;

i:integer;

begin

i:=1;

ss:=s;

while i<=length (ss) do

if not (Uppercase (ss[i])[1] in HexSet) then Delete (ss, i,1)

else inc (i);

StrDelSpaseHex:=ss;

end;

function Tform1. AddControlByte (s:string):string;

var sum, i: integer;

begin

i:=1;sum:=0;

s:=StrDelSpaseHex (s);

while i<=length (s) do begin

Sum:=Sum+HexByteToByte (copy (s, i,2));

i:=i+2;

end;

sum:=($ 100-sum mod $ 100)mod $ 100;

AddControlByte:=Form1.IntToHexStr (sum);

end;

function TForm1. InvertBytes (s:string):string;//Π‘ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ порядок Π±Π°ΠΉΡ‚ΠΎΠ²

var i: integer;

ss:string;

begin

ss:='';

for i:=Length (s)div 2 downto 1 do

ss:=ss+copy (s, 2*i-1,2);

InvertBytes:=ss;

end;

procedure TForm1. CreateObjFileClick (Sender: TObject);

var s, s1, s2:string;

i:integer;

Strings:array[1.6]of string;

begin

//смСщСния прибавляСмыС ΠΊ Π·Π°ΠΏΠΈΡΡΠΌ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ (+2 +4 +8) — зависят ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ слСд Π·Π° Π½ΠΈΡ… Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½Ρ‹Ρ… записСй

//Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

//1 строчка

s:=OpenDialog1.FileName;

for I:=length (S) downto 1 do if S[i]='' then begin Delete (s, 1, i);break;end;

s1:=InvertBytes (IntToHex (length (S)+2,4));

s2:=IntToHex (length (S), 2);

Strings[1]: ='80 '+s1+s2+StrToHexStr (S);

Strings[1]: =Strings[1]+AddControlByte (Strings[1]);

Strings[2]:='88 '+IntToHexStr (length ('Turbo Assembler Version 4.1')+4)+'0000 001C'+StrToHexStr ('Turbo Assembler Version 4.1');

Strings[2]: =Strings[2]+AddControlByte (Strings[2]);

Strings[3]:='88 '+IntToHexStr (length (S)+8)+'0040 E97A 74A5 4209 '+StrToHexStr (S);

Strings[3]: =Strings[3]+AddControlByte (Strings[3]);

Strings[4]:='98 07 00 60 '+IntToHexStr (DataBytes)+' 00 02 01 01 ';

Strings[4]: =Strings[4]+AddControlByte (Strings[4]);

Strings[5]:='98 07 00 60 '+IntToHexStr (ComBytePos)+' 00 03 01 01 ';

Strings[5]: =Strings[5]+AddControlByte (Strings[5]);

Title.Text:=Strings[1]+#13#10+

Strings[2]+#13#10+

Strings[3]+#13#10+

'88 03 00 40 E9 4C'+#13#10+

'96 02 00 00 68'+#13#10+

'88 03 00 40 A1 94'+#13#10+

'96 06 00 04 44 41 54 41 46'+#13#10+

Strings[4]+#13#10+

'96 06 00 04 43 4 °F 44 45 45'+#13#10+

Strings[5]+#13#10+

'88 04 00 40 A2 01 91';

//Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠ³ΠΎ сСгмСнта

CodeSeg.Text:='A0 '+InvertBytes (IntToHex (ComBytePos+4,4))+'02 0000'+StrDelSpaseHex (MashCode.Text);

CodeSeg.Text:=CodeSeg.Text+AddControlByte (CodeSeg.Text);

//Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈ сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…

Strings[6]: ='';

for i:=1 to Varibles. RowCount-1 do

Strings[6]: =Strings[6]+InvertBytes (Varibles.Cells[2,i]);

DataSeg.Text:='A0 '+InvertBytes (IntToHex (DataBytes+4,4))+' 01 00 00 '+Strings[6];

DataSeg.Text:=DataSeg.Text+AddControlByte (DataSeg.Text);

EndFile.Text:='8A 0700 C100 0202 0000 AA';

DataSourceSeg.Text:='9C '+InvertBytes (IntToHex (Length (StrDelSpaseHex (VariableAdr))div 2+1,4))+' '+VariableAdr;

DataSourceSeg.Text:=DataSourceSeg.Text+AddControlByte (DataSourceSeg.Text);

end;

procedure TForm1. ClearCodeButtonClick (Sender: TObject); //очистка поля для Π²Π²ΠΎΠ΄Π° ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€.

begin

Code.Clear;

DataSourceSeg.Clear;

EndFile.Clear;

end;

procedure TForm1. exeAllClick (Sender: TObject);

begin

NewProgramButtonClick (NewProgramButton);

while ComIs<>'EOF' do begin

ComExe;

ComNext;

end;

AddLinksInMarkers; //пСрСсылка всСх ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠΎΠΏΡ€Π°Π²ΠΎΠΊ

ModifyMarkAdress; //расчСт смСщСний ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡ… ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°

end;

procedure TForm1. CodeDblClick (Sender: TObject);

var

i:integer;

Str:String;

begin

i:=0;

If OpenDialog1. Execute then begin

AssignFile (FileLoad, OpenDialog1. FileName);

Reset (FileLoad);

Code.Clear;

Memo1.Clear;

while not eof (FileLoad) do

begin

inc (i);

ReadLn (FileLoad, Str);

Code.Lines.Add (Str);

Memo1.Lines.Add (IntToStr (I));

end;

CloseFile (FileLoad);

end;

ScrollBar1.Max:=Code.Lines.Count;

ScrollBar1.Position:= Code.Lines.Count;

ScrollBar1.Tag:=Code.Lines.Count;

end;

procedure TForm1. ScrollBar1Change (Sender: TObject);

var k: integer;

begin

k:=ScrollBar1.Position-ScrollBar1.Tag;

If K>0 then begin

Code.Perform (EM_SCROLL, SB_LINEDOWN, K);

ComBytePosMemo.Perform (EM_SCROLL, SB_LINEDOWN, K);

MashCode.Perform (EM_SCROLL, SB_LINEDOWN, K);

Memo1.Perform (EM_SCROLL, SB_LINEDOWN, K);

end

else begin

Code.Perform (EM_SCROLL, SB_LINEUp, K);

ComBytePosMemo.Perform (EM_SCROLL, SB_LINEUp, K);

MashCode.Perform (EM_SCROLL, SB_LINEUp, K);

Memo1.Perform (EM_SCROLL, SB_LINEUp, K);

end;

Scrollbar1.Tag:=Scrollbar1.Position;

end;

Алгоритм Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ компилятора

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Π² Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Π΅, являСтся ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΌ. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

1) Π’Π°Π±Π»ΠΈΡ†Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, состоящая ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ: имя, адрСс, ΠΊΠΎΠ΄ ΠΈ Π΄Π»ΠΈΠ½Π°.

2) Π’Π°Π±Π»ΠΈΡ†Π° ΠΌΠ΅Ρ‚ΠΎΠΊ (ΠΏΠΎΠΏΡ€Π°Π²ΠΎΠΊ), состоящая ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ: имя ΠΌΠ΅Ρ‚ΠΊΠΈ, ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ, Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΊΠΈ, строка Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΊΡƒ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π‘Ρ‚Ρ€ΠΎΠΊΠ° Ρ„Π°ΠΉΠ»Π° разбиваСтся Π½Π° 3 поля. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ-пустоту ΠΈΠ»ΠΈ строку — сплошной ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ. Если Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Ρ‚ΠΎ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Data Table Write заносим Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠ΅, адрСс, ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρƒ. Если ΠΊΠΎΠΌΠ°Π½Π΄Π°-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Analysis Command. Если ΠΊΠΎΠΌΠ°Π½Π΄Π° с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Π΅Π΅ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΠΎ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠ΅Ρ‚ΠΎΠΊ записываСм имя ΠΌΠ΅Ρ‚ΠΊΠΈ, адрСс Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ ΡΡ‚Ρ€ΠΎΠΊΡƒ ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ. Если нашли ΠΌΠ΅Ρ‚ΠΊΡƒ записываСм Π΅Π΅ Π°Π΄Ρ€Π΅Ρ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. ПослС Ρ€Π°Π·Π±ΠΎΡ€Π° всСго Ρ„Π°ΠΉΠ»Π° вычисляСм ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΡΡ‚Π°Ρ€Ρ‹ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Рис. 2 ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ использовании компилятора TASM

Рис. 3 ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

β€’ 80 0А 00 08 6B 6 °F 70 61 2E 61 73 6D 54 -запись названия исходного Ρ„Π°ΠΉΠ»Π°;

β€’ 88 1A 00 00 00 1C 43 6 °F 6D 70 69 6C 65 72 20 4B 6 °F 70 79 6C 6 °F 76 61 20 4E 2E 53 2E 75 — запись названия транслятора;

β€’ 88 10 00 40 E9 34 67 C4 42 08 6B 6 °F 70 61 2E 61 73 6D 7Cвторая запись с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ исходного Ρ„Π°ΠΉΠ»Π°;

β€’ 88 03 00 40 E9 4C 96 02 00 00 68 88 03 00 40 A1 94- Ρ‚Ρ€ΠΈ постоянныС записи;

β€’ 96 06 00 04 44 41 54 41 46 -описания ΠΈΠΌΠ΅Π½ΠΈ сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ… (DATА);

β€’ 98 07 00 60 08 00 02 01 01 F5 — описаниС Π΄Π°Π½Π½Ρ‹Ρ… сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…;

β€’ 96 06 00 04 43 4 °F 44 45 45- описания ΠΈΠΌΠ΅Π½ΠΈ сСгмСнта ΠΊΠΎΠ΄Π° (CODE);

β€’ 98 07 00 60 15 00 03 01 01 E7- описаниС Π΄Π°Π½Π½Ρ‹Ρ… сСгмСнта ΠΊΠΎΠ΄Π°;

β€’ 88 04 00 40 A2 01 91 — прСдсСгмСнтный Π±Π»ΠΎΠΊ;

β€’ A0 0C 00 01 00 00 01 10 00 01 01 01 00 4CF3- содСрТимоС сСгмСнта Π΄Π°Π½Π½Ρ‹Ρ…;

β€’ A0 19 00 02 00 00 A1 00 00 05 01 01 FF 0E 04 00 C1 C8 05 7 °F 01 90 A1 06 00 CD 21 59 — содСрТимоС сСгмСнта ΠΊΠΎΠ΄Π° (A10000 — mov ax, a1, 5 0101FF — add ax, 101h, 0E 04 00 — dec a3, C1 C8 05 — ror ax, 5h, 7 °F 01 — jg @2, 90-nop, A1 06 00 — mov ax, c, CD 21 — int 21h);

β€’ 9C 0D 00 C4 01 54 01 C4 08 54 01 C4 11 54 01 F2- Ρ‚Π°Π±Π»ΠΈΡ†Π° ссылок сСгмСнта ΠΊΠΎΠ΄Π°;

8A 0700 C100 0202 0000 AA — запись ΠΊΠΎΠ½Ρ†Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

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