8-900-374-94-44
[email protected]
Slide Image
МСню

АссСмблСр ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ avr – avr 8- RISC AVR

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

AVR. Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ курс. ΠœΠ°ΠΊΡ€ΠΎΠ°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€ | Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½ΠΈΠΊΠ° для всСх

ΠŸΠ΅Ρ€Π΅Π΄ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ систСмы ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π½Π°Π΄ΠΎ Π±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² инструмСнтарии. ΠŸΠ»ΠΎΡ… Ρ‚ΠΎΡ‚ ΠΏΠ»ΠΎΡ‚Π½ΠΈΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π·Π½Π°Π΅Ρ‚ свой Ρ‚ΠΎΠΏΠΎΡ€. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ инструмСнтом Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ компилятор. Π£ компилятора Π΅ΡΡ‚ΡŒ свой язык β€” макроассСмблСр, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Тизнь программиста упрощаСтся Π² Ρ€Π°Π·Ρ‹. Π’Π΅Π΄ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° MOV Counter,Default_Count вмСсто MOV R17,R16 ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρƒ нас R17 Π·Π½Π°Ρ‡ΠΈΡ‚ Counter, Π° R16 это Default_Count. ВсС подстановки с чСловСчСского языка Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ дСлаСтся срСдствами прСпроцСссора компилятора. Π•Π³ΠΎ ΠΌΡ‹ сСйчас ΠΈ рассмотрим.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ Π·Π½Π°ΠΊΠΎΠΌ Β«;Β«, Π»ΠΈΠ±ΠΎ Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌΠΈ слСшами Β«//Β«, Π° Π΅Ρ‰Π΅ AVR Studio ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ CΠΈΡˆΠ½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Π³Π΄Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Β«ΠΊΠΎΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΡ€ΠΎΠ²ΠΎΠ»ΠΎΠΊΠΎΠΉΒ» /* ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ */.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ .include позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Ρ‚Π΅Π»ΠΎ Ρ‚Π²ΠΎΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ кусок ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ тСкстового Ρ„Π°ΠΉΠ»Π°. Π§Ρ‚ΠΎ позволяСт Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ исходник Π½Π° ΠΊΡƒΡ‡Ρƒ ΠΌΠ΅Π»ΠΊΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈ Π½Π΅ ΠΌΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° сюда ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ портянку ΠΊΠΎΠ΄Π°. Π‘Ρ‡ΠΈΡ‚Π°ΠΉ ΠΊΡƒΠ΄Π° Ρ‚Ρ‹ Π²ΠΎΡ‚ΠΊΠ½ΡƒΠ»

.include Ρ‚ΡƒΠ΄Π° ΠΈ вставился кусок ΠΊΠΎΠ΄Π° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Если Π½Π°Π΄ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ вСсь Ρ„Π°ΠΉΠ», Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ, Ρ‚ΠΎ Ρ‚Π΅Π±Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° .exit дойдя Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компилятор Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ .def позволяСт ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ слову любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· рСсурсов ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° β€” ΠΏΠΎΡ€Ρ‚ ΠΈΠ»ΠΈ рСгистр. НапримСр сдСлал я счСтчик, Π° считаСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ находится Π² рСгистрС R0, Π° Π² качСствС рСгистра-ΠΏΠΎΠΌΠΎΠΉΠΊΠΈ для ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… я заюзал R16. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΠΏΡƒΡ‚Π°Ρ‚ΡŒΡΡ ΠΈ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ рСгистрС Ρƒ мСня Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ я ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽ ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· .def символичСскиС ΠΈΠΌΠ΅Π½Π°.

1
2
.def 	schetchik = R0
.def 	pomoika = R16

.def schetchik = R0 .def pomoika = R16

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠ³Ρƒ смСло ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ R0 Π½Π΅ΠΎΡ„ΠΈΡ†Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ»ΠΈΡ‡ΠΊΡƒ schetchik
ΠžΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ рСгистру ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΡƒΡ‡Ρƒ ΠΈΠΌΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π½Π° всС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ чСстно ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ°Ρ‚ΡŒΡΡ.

Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ .undef послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ компилятор Π½Π°ΠΏΡ€ΠΎΡ‡ΡŒ Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‡Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ соотвСтствовало. Иногда Π±Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. Когда ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ символичСскоС имя хочСтся ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌ рСсурсам.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ .equ это присвоСниС выраТСния ΠΈΠ»ΠΈ константы ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ символичСской ΠΌΠ΅Ρ‚ΠΊΠ΅.
НапримСр, Ρƒ мСня Π΅ΡΡ‚ΡŒ константа которая часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. МоТно, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π΅ Π² ΠΊΠΎΠ΄Π΅, Π½ΠΎ Π²Π΄Ρ€ΡƒΠ³ окаТСтся, Ρ‡Ρ‚ΠΎ константа Π²Ρ‹Π±Ρ€Π°Π½Π° Π½Π΅Π²Π΅Ρ€Π½ΠΎ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ придСтся вСсь ΠΊΠΎΠ΄ ΡˆΠ΅Ρ€ΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Π²Π΅Π·Π΄Π΅ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, Π° Ссли Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°Π±ΡƒΠ΄Π΅ΡˆΡŒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΌΠ°Ρ…Ρ€ΠΎΠ²ΡƒΡŽ Π±Π°Π³Ρƒ, Ρ‡Ρ‚ΠΎ задолбаСшься ΠΏΠΎΡ‚ΠΎΠΌ Π΅Π΅ Π²Ρ‹Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°Ρ„ΠΈΠ³, всС константы ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π΄ΠΎ Ρ‡Π΅Ρ€Π΅Π·
.equ! ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π½Π΅ константу, Π° Ρ†Π΅Π»ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ΠšΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈ компиляции посчитаСтся прСпроцСссором, Π° Π² ΠΊΠΎΠ΄ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Надо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΡƒΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ цСлочислСнноС. Π‘ отбрасываниСм Π΄Ρ€ΠΎΠ±Π½ΠΎΠΉ части, Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ округлСния, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ 1/2 = 0, Π° 5/2 = 2

1
2
3
.equ 	Time = 5
.equ 	Acсelerate = 4
.equ 	Half_Speed = (Accelerate*Time)/2

.equ Time = 5 .equ Acсelerate = 4 .equ Half_Speed = (Accelerate*Time)/2

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ сСгмСнтации. Как я ΡƒΠΆΠ΅ рассказывал Π² постС ΠΏΡ€ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° AVR ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Ρ€Π°Π·Π±ΠΈΡ‚Π° Π½Π° нСзависимыС сСгмСнты β€” Π΄Π°Π½Π½Ρ‹Π΅ (ΠžΠ—Π£), ΠΊΠΎΠ΄ (FLASH), EEPROM

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ находится ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ сСгмСнтации ΠΈ адрСсации.

.CSEG сСгмСнт ΠΊΠΎΠ΄Π°, ΠΎΠ½ ΠΆΠ΅ Ρ„Π»Π΅Ρˆ. ПослС этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈΠ΄Π΅Ρ‚ Ρ‚Π΅Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠΌΠΌΠ°Π½Π΄Ρ‹ процСссора. Π’ΡƒΡ‚ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡƒΠ½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с Π·Π°Ρ€Π°Π½Π΅Π΅ посчитаными значСниями, статичный тСкст ΠΈΠ»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов для Π·Π½Π°ΠΊΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

Π’ сСгмСнтС ΠΊΠΎΠ΄Π° умСстны Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:
АдрСсная ΠΌΠ΅Ρ‚ΠΊΠ°. Π›ΡŽΠ±ΠΎΠ΅ слово, Π½Π΅ содСрТащСС ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с Ρ†ΠΈΡ„Ρ€Ρ‹, Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послС Π½Π΅Π³ΠΎ стояло Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅.

1
2
3
.CSEG
label:   LDI      R16,'A'
         RJMP   label

.CSEG label: LDI R16,’A’ RJMP label

Π’ ΠΈΡ‚ΠΎΠ³Π΅, послС компиляции вмСсто label Π² ΠΊΠΎΠ΄ подставится адрСс ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стоит эта самая ΠΌΠ΅Ρ‚ΠΊΠ°, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС адрСс ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ LDI R16,’A’
АдрСсными ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄, Π½ΠΎ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, записанныС Π² любом сСгмСнтС памяти. Об этом Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅.

.ORG address ΠΎΠ·Π½Π°Ρ‡Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Β«ΠΊΠΎΠΏΠ°Ρ‚ΡŒ ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ Π΄ΠΎ ΠΎΠ±Π΅Π΄Π°Β», Ρ‚.Π΅. Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° памяти. Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚

с ΠΊΠ°ΠΊΠΎΠ³ΠΎ адрСса ΠΏΠΎΠΉΠ΄Π΅Ρ‚ собствСнно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	.CSEG
	.ORG 0x0000		
	RJMP Start  ;ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ².
Β 
	.ORG INT0addr 	; External Interrupt0 Vector Address
	RJMP INT0_expection
Β 
	.ORG INT1addr 	; External Interrupt1 Vector Address
	RETI
Β 
	.ORG OC2addr 	; Output Compare2 Interrupt Vector Address
	RJMP PWM_1
Β 
	.ORG OVF2addr 	; Overflow2 Interrupt Vector Address
	RETI
Β 
	.ORG ICP1addr 	;Input Capture1 Interrupt Vector Address
	RETI
Β 
	.ORG 0Ρ…0032 		; Начало основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
Β 
Start: 	LDI R16,0x54 	; и понСслась

.CSEG .ORG 0x0000 RJMP Start ;ΠΏΠ΅Ρ€Π΅ΠΏΡ€Ρ‹Π³ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². .ORG INT0addr ; External Interrupt0 Vector Address RJMP INT0_expection .ORG INT1addr ; External Interrupt1 Vector Address RETI .ORG OC2addr ; Output Compare2 Interrupt Vector Address RJMP PWM_1 .ORG OVF2addr ; Overflow2 Interrupt Vector Address RETI .ORG ICP1addr ;Input Capture1 Interrupt Vector Address RETI .ORG 0Ρ…0032 ; Начало основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Start: LDI R16,0x54 ; ΠΈ понСслась

Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΈΡ…Π°ΡŽΡ‚ΡΡ Π² Ρ„Π»Π΅Ρˆ посрСдством ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

.db массив Π±Π°ΠΉΡ‚ΠΎΠ².
.dw массив слов β€” Π΄Π²Π° Π±Π°ΠΉΡ‚Π°.
.dd массив Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… слов β€” Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π°
.dq массив Ρ‡Π΅Ρ‚Π²Π΅Ρ€Π½Ρ‹Ρ… слов β€” восСм Π±Π°ΠΉΡ‚.

1
2
3
Constant:	.db  	10     ; ΠΈΠ»ΠΈ 0Ρ…Ah Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ 
Message:	.db  	"ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π»ΡƒΠ½Π°Ρ‚ΠΈΠΊΠ°ΠΌ"
Words: 		.dw	10, 11, 12

Constant: .db 10 ; ΠΈΠ»ΠΈ 0Ρ…Ah Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Message: .db «ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π»ΡƒΠ½Π°Ρ‚ΠΈΠΊΠ°ΠΌ» Words: .dw 10, 11, 12

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Π²ΠΎ Ρ„Π»Π΅ΡˆΠ΅ Π²Π½Π°Ρ‡Π°Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ число 0А, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ±Π°ΠΉΡ‚Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ хСкскоды символов Ρ„Ρ€Π°Π·Ρ‹ Β«ΠΏΡ€ΠΈΠ²Π΅Ρ‚ Π»ΡƒΠ½Π°Ρ‚ΠΈΠΊΠ°ΠΌΒ», Π° дальшС 000A, 000B, 000Π‘.
ПослСднии числа, Ρ…ΠΎΡ‚ΡŒ сами ΠΈ Π½Π΅Π²Π΅Π»ΠΈΠΊΠΈ, Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŒΡΠ²Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ .dw.

.DSEG сСгмСнт Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠ°. Π’Π΅ самыС ΠΆΠ°Π»ΠΊΠΈΠ΅ считанныС Π±Π°ΠΉΡ‚Ρ‹. Бюда Π½Π΅ Π·Π°Π·ΠΎΡ€Π½ΠΎ ΠΏΠΈΡ…Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€ΠΌΠ΅Π½Π½Ρ‹Π΅, Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΡƒΡ‚ Π±ΡƒΡ„Ρ„Π΅Ρ€Π°, Ρ‚ΡƒΡ‚ ΠΆΠ΅ находится стСк.

Π’ΡƒΡ‚ дСйствуСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ .BYTE ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° располоТСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти.

1
2
var1: 		.BYTE 1
table: 		.BYTE 10

var1: .BYTE 1 table: .BYTE 10

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ var1 ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°.
Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΈΠ· 10 Π±Π°ΠΉΡ‚ ΠΈ пСрСмСнная table ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ. АдрСс ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… вычисляСтся смСщСниСм.

Π£ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΠ΅Ρ€ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ адрСсовал ΠΈ ΠΎΠ½ΠΈ Π½Π΅ Π½Π°Π»Π΅Π·Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°.

.EESEG сСгмСнт EEPROM, энСргонСзависимая ΠΏΠ°ΠΌΡΡ‚ΡŒ. МоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΏΠ°ΠΆΠ΅ питания Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π°ΡŽΡ‚ΡΡ.
Π’ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ ΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Ρ‡Ρ‚ΠΎ ΠΈ Π² flash β€” db, dw, dd, dq.

MACRO β€” ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ макроподстановки. Π’ΠΎΡ‚ ΡƒΠΆ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ чумовая Π²Π΅Ρ‰ΡŒ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ†Π΅Π»Ρ‹ΠΌ кускам ΠΊΠΎΠ΄Π°, ΠΌΠ°Π»ΠΎ Ρ‚ΠΎΠ³ΠΎ, Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ.

1
2
3
4
.MACRO SUBI16		; Start macro definition 
        subi @1,low(@0)	; Subtract low byte 
        sbci @2,high(@0)	; Subtract high byte 
.ENDM                       	; End macro definition

.MACRO SUBI16 ; Start macro definition subi @1,low(@0) ; Subtract low byte sbci @2,high(@0) ; Subtract high byte .ENDM ; End macro definition

@0, @1, @2 это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ макроса, ΠΎΠ½ΠΈ Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΡƒΠΏΠΎ ΠΏΠΎ порядку. А ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄.

Π’Ρ‹Π·ΠΎΠ² выглядит ΠΊΠ°ΠΊ обычная ΠΊΠΎΠΌΠ°Π½Π΄Π°:

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

ΠœΠ°ΠΊΡ€ΠΎΠ°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€ это ΠΌΠΎΡ‰Π½Π΅ΠΉΡˆΠ°Ρ ΡˆΡ‚ΡƒΠΊΠ°. По Ρ…ΠΎΠ΄Ρƒ ΠΏΡŒΠ΅ΡΡ‹ я Π±ΡƒΠ΄Ρƒ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ макросы ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ.

easyelectronics.ru

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ассСмблСрныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR

Для изучСния Π°Π·ΠΎΠ² программирования ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR Π½Π° ассСмблСрС AVR Studio Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния ассСмблСрных ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊ. Π’ Π½ΠΎΠ²Π΅ΠΉΡˆΠΈΡ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… AVR сСмСйства MEGA доступно ΠΎΠΊΠΎΠ»ΠΎ Π΄Π²ΡƒΡ… сотСн ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ каТдая ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄ выполняСтся ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΡ‚, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ вСтвлСния ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ умноТСния.

НаиболСС часто ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΠΌΡ‹Π΅ ассСмблСрныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ для понимания Ρ‡ΡƒΠΆΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ для написания своСго.

Β 

РСгистры Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°:

CBI — сброс Π±ΠΈΡ‚Π° ΠΏΠΎΡ€Ρ‚Π°

SBI — установка Π»ΠΎΠ³. «1» Π±ΠΈΡ‚Π° ΠΏΠΎΡ€Ρ‚Π°

IN -Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π° Π² рСгистр

OUT — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния Π² рСгистр

SBIC — пропуск ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ссли Π±ΠΈΡ‚ ΠΏΠΎΡ€Ρ‚Π° ΡΠ±Ρ€ΠΎΡˆΠ΅Π½

SBIS —Β  пропуск ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ссли Π±ΠΈΡ‚ ΠΏΠΎΡ€Ρ‚Π° установлСн

Β 

Π’Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅:

CALL -Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²

RCALL — ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ²

RET — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

RETI — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· прСрывания, Ρ„Π»Π°Π³ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ I «ΠΆΠ΅ΡΡ‚ΠΊΠΎ» устанавливаСтся

JMP — Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

RJMP — ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

BRBC — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, Ссли Π±ΠΈΡ‚ рСгистра SREG ΡΠ±Ρ€ΠΎΡˆΠ΅Π½

BRBS — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄, Ссли Π±ΠΈΡ‚ рСгистра SREG установлСн

SBRC — ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ссли Π±ΠΈΡ‚ рСгистра ΡΠ±Ρ€ΠΎΡˆΠ΅Π½

SBRS — ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ссли Π±ΠΈΡ‚ рСгистра установлСн

Β 

Π Π°Π±ΠΎΡ‚Π° со стСком:

PUSH — ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ рСгистр Π² стСкС

POP — ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ΠΈΠ· стСка

Β 

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

NOP — ΠΊΠΎΠΌΠ°Π½Π΄Π°, которая Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚

CLI — Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ прСрывания

SEI — Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ прСрывания

CP — ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ значСния Π΄Π²ΡƒΡ… рСгистров ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния

CPI — ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра с константой

LDI — Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ константу Π² рСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния

CLR — ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ рСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния

Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄:


ldiΒ Β Β Β Β  R16, 0b00001001 ;Β Β  Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° константы Π² рСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния (R16 - R32)
outΒ Β  Β PORTD, R16Β Β Β Β Β Β Β Β  ;Β Β  запись значСния рСгистра Π² ΠΏΠΎΡ€Ρ‚ D

inΒ Β Β Β Β Β  R25, PORTB Β Β Β Β Β Β Β Β  ; ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ значСния Port B Π² рСгистр R25
cpiΒ Β Β Β  R25, 4Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ считанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с константой =4
breqΒ Β  exitΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΠΌΠ΅Ρ‚ΠΊΡƒ Ссли Π±Ρ‹Π»ΠΎ Ρ€Π°Π²Π½ΠΎ
...
exit:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  Β  ; ΠΌΠ΅Ρ‚ΠΊΠ°
nopΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; пустой Ρ‚Π°ΠΊΡ‚

sbiΒ Β Β  Β Β Β  PORTD, PD4Β Β Β  Β Β  ; Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² 4-ΠΉ Π±ΠΈΡ‚ ΠΏΠΎΡ€Ρ‚Π° D Π»ΠΎΠ³. "1"
rcallΒ Β Β Β Β  my_delayΒ Β Β Β Β Β Β Β Β Β Β  ; Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
cbiΒ Β Β  Β Β Β  PORTD, PD4 Β  Β  Β  ; сброс 4-Π³ΠΎ Π±ΠΈΡ‚Π° ΠΏΠΎΡ€Ρ‚Π° D
...
my_delay:Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ (4 Ρ‚Π°ΠΊΡ‚Π°)
nopΒ Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; холостой Ρ‚Π°ΠΊΡ‚
nop
nop
nop
nop
ret Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  Β  ; Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (3 Ρ‚Π°ΠΊΡ‚Π°)
; Π²Ρ‹Π·ΠΎΠ² ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ my_delay Π·Π°ΠΉΠΌΡ‘Ρ‚ 4+ 5+3 = 12 Ρ‚Π°ΠΊΡ‚ΠΎΠ²

Β 

Π’ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ Π”ΠΆΠΎΠ½Π° ΠœΠΎΡ€Ρ‚ΠΎΠ½Π° ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR Π½Π° ассСмблСрС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ описаниС всСх ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Β 

Β 

radioded.ru

Как ΠΏΠΎΠ½ΡΡ‚ΡŒ ассСмблСр для AVR / Habr

ВсСм Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ Π²Π΅Ρ‡Π΅Ρ€! Π’Π΅Π΄Ρƒ свою Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ ΠΈΠ· ΡƒΡŽΡ‚Π½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся «ассСмблСр». Π‘Ρ€Π°Π·Ρƒ поясню Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΌΠ° касаСтся ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR β€” ΠΈ я ΠΏΠΎΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ знаю, пригодится Π»ΠΈ этот пост Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ассСмблСр для любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ я Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ нСсколько Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄ Π½Π°Ρ‡Π°Π» ΡƒΡ‡ΠΈΡ‚ΡŒ ассСмблСр с нуля β€” Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ устройство β€” ΠΈ я Ρ€Π΅ΡˆΠΈΠ» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ всё ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’Π°ΠΊ Π²ΠΎΡ‚ β€” Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь понял, Ρ‡Ρ‚ΠΎ ΡƒΡ‡ΠΈΡ‚ΡŒ ассСмблСр Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ бСсполСзно! АссСмблСр ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ! Π’ΠΎ Π΅ΡΡ‚ΡŒ всСм Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ассСмблСрС я Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Π²Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π€Π˜Π—Π˜Π§Π•Π‘ΠšΠ˜ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΆΠ΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ тонкости ΠΊΠΎΠΌΠ°Π½Π΄.
Π’Π°ΠΊ Π²ΠΎΡ‚, я ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ Π½Π°Ρ‡Π½Ρƒ нСбольшой Ρ†ΠΈΠΊΠ» статСй, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Ρƒ с самого Π½Π°Ρ‡Π°Π»Π° Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ я понял Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° ассСмблСрС β€” Π΄ΡƒΠΌΠ°ΡŽ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ асм я Π±ΡƒΠ΄Ρƒ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΈΠΌ Β«ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠΌΒ» с языка Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π² этом Π΄Π΅Π»Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΡˆΠ°Ρ€ΠΈΡ‚.

Π‘Ρ€Π°Π·Ρƒ скаТу, Ρ‡Ρ‚ΠΎ я Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Π²ΠΊΡƒΡ€ΠΈΠ» эту Ρ‚Π΅ΠΌΡƒ с ΠΏΠΎΠ΄Π°Ρ‡ΠΈ DIHALT β€” поэтому эти статСйки Π±ΡƒΠ΄ΡƒΡ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ с супСр-ΠΏΡƒΠΏΠ΅Ρ€-ассСмблСрно-ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π½ΠΎΠ³ΠΎ языка Π½Π° язык понятный Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ людСй. Ну Π° Π³ΡƒΡ€Ρƒ надСюсь Π±ΡƒΠ΄ΡƒΡ‚ мСня ΠΏΠΎΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ ΠΏΡŒΠ΅ΡΡ‹ ΠΈ Ссли Π²Π΄Ρ€ΡƒΠ³ я Ρ‡Ρ‚ΠΎ Ρ‚ΠΎ объясню Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ β€” Ρ‚ΠΎ ΠΎΠ½ΠΈ поправят мСня.
Π˜Ρ‚Π°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΎΠ± ассСмблСрС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я сдСлал ΠΏΠ°Ρ€Ρƒ Π΄Π½Π΅ΠΉ Π½Π°Π·Π°Π΄, мСня потрясли Π΄ΠΎ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ Π΄ΡƒΡˆΠΈ β€” ΠΈ я просидСл Π·Π° ΡΡ‚Π°Ρ‚ΡŒΡΠΌΠΈ DI HALT’Π° с 11 Π²Π΅Ρ‡Π΅Ρ€Π° Π΄ΠΎ 5 ΡƒΡ‚Ρ€Π° β€” послС Ρ‡Π΅Π³ΠΎ Π»Ρ‘Π³ ΡΠΏΠ°Ρ‚ΡŒ Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ счастливым. Π― понял ΡΡƒΡ‚ΡŒ программирования Π½Π° ассСмблСрС для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ².
Как ΠΆΠ΅ это ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅? Π”ΡƒΠΌΠ°ΡŽ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с самой сути.
***
Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² тСхничСскиС подробности (ΠΎ Π½ΠΈΡ… ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅) β€” просто ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 3 пСрсонаТа:
1. ΠœΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ — это Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½ Π‘Ρ‚ΠΈΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅Ρ…Π°Π» ΠΊ русскому. Он идСально Π·Π½Π°Π΅Ρ‚ английский язык, Π½ΠΎ ΠΏΠΎ-русски ΠΎΠ½ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ β€” Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ слова. Волько английский. Он ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π» Π² спорС ΠΈ обязался Π΄Π΅Π»Π°Ρ‚ΡŒ бСсприкословно всё Ρ‚ΠΎ, ΠΎ Ρ‡Ρ‘ΠΌ Π΅Π³ΠΎ попросит русский.
2. АссСмблСр — это ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ Вася Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠ°ΠΌΠ° Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΊΠ° Π° ΠΏΠ°ΠΏΠ° русский. Он Π·Π½Π°Π΅Ρ‚ идСально ΠΈ английский ΠΈ русский язык.
3.ΠœΡ‹ —это русский, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ΅Ρ…Π°Π» Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½. Ну Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ это ΠΌΡ‹=) ΠŸΡ€ΠΈ этом ΠΌΡ‹ идСально Π·Π½Π°Π΅ΠΌ русский язык ΠΈ (!!!) Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ английский β€” ΡΠ°ΠΌΡƒΡŽ ΠΌΠ°Π»ΠΎΡΡ‚ΡŒ, со словариком.
***
ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ β€” Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½ сидит Ρƒ Вас Π² ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ Π½Π° стулС. А Π’Ρ‹ сидитС сСбС Π·Π° ΠΊΠΎΠΌΠΏΠΎΠΌ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ этот пост, ΠΊΠ°ΠΊ Π²Π΄Ρ€ΡƒΠ³ Ρƒ Вас Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π»Π°ΡΡŒ Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡ΠΊΠ°! Π’ΠΎΡ‚ вСдь Π½Π΅Π·Π°Π΄Π°Ρ‡Π°! Π’Π΅Ρ‚Π΅Ρ€ Π΄ΡƒΠ΅Ρ‚, занавСска ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ»Π°ΡΡŒ Π² парус… Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ! Но Π²ΠΎΡ‚ вСдь ΠΊΠ°ΠΊ лСнь Π²ΡΡ‚Π°Π²Π°Ρ‚ΡŒ со стула, ΡΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΠ³ΠΈ с систСмника, Π·Π°ΠΏΠΈΡ…ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ‚Π°ΠΏΠΎΡ‡ΠΊΠΈ, ΠΎΡ‚ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΡ€ΡƒΠΆΠΊΡƒ с ΠΊΠΎΡ„Π΅(ΠΏΠΈΠ²ΠΎΠΌ) ΠΈ ΠΈΠ΄Ρ‚ΠΈ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ со стихиСй. И Ρ‚ΡƒΡ‚ Π’Ρ‹ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ осознаётС, Ρ‡Ρ‚ΠΎ Ρƒ нас Ρ‚ΠΎ Π² ΠΊΠΎΠΌΠ½Π°Ρ‚Π΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡΠΏΠΎΡ€ΠΈΠ²ΡˆΠΈΠΉ Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ самоС врСмя ΠΏΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒ! И Π²Ρ‹ Π΅ΠΌΡƒ Ρ‚Π°ΠΊ ΠΌΠΈΠ»ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Β«Π”Ρ€ΡƒΠΆΠΈΡ‰Π΅! Π—Π°ΠΊΡ€ΠΎΠΉ Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡ΠΊΡƒ поТалуйста, Π° ΠΏΠΎΡ‚ΠΎΠΌ моТСшь ΠΎΠΏΡΡ‚ΡŒ ΠΏΡ€ΠΈΡΠ΅ΡΡ‚ΡŒ Π½Π° стул!Β» Π° ΠΎΠ½ сидит, смотрит Π½Π° вас с Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚! МоТно ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΏΠΎ Ρ‰Π°ΠΌ Π½Π°Π΄Π°Π²Π°Ρ‚ΡŒ β€” Π½ΠΎ ΠΎΠ½ ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° всё Ρ€Π°Π²Π½ΠΎ вас Π½Π΅ ΠΏΠΎΠΉΠΌΡ‘Ρ‚! Π’ΠΎΠ³Π΄Π° Π’Ρ‹ Π·Π²ΠΎΠ½ΠΈΡ‚Π΅ своСму Π΄Ρ€ΡƒΠ³Ρƒ-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΡƒ Π’Π°ΡΠΈΠ»ΠΈΡŽ β€” ΠΎΠ½ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚, ΠΈ садится рядом с Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½ΠΎΠΌ Π½Π° стул. И Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ β€” ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄ΠΈ: Β«Π‘Ρ‚ΠΈΠ², ΠΏΠΎΠΉΠ΄ΠΈ ΠΈ Π·Π°ΠΊΡ€ΠΎΠΉ Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡ΠΊΡƒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ сядь Π½Π° стул!Β» ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° английский β€” Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈ ΠΈΠ΄Ρ‘Ρ‚ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡ΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈ садится Π½Π° стул.
Π’ этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ€ΠΎΠ»ΡŒ ассСмблСра Π² этой Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Β«ΠœΡ‹-АссСмблСр-ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Β»
Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π±Ρ‹ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ассСмблСр всС поняли? Π’ΠΎΠ³Π΄Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌ дальшС.
***

Π’Π°ΠΊ Π²ΠΎΡ‚, прСдставляСм Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. ВасС Π³ΠΎΠ²ΠΎΡ€ΠΈΡˆΡŒ β€” Β«Π‘Π»ΡƒΡˆΠ°ΠΉ, Π½Ρƒ ΠΊΠΎΡ€ΠΎΡ‡Π΅ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅Π»ΠΎ β€” я ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ Π΄ΠΎΠΌΠ° Π·Π°Π±Ρ‹Π», Ρ€Π°Π·Π΄Π΅Π»ΠΈ 56983 Π½Π° 2 ΠΈ скаТи Π‘Ρ‚ΠΈΠ²Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π· отТался Π½Π° ΠΊΡƒΠ»Π°ΠΊΠ°Ρ…Β» ΠΈ Вася Π½Π° ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π΅ считаСт ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π‘Ρ‚ΠΈΠ²Ρƒ ΠΏΠΎ-английски » ΠžΡ‚ΠΎΠΆΠΌΠΈΡΡŒ Π½Π° ΠΊΡƒΠ»Π°ΠΊΠ°Ρ… 28491 Ρ€Π°Π·» Π­Ρ‚ΠΎ называСтся Β«Π”Π˜Π Π•ΠšΠ’Π˜Π’ΠΒ» β€” Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° это Π·Π°Π΄Π°Π½ΠΈΠ΅ для Васи, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ это дСйствиС Π‘Ρ‚ΠΈΠ²Π°.

Π•ΡΡ‚ΡŒ другая ситуация β€” Π’Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ ВасС Β«Π‘ΠΊΠ°ΠΆΠΈ Π‘Ρ‚ΠΈΠ²Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ отТался 28491 Ρ€Π°Π·Β» ΠΈ Вася просто ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π’Π°ΡˆΠΈ слова Π½Π° английский. Π­Ρ‚ΠΎ называСтся ΠžΠŸΠ•Π ΠΠ’ΠžΠ 

Всё просто β€” Π΅ΡΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° ΠΈ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ β€” это Π’Π°ΡˆΠ΅ прямоС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π‘Ρ‚ΠΈΠ²Ρƒ β€” Вася Ρ‚ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π’Π°ΡˆΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° инглиш. А Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° β€” это Π·Π°Π΄Π°Π½ΠΈΠ΅ для самого Васи β€” ΠΈ Вася сначала Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π’Ρ‹ Π΅ΠΌΡƒ сказали, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π‘Ρ‚ΠΈΠ²Ρƒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΌΡƒΡ‡Π°Ρ‚ΡŒ Π°Π½Π³Π»ΠΈΡ‡Π°Π½ΠΈΠ½Π° рСгулярно! Но ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с нашим ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠΌ ВасСй. НуТно Π·Π½Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ β€” Вася всСгда Вас ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ΡΡ бСспрСкословно β€” Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ сказали, Ρ‚ΠΎ ΠΎΠ½ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚. Васин ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ дСсятичных Π·Π½Π°ΠΊΠΎΠ² β€” Ссли Π²Ρ‹ глянСтС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с отТиманиями Ρ‚ΠΎ 56983 \ 2 = 28491.5 β€” Π½ΠΎ Ρƒ Васи всё послС запятой обрубаСтся β€” ΠΈ ΠΎΠ½ Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»ΠΎΠ΅ число β€” ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π½Π΅Π²Π°ΠΆΠ½ΠΎ Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ 28491.000001 ΠΈΠ»ΠΈ Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ 28491.9999999 β€” для Васи это ΠΎΠ΄ΠΈΠ½ Ρ„ΠΈΠ³ Π±ΡƒΠ΄Π΅Ρ‚ 28491 Π² ΠΎΠ±ΠΎΠΈΡ… случаях. НичСго Π½Π΅ округляСтся. Π•Ρ‰Ρ‘ ваТная информация ΠΏΡ€ΠΎ Π’Π°ΡΡŽ. Вася ТСсток β€” Π΅ΠΌΡƒ ΠΏΠΎΡ„ΠΈΠ³ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π‘Ρ‚ΠΈΠ² затрахаСтся ΠΎΡ‚ΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ восСмь тысяч Ρ€Π°Π·. Π•ΠΌΡƒ сказали β€” Вася ΠΏΠ΅Ρ€Π΅Π²Ρ‘Π». ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π²Ρ‘Π» β€” Π½ΠΎ ΠΈ заставил ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π’Ρ‹ попросили. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π‘Ρ‚ΠΈΠ² ΠΏΠΎΠΌΡ€Ρ‘Ρ‚ Π½Π° Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ тысячи ΠΏΡΡ‚ΡŒΡΠΎΡ‚ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΌ ΠΎΡ‚ΠΆΠΈΠΌΠ°Π½ΠΈΠΈ β€” Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π’Π°ΡˆΠ° Π²ΠΈΠ½Π°.

БобствСнно это ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ всё. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ постС Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠΎΠΏΠ°Ρ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅ β€” ΠΏΠΎΠΊΠ° ΠΆΠ΅ просто достаточно ΠΏΠΎΠ½ΡΡ‚ΡŒ это. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ, ΠΊΡ‚ΠΎ исполняСт ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΈ Ρ‡Π΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° отличаСтся ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°.
А дальшС ΠΌΡ‹ постараСмся Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ всё своими ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΡ€ΠΈΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΆΠ΅ ассСмблСр Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ ΠΏΠΎ взрослому.

habr.com

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ ассСмблСр (C—) для AVR

Никакой язык программирования Π½Π΅ сравнится Π° ассСмблСром ΠΏΠΎ возмоТности ΠΏΠΈΡΠ°Ρ‚ΡŒ самый ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈ быстрый ΠΊΠΎΠ΄. На сСгодняшний дСнь, ΠΊΠ°ΠΊΠΈΠΌ Π±Ρ‹ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ Π½Π΅ Π±Ρ‹Π» компилятор, ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π±Ρ‹ Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ½ Π½Π΅ Ρ‚Π²ΠΎΡ€ΠΈΠ» с ΠΊΠΎΠ΄ΠΎΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π°Π»Π΅Π½. А ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ совсСм сильно Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½. По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, это Ρ‚ΠΎΡ‡Π½ΠΎ свойствСнно компилятору AVR GCC.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ассСмблСр для AVR — это Ρ…ΠΎΡ€ΠΎΡˆΠΎ

НС смотря Π½Π° всС утвСрТдСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ соврСмСнныС компиляторы Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, это Π½Π΅ Ρ‚Π°ΠΊ. По ΠΊΡ€.ΠΌΠ΅Ρ€Π΅, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ AVR GCC. ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ создаваСмый ΠΈΠΌ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ (ΠΈ, соотвСтствСнно, скорости выполнСния). Π’Π·ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ рСгистры Π½Π° стартС ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ. Π’Π°ΠΊ Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ AVR GCC часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ рСгистров большС, Ρ‡Π΅ΠΌ Π½Π°Π΄ΠΎ (Ρ‚.Π΅., ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… рСгистров Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ рСгистр ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ). И, соотвСтствСнно, ΠΈΠΌΠ΅Π΅ΠΌ лишнюю Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ/Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡŽ ΠΈΠ· стСка (это ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со стСком Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎ Π΄Π²Π° ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°). ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ особСнно Π²Π°ΠΆΠ½Π° Ссли ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ дСсятки тысяч Ρ€Π°Π· Π² сСкунду, Ρ‚ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ устранСниС ΠΎΠ΄Π½ΠΎΠΉ лишнСй ΠΏΠ°Ρ€Ρ‹ PUSH/POP даст ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡƒΡŽ экономию рСсурсов CPU.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ — Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с дСсятком (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². GCC ΠΌΠΎΠΆΠ΅Ρ‚ свободно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΠΈΡ… рСгистров (r18 — r31, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Ρ‚ΡƒΡ‚) Π² ΠΊΠΎΠ΄Π΅ Π‘ΠΈ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΡΡΡŒ ΠΎ ΠΈΡ… сохранСнии. Если ΠΆΠ΅ этих рСгистров Π΅ΠΌΡƒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ, компилятор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ довольно β€œΠΆΠΈΡ€Π½Ρ‹Π΅β€ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ __prologue_saves__ ΠΈ __epilogue_restores__ ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Ρ‘. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ эти ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ стСкС ΠΈ Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ всС Π½ΠΈΠΆΠ½ΠΈΠ΅ рСгистры (всС, Π±Π΅Π· Ρ€Π°Π·Π±ΠΎΡ€Π°). Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Ρ‘Ρ‚ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹ΠΉ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄. ΠŸΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ часто этой ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, пСрСписанной Ρ€ΡƒΠΊΠ°ΠΌΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ достаточно доступных рСгистров, ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ придётся.

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

Π˜Ρ‚ΠΎΠ³ΠΎ, Π½Π° ассСмблСрС ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ Π½Π° Π½Ρ‘ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ совсСм простыС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ. И, Π΄Π°, Ссли ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π½Π° ассСмблСрС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ свободно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Ρ‘ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ рСгистры r0-r17, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ GCC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ (ΠΈ ΠΏΡ€ΠΈ написании ассСмблСрных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· Π‘ΠΈ-ΠΊΠΎΠ΄Π°, программист Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ сохранСнии ΠΈ восстановлСнии этих рСгистров).

Один наглядный ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ uint16-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π‘-ΠΊΠΎΠ΄ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π΅Π½:


ISR(TIMER1_OVF_vect) {
	counter16++;
}

Π‘Π³Π΅Ρ€Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ компилятором ассСмблСрный ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС:


  ISR(TIMER1_OVF_vect) {
    3a0c:	1f 92       	push	r1
    3a0e:	0f 92       	push	r0
    3a10:	0f b6       	in	r0, 0x3f	; 63
    3a12:	0f 92       	push	r0
    3a14:	11 24       	eor	r1, r1
    3a16:	8f 93       	push	r24
    3a18:	9f 93       	push	r25
	counter16++;
    3a1a:	80 91 3e 04 	lds	r24, 0x043E	; 0x80043e 
    3a1e:	90 91 3f 04 	lds	r25, 0x043F	; 0x80043f 
    3a22:	01 96       	adiw	r24, 0x01	; 1
    3a24:	90 93 3f 04 	sts	0x043F, r25	; 0x80043f 
    3a28:	80 93 3e 04 	sts	0x043E, r24	; 0x80043e 
}
    3a2c:	9f 91       	pop	r25
    3a2e:	8f 91       	pop	r24
    3a30:	0f 90       	pop	r0
    3a32:	0f be       	out	0x3f, r0	; 63
    3a34:	0f 90       	pop	r0
    3a36:	1f 90       	pop	r1
    3a38:	18 95       	reti

Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит:

  • Π—Π°Ρ‡Π΅ΠΌ-Ρ‚ΠΎ сохраняСтся рСгистр r1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. Π”Π°Π»Π΅Π΅ r1 зануляСтся
  • Π—Π°Ρ‡Π΅ΠΌ-Ρ‚ΠΎ сохраняСтся рСгистр r0, Π° Π·Π°Ρ‚Π΅ΠΌ SREG
  • ВыполняСтся ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ счётчика
  • Π‘ΠΎΡ…Ρ€Π°Π½Ρ‘Π½Π½Ρ‹Π΅ рСгистры Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ· стСка, дСлаСтся Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· прСрывания

Π˜Ρ‚ΠΎΠ³ΠΎ 19 ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ 46 Π±Π°ΠΉΡ‚. ΠŸΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ r0 ΠΈ r1 Ρ‚ΡƒΡ‚ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ нСобходимости, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:


  push	r24
  push	r25
  in    r24, SREG
  push  r24
  lds   r24, counter16
  lds   r25, counter16+1
  adiw	r24, 1
  sts   counter16+1, r25
  sts   counter16, r24
  pop   r24
  out   SREG, r24
  pop   r25
  pop   r24
  reti

Π˜Ρ‚ΠΎΠ³ΠΎ получаСтся 14 ΠΊΠΎΠΌΠ°Π½Π΄ (ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ избавились ΠΎΡ‚ 4Ρ… Π»ΠΈΡˆΠ½ΠΈΡ… push/pop ΠΊΠΎΠΌΠ°Π½Π΄, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎ 2 Ρ‚Π°ΠΊΡ‚Π°). Если Π±Ρ‹ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ adiw, ΠΈ SREG Π±Ρ‹ Π½Π΅ модифицировался, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ 4 инструкции. GCC ΠΆΠ΅ Ρ‚ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ стандартный шаблон для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сохраняСт всё, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π² Π‘ΠΈ-ΠΊΠΎΠ΄Π΅.

НСмного Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΈ Ρ†ΠΈΡ„Ρ€

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ассСмблСр — это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΌΠΎΠ³Ρƒ привСсти ДисплСйный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ 128Ρ…128, Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ ATMega328P, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π½Π° частотС 20 ΠœΠ“Ρ†. ΠœΠΎΠ΄ΡƒΠ»ΡŒ, Π²ΠΎΠΎΠ±Ρ‰Π΅ΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π½Π΅ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚, Π½ΠΎ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΌΠ½Π΅ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ATMega8A Π½Π° 16 ΠœΠ“Ρ†. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° послСднСй ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ — ΠΎΠ½Π° ΡˆΡ‚Π°Ρ‚Π½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° максимальной частотС ΠΏΡ€ΠΈ ΠΏΠΈΡ‚Π°Π½ΠΈΠΈ ΠΎΡ‚ 3.3Π’ (ATMega328P ΠΏΠΎ Π΄Π°Ρ‚Π°ΡˆΠΈΡ‚Ρƒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ напряТСнии Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 10 ΠœΠ“Ρ†), стоит Π² Ρ€Π°Π·Π° Π² 3-4 дСшСвлС, Π΄Π° ΠΈ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ Π΅Ρ‘ Π»Π΅Π³Ρ‡Π΅. Π’ΠΎΠΎΠ±Ρ‰Π΅ΠΌ, Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΌΠ½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для ZX-ΠΌΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½Π° дисплСйный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ ΠΎΡ‚ 3.3Π’ Π½Π° ATMega8A, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΡ€Π΅Π·Π°Π½Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ, Π½ΠΎ с максимально ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΉ ΠΈ быстрой ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΎΠΉ. ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° модуля Π½Π° ATMega328P Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π»Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² ΠΏΠΎΡ‡Ρ‚ΠΈ 20Кб (ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€ΠΎΠ²Π½ΠΎ 7Кб Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹, 5Ρ…7 ΠΈ 13Ρ…15). Π¨Ρ€ΠΈΡ„Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΡƒΠΆΠ°Ρ‚Ρ‹ Π΄ΠΎ 3.5 ΠšΠ‘ ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ΄ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 4ΠΊΠ± Ρ„Π»Π΅ΡˆΠ° (с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π΅Ρ‰Ρ‘ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ мСсто для bootloader-Π°). Π’ ΠΈΡ‚ΠΎΠ³Π΅, ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²ΠΏΠΈΡ…Π½ΡƒΡ‚ΡŒ всю ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 3Кб, сохранив основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», Π° ΠΈΠΌΠ΅Π½Π½ΠΎ рисованиС Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Π»ΠΈΠ½ΠΈΠΉ, рисованиС ΠΈ Π·Π°Π»ΠΈΠ²ΠΊΠ° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², окруТностСй ΠΈ тСкста (ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ 5Ρ…7 ΠΈ 13Ρ…15, Π»Π°Ρ‚ΠΈΠ½ΠΈΡ†Π° + ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π° + основныС символы). ΠŸΡ€ΠΈ этом Π±Ρ‹Π» ΡƒΠ΄Π°Π»Ρ‘Π½ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ, ΠΏΠΈΡ‰Π°Π»ΠΊΠΎΠΉ ΠΈ подсвСткой (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π² случаС ZX-ΠΌΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½Π° ΠΎΠ½ Π½Π΅ Π½ΡƒΠΆΠ΅Π½), Π½ΠΎ ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ свободных ΠΏΠΎΠ»ΡƒΡ‚ΠΎΡ€Π° ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π½Π° эти Π²Π΅Ρ‰ΠΈ. ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ Π²Ρ‹ΡˆΠ΅, Ρ‚.ΠΊ., Ρ‡Π΅ΠΌ мСньшС ΠΊΠΎΠ΄Π°, Ρ‚Π΅ΠΌ быстрСС ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ассСмблСр для AVR уТасСн

Π¦Π΅Π½Π° эффСктивности ассСмблСра — Π΅Π³ΠΎ высокая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π₯отя, сама ΠΏΠΎ сСбС систСма ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ МК достаточно проста. Но ассСмблСрныС компиляторы Π΄ΠΎ бСзобразия ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ (ΠΏΠΎ ΠΊΡ€.ΠΌΠ΅Ρ€Π΅, AVRA ΠΈ GCC). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° состоит ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ рСгистры для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ВсСго доступно 32 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… рСгистра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ основныС Π΄Π°Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но, ΠΏΡ€ΠΈ этом, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ возмоТности ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ этим рСгистрам ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ осмыслСнныС ΠΈΠΌΠ΅Π½Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. А чСловСчСский ΠΌΠΎΠ·Π³, ΠΊΠ°ΠΊ извСстно, ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с 7Β±2 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. И, ΠΊΠΎΠ³Π΄Π° этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Ρ‚.Π΅., рСгистров) Ρ€Π°Π·Π° Π² Π΄Π²Π° большС, Ρ‚ΠΎ ΠΌΠΎΠ·Π³ взрываСтся, ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΡƒΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ соотвСтствия ΠΌΠ΅ΠΆΠ΄Ρƒ рСгистрами ΠΈ ΠΈΡ… Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, становится катСгоричСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. А Π΅Ρ‰Ρ‘ слоТнСС Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ нСвыносимоС нСудобство — это ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² функциям. Π’ΡƒΡ‚, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, приходится Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΡƒΠΌΠ΅ (ΠΈΠ»ΠΈ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ), Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ рСгистрС пСрСдаётся. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ Π²ΡΡΠΊΡƒΡŽ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°.

Одно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ устранСниС этих Π΄Π²ΡƒΡ… нСудобств Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π² Ρ€Π°Π·Ρ‹ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. Π’ΠΎΠΎΠ±Ρ‰Π΅, Ρ‚ΡƒΡ‚ ΠΌΠ½Π΅ вспоминаСтся язык Π‘—, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π‘ΠΈ-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π»Ρ‘Π³ΠΊΠΈΠΌΠΈ ассСмблСрными вставками ΠΈ доступом ΠΊ рСгистрам ΠΊΠ°ΠΊ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Достаточно забавная Π±Ρ‹Π»Π° ΡˆΡ‚ΡƒΠΊΠ°, Π½ΠΎ, ΠΊ соТалСнию, для AVR Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ создано.

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ для ассСмблСра

Осознав, Ρ‡Ρ‚ΠΎ Π½Π° чистом ассСмблСрС ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ большоС Ρ€Π΅ΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, я Ρ€Π΅ΡˆΠΈΠ» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой прСпроцСссор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ синтаксис языка ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» для компиляции. ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ написан Π½Π° явС ΠΈ Π΄Ρ€ΡƒΠΆΠΈΡ‚ с Atmel assembler/AVRA ΠΈ AVR GCC.

Π‘Π½Π°Ρ‡Π°Π»Π° я Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ понятиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ псСвдонимы для рСгистров ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ, сдСлал Ρ†ΠΈΠΊΠ»Ρ‹ ΠΈ условныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π”Π°Π»Π΅Π΅ — Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ рСгистров ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΌ Ρ†Π΅Π»Ρ‹ΠΌ (для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π»ΠΈΠ½ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ 8 Π±ΠΈΡ‚). По ΠΌΠ΅Ρ€Π΅ развития ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° исходном, ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ ассСмблСрном ΠΊΠΎΠ΄Π΅, ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ всС мСньшС ΠΈ мСньшС ассСмблСра..

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ позволяСт ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° чистом ассСмблСрС, дСля ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ вставки, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π‘ΠΈ-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ синтаксис.

Бинтаксис

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹

Π§Ρ‚ΠΎΠ±Ρ‹ быстро ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ возмоТности языка, рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ функция рисования ΠΊΡ€ΡƒΠ³Π°, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всСго 10 рСгистров — Ρ‚Ρ€ΠΈ — Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСмь — Π² качСствС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ИмСнно эта функция, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ написанной Π½Π° ассСмблСрС, заставила мСня Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ прСпроцСссор — Π΅Ρ‘ ΠΊΠΎΠ΄ Π±Ρ‹Π» Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌ.


.proc drawCircle
   .args circle_x(r24), circle_y(r22), radius(r20)
   .use r19 as x0, r16 as y0
   .use r26 as ddF_x, r27 as ddF_y
   .use r30 as x, r31 as y, r23 as f

   x0 = circle_x
   y0 = circle_y
   f = 1 - radius
   ddF_x = 1
   ddF_y = radius
   x = 0
   y = radius
   ddF_y = -ddF_y
   ddF_y += ddF_y

   rcall drawPixel (x: circle_x,   y: circle_y+radius)
   rcall drawPixel (x: x0,   y: y0-y)
   rcall drawPixel (x: x0+y, y: y0)
   rcall drawPixel (x: x0-y, y: y0)

   loop {
      if s(x >= y) {
        ret
      }
      if (!f[7]) {
        y -= 1
        ddF_y += 2
        f += ddF_y
      }
      x++
      ddF_x += 2
      f += ddF_x

      rcall drawPixel(x: x0 + x, y: y0 + y)
      rcall drawPixel(x: x0 + x, y: y0 - y)
      rcall drawPixel(x: x0 - x, y: y0 - y)
      rcall drawPixel(x: x0 - x, y: y0 + y)

      rcall drawPixel(x: x0 + y, y: y0 + x)
      rcall drawPixel(x: x0 + y, y: y0 - x)
      rcall drawPixel(x: x0 - y, y: y0 + x)
      rcall drawPixel(x: x0 - y, y: y0 - x)
   }
.endproc

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ объявляСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ .proc. Имя ΠΏΡ€ΠΎΠ΄Π΅Π΄ΡƒΡ€Ρ‹ станСт ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ Π² ассСмблСрном ΠΊΠΎΠ΄Π΅. Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Ρ‘Ρ‚ объявлСниС Ρ‚Ρ€Ρ‘Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ .args— ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ радиуса окруТности. Π”Π°Π»Π΅Π΅, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .use ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ псСвдонимы для рСгистров, вСсь дальнСйший ΠΊΠΎΠ΄ Π±Π΅Π΄Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΈ. ВмСсто ассСмблСрных ΠΊΠΎΠΌΠ°Π½Π΄ mov, ldi ΠΈ Ρ€Π°Π·Π½ΠΎΠΉ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ простыС матСматичСскиС выраТСния. Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свои Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с символа @, эти ΠΌΠ΅Ρ‚ΠΊΠΈ Π²ΠΈΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° drawCircle Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ drawPixel, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° — ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ. АргумСнты ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· рСгистры. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ rcall) ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π½Π° Π½Π΅Ρ‘ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ rjmp) ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² скобках значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ имя : Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ (Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ рСгистры Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ). Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, Π΅Π³ΠΎ имя (вмСстС с Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ) ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Если Π½Π°Π΄ΠΎ ΡΠΎΡΠ»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π½Π΅ объявлСна Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ (Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π² AVR GCC), это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ .extern Ρ‚Π°ΠΊ:


.extern drawPixel (x: r24, y: r22)

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„Ρ†Π½ΠΊΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠΉ строкой (Π±Π΅Π· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ .args):


.proc drawCircle (circle_x: r24, circle_y: r22, radius: r20)
...

Π¦ΠΈΠΊΠ»Ρ‹

Часто Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» со счётчиком ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π΄ΠΎ нуля. Для этого слуТат Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° loop. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² Ρ†ΠΈΠΊΠ»Π΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ†ΠΈΠΊΠ»Π°:


delay_10ms:
  loop (r18 = 100) {
    rcall delay_100us
  }

Π’ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ рСгистр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅Π΄Π΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ счётчиком Ρ†ΠΈΠΊΠ»Π° ΠΈ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) Π΅Π³ΠΎ стартовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это 100, ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ содСрТимоС Π±Π»ΠΎΠΊΠ°). Если рСгистр Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ бСсконСчно. Π’Π°ΠΊΠΆΠ΅ Π² Ρ†ΠΈΠΊΠ»Π°Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ break (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π° Ρ†ΠΈΠΊΠ»ΠΎΠΌ) ΠΈ continue (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ Ρ†ΠΈΠΊΠ»Π° Π½Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ счётчика).

УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² ΡƒΠΌΠ΅ Π±ΠΎΠ»Π΅Π΅ 20 ассСмблСрных ΠΊΠΎΠΌΠ°Π½Π΄ условных ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ if ΠΈ else. Π•Ρ‘ условиСм ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ

  • арифмСтичСскоС сравнСниС (==, !=, <, >, <=, >=)
  • ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° рСгистра
  • ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ„Π»Π°Π³Π° рСгистра SREG
  • ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±ΠΈΡ‚Π° ΠΏΠΎΡ€Ρ‚Π° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°

УсловиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ простым (&& ΠΈ || Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ). ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌΠΈ ΠΈ Π±Π»ΠΎΡ‡Π½Ρ‹ΠΌΠΈ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ возмоТности if:


if (!io[UCSRA].UDRE) goto UartSendChar		; wait for empty buffer

if (!r11[0]) ret

if (!F_ZERO) goto @return

if (r21 == 0xFE) goto send_command

if (r21.r22 < ZH.ZL) break

if (ZH.ZL.XH.XL >= r4.r3.r2.r1) {
  ZH.ZL.XH.XL -= r4.r3.r2.r1
  F_CARRY = 1
} else {
  F_CARRY = 0
}

Π“Ρ€ΡƒΠΏΠΏΡ‹ рСгистров

ΠšΡ€ΠΎΠΌΠ΅ 32 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… рСгистров доступны рСгистровыС ΠΏΠ°Ρ€Ρ‹ X, Y ΠΈ Z (ΠΈΡ… ΠΈΠΌΠ΅Π½Π° всСгда ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ). Π’.ΠΊ. 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… рСгистров AVR Π½Π΅ всСгда достаточно, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Π² Π³Ρ€ΡƒΠΏΠΏΡ‹ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. НапримСр Ρ‚Π°ΠΊ:


loop {
    if (r11.r12 < ZH.ZL) break
    r11.r12 -= ZH.ZL
  }

Π“Ρ€ΡƒΠΏΠΏΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² матСматичСских выраТСниях, Ρ‚Π°ΠΊ ΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ константы

РСгистры — это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ ΠΈΡ… Π½Π° всё Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚. ΠšΡ€ΠΎΠΌΠ΅ рСгистров Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² памяти. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ²:

Π˜ΠΌΡΠ Π°Π·ΠΌΠ΅Ρ€ (Π±Π°ΠΉΡ‚)ОписаниС
byte1Одно-байтовая пСрСмСнная Π² ΠžΠ—Π£
word2Π”Π²ΡƒΡ…-байтовая пСрСмСнная Π² ΠžΠ—Π£
dword4Π§Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ…-байтовая пСрСмСнная Π² ΠžΠ—Π£
pointer2Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠžΠ—Π£, массив
ptr2Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константный массив (строку) Π²ΠΎ Ρ„Π»Π΅Ρˆ-памяти

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:


.extern s_video_mem : ptr
.extern var_b : byte
.extern var_w : word
.extern var_dw : dword

txtErr:
	.DB "Error in parameter!"
	
Z = txtUartErr    ; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ Z смСщСниС строки-константы

ΠœΠ°ΡΡΠΈΠ²Ρ‹ PRG, RAM ΠΈ IO

Для доступа ΠΊ ΠžΠ—Π£, ΠŸΠ—Π£ ΠΈ ΠΏΠΎΡ€Ρ‚Π°ΠΌ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Π·ΠΈ-массивы с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ram[], prg[] ΠΈ io[] соотвСтствСнно. НапримСр ΠΊΠΎΠΌΠ°Π½Π΄Π°


   r0 = io[PINA]

ΠΏΡ€ΠΎΡ‡Ρ‚Ρ‘Ρ‚ ΠΈ сохранит содСрТимоС ΠΏΠΎΡ€Ρ‚Π° PINA Π² рСгистрС r0

Доступ ΠΊ ΠΏΠΎΡ€Ρ‚Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°ΠΌ, доступ ΠΊ памяти Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ адрСсам-рСгистровым ΠΏΠ°Ρ€Π°ΠΌ. Π’.Π΅., Ρ‚ΡƒΡ‚ всё ΠΊΠ°ΠΊ Π² ассСмблСрС, Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ адрСс Π΄ΠΎ ΠΈΠ»ΠΈ послС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:


  r0 = ram[Z++] ; ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚ ΠΈΠ· ΠžΠ—Π£ с пост-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ указатСля Z
  r1 = prg[--X] ; ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚ ΠΈΠ· Ρ„Π»Π΅Ρˆ-памяти с ΠΏΡ€Π΅Π΄-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ указатСля X

Π§Ρ‚Π΅Π½ΠΈΠ΅/запсись ΠΈΠ· ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ памяти Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· рСгистр. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ конструкция ΠΏΡ€ΠΎΡ‡Ρ‚Ρ‘Ρ‚ Π±Π°ΠΉΡ‚ ΠΈΠ· памяти, адрСсованной рСгистровой ΠΏΠ°Ρ€ΠΎΠΉ Z Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ рСгистр r0, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСдаст Π΅Π³ΠΎ Π² ΠΏΠΎΡ€Ρ‚ UART-Π° UDR:


  io[UDR] = r0 = ram[Z]

А Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ 16 Π±Π°ΠΉΡ‚ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° Π² памяти Π² ΠΏΠΎΡ€Ρ‚ UART:


  loop (r1 = 16) {
    if (!io[UCSRA].UDRE) continue	; ΠΆΠ΄Ρ‘ΠΌ, ΠΏΠΎΠΊΠ° Π±ΡƒΡ„Π΅Ρ€ пуст
    io[UDR] = r0 = ram[Z++]
  }

Π’ΡƒΡ‚ Π΅Ρ‰Ρ‘ Ρ€Π°Π· стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ continue пСрСдаст ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° Ρ†ΠΈΠΊΠ»Π° ΠΈ счётчик r1 ΠΏΡ€ΠΈ этом Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½.

А этот ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡ‡Ρ‚Ρ‘Ρ‚ строку ΠΈΠ· памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ пСрСдаст Π΅Ρ‘ ΠΏΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рисования Π½Π° дисплСС:


loop (len) {
  rcall	writeToLCD (prg[Z++])
  rcall	delay40us
}

Π€Π»Π°Π³ΠΈ

Для доступа ΠΊ Ρ„Π»Π°Π³Π°ΠΌ рСгистра SREG Π²Π²Π΅Π΄Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ²Π°Π·ΠΈ-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: F_GLOBAL_INT, F_BIT_COPY, F_HALF_CARRY, F_SIGN, F_TCO, F_NEG, F_ZERO, F_CARRY Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС условий ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ifgoto ΠΈ присвоСния.

Как этим ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ

Π­Ρ‚ΠΎ описаниС ΠΎΡ‡Π΅Π½ΡŒ повСрхностноС ΠΈ навряд Π»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π›ΡƒΡ‡ΡˆΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с языком ΠΌΠΎΠΆΠ½ΠΎ посмотрСв исходники Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚: ЧастотомСр-тСстСр ΠΊΠ²Π°Ρ€Ρ†Π΅Π²
Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊ, пСрСписанный Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ синтаксис
ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ассСмблСрный исходник

Π’ΡƒΡ‚ я старался особо Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, ΠΈ оставил ΠΈΡ… Π½Π° ассСмблСрС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡ‚Ρ‹. ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ пСрСписан.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ 86РК Камиля ΠšΠ°Ρ€ΠΈΠΌΠΎΠ²Π°
Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹, ΠΈ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ (Π΄Π° простит мСня Π°Π²Ρ‚ΠΎΡ€, Π½ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π·Π°Ρ‚ΠΎΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ ΠΏΠΎΠ΄ сСбя) Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.
Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊ, пСрСписанный Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ синтаксис
Π”Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ассСмблСрный исходник

Для сборки этих ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ avr-builder, прСпроцСссор Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ Π² Π½Π΅Π³ΠΎ, Π° скрипты для сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ Π² ΠΈΡ… рСпозиториях. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΠΎΡ€ синтаксиса, Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ» make.builder ΠΎΠ΄Π½Ρƒ строку:


asm_ext = True

Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ сборкС всС ассСмблСрный Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒΡΡ Ρ‡Π΅Ρ€Π΅Π· прСпроцСссор avr-asm-ext. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прСпроцСссора Π² систСмС Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ установлСна Java.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ прСпроцСссора ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСписываСтся с нуля с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ вмСсто прСпроцСссора ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ компилятор со своСй срСдой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ это ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для IDE NetBeans). ΠšΡ€ΠΎΠΌΠ΅ AVR планируСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, Π² частности, Z80.

Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ прСпроцСссора Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅

trolsoft.ru

ЛСкция 3 ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π½Π° ассСмблСрС avr

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ транслируСт исходныС ΠΊΠΎΠ΄Ρ‹ с языка ассСмблСра Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² симуляторС ATMEL AVR Studio, Π»ΠΈΠ±ΠΎ Π² эмуляторС ATMEL AVR In-Circuit Emulator. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСпосрСдствСнно Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ AVR.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ Microsoft Windows 3.11, Microsoft Windows95 ΠΈ Microsoft Windows NT. ΠšΡ€ΠΎΠΌΠ΅ этого Π΅ΡΡ‚ΡŒ консольная вСрсия для MS-DOS.

Набор инструкций сСмСйства ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR описан Π² Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ, для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ инструкциям ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ описанию инструкций ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, содСрТащими инструкции, ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ².

Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Π΅Π΅ 120 символов.

Π›ΡŽΠ±Π°Ρ строка ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с ΠΌΠ΅Ρ‚ΠΊΠΈ, которая являСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ символов Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ. ΠœΠ΅Ρ‚ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для указания мСста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пСрСдаётся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ для задания ΠΈΠΌΡ‘Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Входная строка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… Ρ„ΠΎΡ€ΠΌ:

[ΠΌΠ΅Ρ‚ΠΊΠ°:] Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° [ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹] [ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ][ΠΌΠ΅Ρ‚ΠΊΠ°:] инструкция [ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹] [ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ]ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉΠŸΡƒΡΡ‚Π°Ρ строка

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

; [ВСкст]

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… скобках Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. ВСкст послС Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой (;) ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки игнорируСтся компилятором. ΠœΠ΅Ρ‚ΠΊΠΈ, инструкции ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½ΠΈΠΆΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

label:Β Β Β Β  .EQU var1=100 ; УстанавливаСт var1 Ρ€Π°Π²Π½Ρ‹ΠΌ 100 (Π­Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°)Β Β Β Β Β Β Β Β Β Β  .EQU var2=200 ; УстанавливаСт var2 Ρ€Π°Π²Π½Ρ‹ΠΌ 200

test:Β Β Β Β Β  rjmp testΒ Β Β Β  ; БСсконСчный Ρ†ΠΈΠΊΠ» (Π­Ρ‚ΠΎ инструкция)Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; Π‘Ρ‚Ρ€ΠΎΠΊΠ° с ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  ; Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° строка с ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ‚ΠΊΠΈ, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈΠ»ΠΈ инструкции Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ строки.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ процСссоров avr

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ процСссоров AVR, Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² AVR Data Book. Β 

АрифмСтичСскиС ΠΈ логичСскиС инструкции

МнСмоника

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹

ОписаниС

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

Π€Π»Π°Π³ΠΈ

Π¦ΠΈΠΊΠ»Ρ‹

ADDΒ 

Rd,RrΒ 

Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π· пСрСноса

Rd = Rd + RrΒ 

Z,C,N,V,H,SΒ 

1

ADC

Rd,Rr

Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с пСрСносом

Rd = Rd + Rr + C

Z,C,N,V,H,S

1

SUB

Rd,Rr

Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π±Π΅Π· пСрСноса

Rd = Rd — Rr

Z,C,N,V,H,S

1

SUBI

Rd,K8

Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ константы

Rd = Rd — K8

Z,C,N,V,H,S

1

SBC

Rd,Rr

Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ с пСрСносом

Rd = Rd — Rr — C

Z,C,N,V,H,S

1

SBCI

Rd,K8

Π’Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ константы с пСрСносом

Rd = Rd — K8 — C

Z,C,N,V,H,S

1

AND

Rd,Rr

ЛогичСскоС И

Rd = Rd Β· Rr

Z,N,V,SΒ 

1

ANDI

Rd,K8

ЛогичСскоС И с константой

Rd = Rd Β· K8

Z,N,V,S

1

OR

Rd,Rr

ЛогичСскоС Π˜Π›Π˜

Rd = Rd V Rr

Z,N,V,S

1

ORI

Rd,K8

ЛогичСскоС Π˜Π›Π˜ с константой

Rd = Rd V K8

Z,N,V,S

1

EOR

Rd,Rr

ЛогичСскоС ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π˜Π›Π˜

Rd = Rd EOR Rr

Z,N,V,S

1

COM

Rd

ΠŸΠΎΠ±ΠΈΡ‚Π½Π°Ρ Π˜Π½Π²Π΅Ρ€ΡΠΈΡ

Rd = $FF — Rd

Z,C,N,V,S

1

NEG

Rd

ИзмСнСниС Π·Π½Π°ΠΊΠ° (Π”ΠΎΠΏ. ΠΊΠΎΠ΄)

Rd = $00 — Rd

Z,C,N,V,H,S

1

SBR

Rd,K8

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ (Π±ΠΈΡ‚Ρ‹) Π² рСгистрС

Rd = Rd V K8

Z,C,N,V,S

1

CBR

Rd,K8

Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π±ΠΈΡ‚ (Π±ΠΈΡ‚Ρ‹) Π² рСгистрС

Rd = Rd Β· ($FF — K8)

Z,C,N,V,S

1

INC

Rd

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра

Rd = Rd + 1

Z,N,V,S

1

DEC

Rd

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра

Rd = Rd -1

Z,N,V,S

1

TST

Rd

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ноль Π»ΠΈΠ±ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

Rd = Rd Β· Rd

Z,C,N,V,S

1

CLR

Rd

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ рСгистр

Rd = 0

Z,C,N,V,S

1

SER

Rd

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ рСгистр

Rd = $FF

None

1

ADIW

Rdl,K6

Π‘Π»ΠΎΠΆΠΈΡ‚ΡŒ константу ΠΈ слово

Rdh:Rdl = Rdh:Rdl + K6Β 

Z,C,N,V,S

2

SBIW

Rdl,K6

Π’Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ константу ΠΈΠ· слова

Rdh:Rdl = Rdh:Rdl — K 6

Z,C,N,V,S

2

MUL

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ чисСл Π±Π΅Π· Π·Π½Π°ΠΊΠ°

R1:R0 = Rd * Rr

Z,C

2

MULS

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ чисСл со Π·Π½Π°ΠΊΠΎΠΌ

R1:R0 = Rd * Rr

Z,C

2

MULSU

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ числа со Π·Π½Π°ΠΊΠΎΠΌ с числом Π±Π΅Π· Π·Π½Π°ΠΊΠ°

R1:R0 = Rd * Rr

Z,C

2

FMUL

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… чисСл Π±Π΅Π· Π·Π½Π°ΠΊΠ°

R1:R0 = (Rd * Rr) << 1

Z,C

2

FMULS

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… чисСл со Π·Π½Π°ΠΊΠΎΠΌ

R1:R0 = (Rd *Rr) << 1

Z,C

2

FMULSU

Rd,Rr

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ числа со Π·Π½Π°ΠΊΠΎΠΌ с числом Π±Π΅Π· Π·Π½Π°ΠΊΠ°

R1:R0 = (Rd * Rr) << 1

Z,C

2

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ вСтвлСния

МнСмоника

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹

ОписаниС

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

Π€Π»Π°Π³ΠΈ

Π¦ΠΈΠΊΠ»Ρ‹

RJMP

k

ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

PC = PC + k +1

None

2

IJMP

НСт

ΠšΠΎΡΠ²Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° (Z)

PC = Z

None

2

EIJMP

НСт

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ косвСнный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND

None

2

JMP

k

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

PC = k

None

3

RCALL

k

ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

STACK = PC+1, PC = PC + k + 1

None

3/4*

ICALL

НСт

ΠšΠΎΡΠ²Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² (Z)

STACK = PC+1, PC = ZΒ 

None

3/4*

EICALL

НСт

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ косвСнный Π²Ρ‹Π·ΠΎΠ² (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND

None

4*

CALL

k

Π’Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

STACK = PC+2, PC = k

None

4/5*

RET

НСт

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

PC = STACK

None

4/5*

RETI

НСт

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· прСрывания

PC = STACK

I

4/5*

CPSE

Rd,Rr

Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ссли Ρ€Π°Π²Π½Ρ‹Β 

if (Rd ==Rr) PC = PC 2 or 3

None

1/2/3

CP

Rd,Rr

Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ

Rd -Rr

Z,C,N,V,H,S

1

CPC

Rd,Rr

Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ с пСрСносом

Rd — Rr — C

Z,C,N,V,H,S

1

CPI

Rd,K8

Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ с константой

Rd — K

Z,C,N,V,H,S

1

SBRC

Rr,b

ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ссли Π±ΠΈΡ‚ Π² рСгистрС ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(Rr(b)==0) PC = PC + 2 or 3

None

1/2/3

SBRS

Rr,b

ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ссли Π±ΠΈΡ‚ Π² рСгистрС установлСн

if(Rr(b)==1) PC = PC + 2 or 3

None

1/2/3

SBIC

P,b

ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ссли Π±ΠΈΡ‚ Π² ΠΏΠΎΡ€Ρ‚Ρƒ ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(I/O(P,b)==0) PC = PC + 2 or 3

None

1/2/3

SBIS

P,b

ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ссли Π±ΠΈΡ‚ Π² ΠΏΠΎΡ€Ρ‚Ρƒ установлСн

if(I/O(P,b)==1) PC = PC + 2 or 3

None

1/2/3

BRBC

s,k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ Π² SREG ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(SREG(s)==0) PC = PC + k + 1

None

1/2

BRBS

s,k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ Π² SREG установлСн

if(SREG(s)==1) PC = PC + k + 1

None

1/2

BREQ

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ€Π°Π²Π½ΠΎ

if(Z==1) PC = PC + k + 1

None

1/2

BRNE

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Π½Π΅ Ρ€Π°Π²Π½ΠΎ

if(Z==0) PC = PC + k + 1

None

1/2

BRCS

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли пСрСнос установлСн

if(C==1) PC = PC + k + 1

None

1/2

BRCC

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли пСрСнос ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(C==0) PC = PC + k + 1

None

1/2

BRSH

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ€Π°Π²Π½ΠΎ ΠΈΠ»ΠΈ большС

if(C==0) PC = PC + k + 1

None

1/2

BRLO

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли мСньшС

if(C==1) PC = PC + k + 1

None

1/2

BRMI

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли минус

if(N==1) PC = PC + k + 1

None

1/2

BRPL

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли плюс

if(N==0) PC = PC + k + 1

None

1/2

BRGE

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ (со Π·Π½Π°ΠΊΠΎΠΌ)

if(S==0) PC = PC + k + 1

None

1/2

BRLT

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли мСньшС (со Π·Π½Π°ΠΊΠΎΠΌ)

if(S==1) PC = PC + k + 1

None

1/2

BRHS

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ пСрСноса установлСн

if(H==1) PC = PC + k + 1

None

1/2

BRHC

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ пСрСноса ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(H==0) PC = PC + k + 1

None

1/2

BRTS

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ T установлСн

if(T==1) PC = PC + k + 1

None

1/2

BRTC

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ T ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(T==0) PC = PC + k + 1

None

1/2

BRVS

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ пСрСполнСния установлСн

if(V==1) PC = PC + k + 1

None

1/2

BRVC

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли Ρ„Π»Π°Π³ пСрСполнСния ΠΎΡ‡ΠΈΡ‰Π΅Π½

if(V==0) PC = PC + k + 1

None

1/2

BRIE

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли прСрывания Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹

if(I==1) PC = PC + k + 1

None

1/2

BRID

k

ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ссли прСрывания Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹

if(I==0) PC = PC + k + 1

None

1/2

* Для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ количСство Ρ†ΠΈΠΊΠ»ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡ€ΠΈ условии доступа ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ памяти Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшним ΠžΠ—Π£. Для инструкций CALL, ICALL, EICALL, RCALL, RET ΠΈ RETI, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° плюс ΠΏΠΎ Π΄Π²Π° Ρ†ΠΈΠΊΠ»Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ оТидания Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… с PC мСньшим 16 Π±ΠΈΡ‚ (128KB памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ). Для устройств с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΡΠ²Ρ‹ΡˆΠ΅ 128KB , Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠ² плюс ΠΏΠΎ Ρ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

МнСмоника

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹

ОписаниС

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

Π€Π»Π°Π³ΠΈ

Π¦ΠΈΠΊΠ»Ρ‹

MOV

Rd,Rr

Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСгистр

Rd = Rr

None

1

MOVW

Rd,Rr

Π‘ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ рСгистров

Rd+1:Rd = Rr+1:Rr, r,d even

None

1

LDI

Rd,K8

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ константу

Rd = K

None

1

LDS

Rd,k

ΠŸΡ€ΡΠΌΠ°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Rd = (k)

None

2*

LD

Rd,X

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Rd = (X)

None

2*

LD

Rd,X+

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Rd = (X), X=X+1

None

2*

LD

Rd,-X

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

X=X-1, Rd = (X)

None

2*

LD

Rd,Y

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Rd = (Y)

None

2*

LD

Rd,Y+

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Rd = (Y), Y=Y+1

None

2*

LD

Rd,-Y

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Y=Y-1, Rd = (Y)

None

2*

LDD

Rd,Y+q

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ

Rd = (Y+q)

None

2*

LD

Rd,Z

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

Rd = (Z)

None

2*

LD

Rd,Z+

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Rd = (Z), Z=Z+1

None

2*

LD

Rd,-Z

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Z=Z-1, Rd = (Z)

None

2*

LDD

Rd,Z+q

КосвСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° с Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ

Rd = (Z+q)

None

2*

STS

k,Rr

ΠŸΡ€ΡΠΌΠΎΠ΅ сохранСниС

(k) = Rr

None

2*

ST

X,Rr

КосвСнноС сохранСниС

(X) = Rr

None

2*

ST

X+,Rr

КосвСнноС сохранСниС с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

(X) = Rr, X=X+1

None

2*

ST

-X,Rr

КосвСнноС сохранСниС с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

X=X-1, (X)=Rr

None

2*

ST

Y,Rr

КосвСнноС сохранСниС

(Y) = Rr

None

2*

ST

Y+,Rr

КосвСнноС сохранСниС с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

(Y) = Rr, Y=Y+1

None

2

ST

-Y,Rr

КосвСнноС сохранСниС с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Y=Y-1, (Y) = Rr

None

2

ST

Y+q,Rr

КосвСнноС сохранСниС с Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ

(Y+q) = Rr

None

2

ST

Z,Rr

КосвСнноС сохранСниС

(Z) = Rr

None

2

ST

Z+,Rr

КосвСнноС сохранСниС с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

(Z) = Rr, Z=Z+1

None

2

ST

-Z,Rr

КосвСнноС сохранСниС с ΠΏΡ€Π΅-Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Z=Z-1, (Z) = Rr

None

2

ST

Z+q,Rr

КосвСнноС сохранСниС с Π·Π°ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ

(Z+q) = Rr

None

2

LPM

НСт

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

R0 = (Z)

None

3

LPM

Rd,Z

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

Rd = (Z)

None

3

LPM

Rd,Z+

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Rd = (Z), Z=Z+1

None

3

ELPM

НСт

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

R0 = (RAMPZ:Z)

None

3

ELPM

Rd,Z

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

Rd = (RAMPZ:Z)

None

3

ELPM

Rd,Z+

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти с пост-ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠΌ

Rd = (RAMPZ:Z), Z = Z+1

None

3

SPM

НСт

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

(Z) = R1:R0

None

ESPM

НСт

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ сохранСниС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ памяти

(RAMPZ:Z) = R1:R0

None

IN

Rd,P

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°

Rd = P

None

1

OUT

P,Rr

Π—Π°ΠΏΠΈΡΡŒ Π² ΠΏΠΎΡ€Ρ‚

P = Rr

None

1

PUSH

Rr

ЗанСсСниС рСгистра Π² стСк

STACK = Rr

None

2

POP

Rd

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ΠΈΠ· стСка

Rd = STACK

None

2

* Для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ количСство Ρ†ΠΈΠΊΠ»ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΡ€ΠΈ условии доступа ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ памяти Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с внСшним ΠžΠ—Π£. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH ΠΈ POP, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠΊΠ» плюс ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ оТидания.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚Π°ΠΌΠΈ

МнСмоника

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹

ОписаниС

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

Π€Π»Π°Π³ΠΈ

Π¦ΠΈΠΊΠ»Ρ‹

LSL

Rd

ЛогичСский сдвиг Π²Π»Π΅Π²ΠΎ

Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)

Z,C,N,V,H,S

1

LSR

Rd

ЛогичСский сдвиг Π²ΠΏΡ€Π°Π²ΠΎ

Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)

Z,C,N,V,S

1

ROL

Rd

ЦикличСский сдвиг Π²Π»Π΅Π²ΠΎ Ρ‡Π΅Ρ€Π΅Π· C

Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)

Z,C,N,V,H,S

1

ROR

Rd

ЦикличСский сдвиг Π²ΠΏΡ€Π°Π²ΠΎ Ρ‡Π΅Ρ€Π΅Π· C

Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)

Z,C,N,V,S

1

ASR

Rd

АрифмСтичСский сдвиг Π²ΠΏΡ€Π°Π²ΠΎ

Rd(n)=Rd(n+1), n=0,…,6

Z,C,N,V,S

1

SWAP

Rd

ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Ρ‚Π΅Ρ‚Ρ€Π°Π΄

Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)

None

1

BSETΒ 

s

Установка Ρ„Π»Π°Π³Π°

SREG(s) = 1

SREG(s)

1

BCLR

s

ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Ρ„Π»Π°Π³Π°

SREG(s) = 0

SREG(s)

1

SBI

P,b

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ Π² ΠΏΠΎΡ€Ρ‚Ρƒ

I/O(P,b) = 1

None

2

CBI

P,b

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ Π² ΠΏΠΎΡ€Ρ‚Ρƒ

I/O(P,b) = 0

None

2

BST

Rr,b

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ ΠΈΠ· рСгистра Π² T

T = Rr(b)

T

1

BLD

Rd,b

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΡ‚ ΠΈΠ· T Π² рСгистр

Rd(b) = T

None

1

SEC

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ пСрСноса

C =1

C

1

CLC

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ пСрСноса

C = 0

C

1

SEN

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа

N = 1

N

1

CLN

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа

N = 0

N

1

SEZ

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ нуля

Z = 1

Z

1

CLZ

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ нуля

Z = 0

Z

1

SEI

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ

I = 1

I

1

CLI

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ

I = 0

I

1

SES

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ числа со Π·Π½Π°ΠΊΠΎΠΌ

S = 1

S

1

CLN

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ числа со Π·Π½Π°ΠΊΠΎΠΌ

S = 0

S

1

SEV

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ пСрСполнСния

V = 1

V

1

CLV

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ пСрСполнСния

V = 0

V

1

SET

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ T

T = 1

T

1

CLT

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ T

T = 0

T

1

SEH

НСт

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ пСрСноса

H = 1

H

1

CLH

НСт

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ пСрСноса

H = 0

H

1

NOP

НСт

НСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

НСт

None

1

SLEEP

НСт

Π‘ΠΏΠ°Ρ‚ΡŒ (ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ энСргопотрСблСниС)

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ описаниС инструкции

None

1

WDR

НСт

Бброс стороТСвого Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ описаниС инструкции

None

1

АссСмблСр Π½Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ рСгистр символов.

ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ… Π²ΠΈΠ΄ΠΎΠ²:

Rd: Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ (ΠΈ исходный) рСгистр Π² рСгистровом Ρ„Π°ΠΉΠ»Π΅ Rr: Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ рСгистр Π² рСгистровом Ρ„Π°ΠΉΠ»Π΅ b: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (3 Π±ΠΈΡ‚Π°), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ s: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (3 Π±ΠΈΡ‚Π°), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ P: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (5-6 Π±ΠΈΡ‚), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ K6; ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (6 Π±ΠΈΡ‚), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ K8: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (8 Π±ΠΈΡ‚), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ k: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ зависит ΠΎΡ‚ инструкции), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ q: ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° (6 Π±ΠΈΡ‚), ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ константноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Rdl:Β  R24, R26, R28, R30. Для инструкций ADIW ΠΈ SBIW X,Y,Z: РСгистры косвСнной адрСсации (X=R27:R26, Y=R29:R28, Z=R31:R30)

studfiles.net

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *