Semafor na PIC12F629 s „špatným“ programem. Program montáže pro sčítání čísel

Když můj syn do školy lepil z papíru atrapu semaforu, přišla myšlenka: „Proč mu nesestavit fungující model semaforu na mikrokontrolér.“ Na internetu pro ně existuje mnoho schémat a programů implementujících princip nejjednoduššího semaforu. Ale na hračku jsou buď příliš komplikované (převodník DC-DC, posuvné registry atd.), Nebo jsou prezentovány pouze jako příklad nejjednoduššího programu jazyka sestavení. Chci představit program schematického a montážního jazyka pro kompletní semafor s některými dalšími funkcemi. Navíc je sestaven na „penny“ mikrokontroléru podle nejjednoduššího schématu, které je důležité pro začátečníky. Doufám, že tohle jednoduchý obvod se stane pro mnoho začátečníků v programování mikrokontrolérů PIC, prvním skutečným designem založeným na PIC. Program je jednoduchý, ale zároveň obsahuje základní techniky a atributy programování a usnadní jeho pochopení a experimentování.

Každý, kdo se zabývá programováním mikrokontrolérů, zná základní principy psaní obsluh přerušení: nejkratší možná doba provádění a krátký kód, žádné smyčky a volání od obsluhy jiných podprogramů atd. V tomto případě jsou přerušení povolena pouze při změnách úrovně (jiná přerušení nemůžeme přeskočit, protože prostě neexistují) a já, abych program a jeho vnímání zjednodušil, považoval jsem za možné odchýlit se od těchto zásad. Tady v obsluze přerušení jsou smyčky a volání dalšího podprogramu a (oh horor!) Dokonce i přechod do režimu SLEEP. Proto se v názvu programu říká „špatně“. PROTI tento případ, obsluha přerušení se používá jako běžný podprogram, v ostatních případech však výše uvedené zásady samozřejmě zůstávají v platnosti.

Stručná charakteristika zařízení:

Zařízení je modelem pouličního semaforu se spolehlivou simulací jeho provozu (přepínání barev, blikání zeleně) a má doplňkové funkce: změna spínací frekvence stisknutím tlačítka, blikáním žlutého režimu, přepnutím do režimu spánku v manuálním a automatický režim následuje zapnutí stisknutím tlačítka. Toto zařízení lze použít jako dětskou hračku i jako vizuální pomůcku v předškolních zařízeních při výuce dětí, jak se chovat na silnicích.

Přejdeme tedy k popisu a zvážení obvodu.

Obvod je sestaven na levném mikrokontroléru PIC12F629. Výstupy GP0-GP2, GP4, GP5 (piny 7, b, 5, 3, 2), naprogramované jako výstupy, se používají přímo k ovládání LED. LED diody v každém směru jsou kombinovány v sérii, aby se minimalizovala spotřeba proudu. Rezistory R3-R8 omezují proudy LED. V případě výrazného rozdílu ve výkonu LED různých barev budete muset vybrat příslušné odpory. Pro mě jsou například dvě skupiny žluté barvy zapojeny paralelně a připojeny k jednomu rezistoru, navíc se stejným hodnocením jako ostatní a svítí ještě o něco jasněji než ostatní (zpětný ráz je větší).

V tomto obvodu jsou LED napájeny o 1,5 V více než mikrokontrolér z dalšího prvku (v tomto případě, když je výstup vypnutý, proud neprochází na výstup mikroobvodu, protože k otevření je zapotřebí mnohem vyšší napětí přechody dvou LED diod než 1,5 V (nejméně 2,5 B). A dokonce i když jsou obě LED diody propíchnuty (což je nepravděpodobné), proud přes vnitřní ochrannou diodu do plusu napájení bude asi 7,5 mA, což je hodně méně než přípustný proud. Experimentálně se zjistilo, že navzdory poklesu proudu LED diodami při vybití baterie zůstává jas jejich záře na přijatelné úrovni v celém rozsahu napětí baterie. proudu, což způsobilo možné opustit vypínač (spotřeba proudu v režimu spánku - 1-3 m kA).

Tlačítko pro ovládání provozních režimů zařízení je připojeno ke kolíku GP3 (pin 4), který je v konfiguračních bitech deklarován jako digitální vstup. Po stisknutí tlačítka dojde k přerušení, v jehož obsluze dojde k následujícímu. Dlouhým stisknutím (více než 4 s) přejde zařízení do režimu spánku. U kratších stisků dochází k sekvenčnímu přepínání rychlosti semaforu v kruhu s indikací aktuální rychlosti podle obrázku.

V druhém režimu (červené LED diody svítí) je aktivován žlutý blikající signál. Dlouhým stisknutím tlačítka (potvrzeno zhasnutím všech LED) přejdeme do normálního provozu se změnou režimu na nový, pokud tlačítko nestisknete déle než 6 sekund, provozní režim zůstane stejné jako před stisknutím tlačítka.

Nabíjení článků AA ve spánkovém režimu vydrží minimálně rok, a proto zařízení nemá vypínač. Zařízení přejde do režimu spánku také po 0,5 - 1 hodině (v závislosti na rychlosti přepínání barev) bez ovlivnění tlačítka. Režim SLEEP se ukončí stisknutím libovolného tlačítka. Mikrokontrolér je napájen piny 1 a 8. Pro uložení kolíků a zjednodušení konstrukce je povolen režim interního generátoru bez externích prvků.

Malá vysvětlení programu, která je uvedena v příloze.

Zpracování kliknutí na tlačítko se provádí v podprogramech: wait_butt __- čekání na stisk a registrace po dobu 6 sekund. bez stisku, push_butt __- registrace doby stisku, wait_nobutt __- čekání na nestlačené tlačítko. Když se změní stav semaforu (žlutý a bliká zeleně), hodnoty pro výstupní port se načtou z tabulky v podprogramu tact__ (nízké nebo vysoké nibbles). Podobně indikace stavu při stisknutí tlačítka pochází z podprogramu ind__. Chcete -li přepnout do režimu spánku po uplynutí provozní doby, dojde k vynucenému přechodu na podprogram zpracování přerušení instalace softwaru vlajka přerušení. Změnou konstant CONST_MIN, CONST_REG, CONST_SL můžete změnit dobu zeleného blikání, počáteční režim při připojení baterie, provozní dobu bez dopadu až do přechodu do režimu SLEEP.

Deska s plošnými spoji je vyrobena z jednostranného laminátu potaženého fólií a má rozměry 22x87 mm. Nejvzdálenější diody LED jsou instalovány rovnoběžně s deskou v různých směrech. Prostřední jsou instalovány jeden ze strany instalace dílů a druhý ze strany kolejí se závitem vede do otvorů desky a upevňuje je ze strany dílů kapkou pájky, a ze strany kolejí pájením na odpovídající dráhy.

Všechny odpory s výkonem 0,125 W. LED diody lze odebírat jakékoli domácí nebo dovážené, nejlépe stejného typu s přímým poklesem napětí při proudu 10 mA asi 2 volty. Tlačítko - jakékoli bez fixace. Mikrokontrolér je nainstalován na bloku.

Konfigurační slovo se automaticky vloží do paměti při načtení firmwaru („ptáček“ je nainstalován pouze v položce „PWRT“, ostatní položky jsou „vymazány“, v „oscilátoru“ je nastaveno „intOSC GP4“ sloupec). Nejprve je nutné načíst firmware z čistého mikroobvodu a zapsat hodnotu slova na konec paměti programu na 03FF, což je nutné k nastavení frekvence vnitřního generátoru konkrétní instance mikroobvodu. Po načtení souboru HEX do programu je nutné tuto hodnotu zadat ručně na 03FF. PROTI toto zařízení odchylka frekvence není kritická, ale přesto byste si měli být vědomi toho, že tento postup je pro tento mikroobvod nutný. Jako poslední možnost, pokud tovární hodnota ztraceni, nemůžete nic dělat - program v tomto případě přijal opatření pro správnou funkci.

Zařízení je umístěno ve vhodné plastové krabici. Pod diodami LED v krabici a víku jsou vytvořeny odpovídající otvory. V mé verzi je samotný semafor a základna s tlačítkem a baterií propojeny kusem plastové vodní trubky o průměru 20 mm.

Aplikace obsahuje: model, tištěný spoj ve formátu LAY, program assembleru MPASM, soubor firmwaru HEX.

Seznam radioelementů

Označení Typ Označení Množství PoznámkaProdejnaMůj zápisník
IC1 MK PIC 8bitový

PIC12F629

1 DIP Do poznámkového bloku
R1 Odpor

3 kΩ

1 0,125 W. Do poznámkového bloku
R2 Odpor

100 ohmů

1 0,125 W. Do poznámkového bloku
R3-R8 Odpor

200 ohmů

6 0,125 W. Do poznámkového bloku
HL1, HL2, HL9, HL10 Světelná dioda

AL307A

4 ČERVENÉ Do poznámkového bloku
HL3, HL4, HL11, HL12 Světelná dioda

Když můj syn do školy lepil z papíru atrapu semaforu, přišla myšlenka: „Proč mu nesestavit fungující model semaforu na mikrokontrolér.“ Na internetu pro ně existuje mnoho schémat a programů implementujících princip nejjednoduššího semaforu. Ale na hračku jsou buď příliš komplikované (převodník DC-DC, posuvné registry atd.), Nebo jsou prezentovány pouze jako příklad nejjednoduššího programu jazyka sestavení. Chci představit program schematického a montážního jazyka pro kompletní semafor s některými dalšími funkcemi. Navíc je sestaven na „penny“ mikrokontroléru podle nejjednoduššího schématu, které je důležité pro začátečníky. Naštěstí se tento jednoduchý obvod stane prvním skutečným návrhem založeným na PIC pro mnoho, kteří se začínají učit programování PIC. Program je jednoduchý, ale zároveň obsahuje základní techniky a atributy programování a usnadní jeho pochopení a experimentování.

Každý, kdo se zabývá programováním mikrokontrolérů, zná základní principy psaní obsluh přerušení: co nejkratší doba provádění a krátký kód, žádné smyčky a volání od obsluhy jiných podprogramů atd. V tomto případě jsou povolena pouze přerušení na úrovni změn (jiná přerušení nemůžeme přeskočit, protože prostě neexistují) a já, abych program a jeho vnímání zjednodušil, považoval jsem za možné odchýlit se od těchto zásad. Tady v obsluze přerušení jsou smyčky a volání na další podprogram a (ach horor!) Dokonce i přechod do režimu SLEEP. Proto je v názvu program nazván „špatně“. V tomto případě se obsluha přerušení používá jako normální podprogram, v ostatních případech však výše uvedené zásady samozřejmě zůstávají v platnosti.

Stručná charakteristika zařízení:

Zařízení je modelem pouličního semaforu se spolehlivou simulací jeho provozu (přepínání barev, bliká zeleně) a má další funkce: změnu spínací frekvence stisknutím tlačítka, blikající žlutý režim, přepnutí do režimu spánku v manuálním a automatickém režimu režimy, následované zapnutím stisknutím tlačítka. Toto zařízení lze použít jako dětskou hračku i jako vizuální pomůcku v předškolních zařízeních při výuce dětí, jak se chovat na silnicích.

Přejdeme tedy k popisu a zvážení obvodu:

Obvod je sestaven na levném mikrokontroléru. Výstupy GP0-GP2, GP4, GP5 (piny 7, b, 5, 3, 2), naprogramované jako výstupy, se používají přímo k ovládání LED. LED diody v každém směru jsou kombinovány do skupinových skupin, což minimalizuje aktuální spotřebu. Rezistory R3-R8 omezují proudy LED. V případě výrazného rozdílu ve výkonu LED různých barev budete muset vybrat příslušné odpory. Pro mě jsou například dvě skupiny žluté barvy zapojeny paralelně a připojeny k jednomu rezistoru, navíc se stejným hodnocením jako ostatní a svítí ještě o něco jasněji než ostatní (zpětný ráz je větší).

V tomto obvodu jsou LED napájeny o 1,5 V více než mikrokontrolér z dalšího prvku (v tomto případě, když je výstup vypnutý, proud neprochází na výstup mikroobvodu, protože k otevření je zapotřebí mnohem vyšší napětí přechody dvou LED diod než 1,5 V (nejméně 2,5 B). A dokonce i když jsou obě LED diody propíchnuté (což je nepravděpodobné), proud přes vnitřní ochrannou diodu do plusu napájení bude asi 7,5 mA, což je hodně je menší než přípustný proud. Experimentálně se zjistilo, že i přes pokles proudu LED diodami při vybití baterie zůstává jas jejich záře na přijatelné úrovni v celém rozsahu napětí baterie. proudu, což způsobilo možné opustit vypínač (spotřeba proudu v režimu spánku - 1-3 m kA).

Tlačítko pro ovládání provozních režimů zařízení je připojeno ke kolíku GP3 (pin 4), který je v konfiguračních bitech deklarován jako digitální vstup. Po stisknutí tlačítka dojde k přerušení, v jehož obsluze dojde k následujícímu. Dlouhým stisknutím (více než 4 s) přejde zařízení do režimu spánku. U kratších stisků dochází k postupnému přepínání rychlosti semaforu v kruhu s indikací aktuální rychlosti podle obrázku:

V druhém režimu (červené LED diody svítí) je aktivován žlutý blikající signál. Dlouhým stisknutím tlačítka (potvrzeno zhasnutím všech LED) přejdeme do normálního provozu se změnou režimu na nový, pokud tlačítko nestisknete déle než 6 sekund, provozní režim zůstane stejné jako před stisknutím tlačítka.

Nabíjení článků AA ve spánkovém režimu vydrží minimálně rok, a proto zařízení nemá vypínač. Zařízení přejde do režimu spánku také po 0,5 - 1 hodině (v závislosti na rychlosti přepínání barev) bez ovlivnění tlačítka. Režim SLEEP se ukončí stisknutím libovolného tlačítka. Mikrokontrolér je napájen piny 1 a 8. Pro uložení kolíků a zjednodušení konstrukce je povolen režim interního generátoru bez externích prvků.

Malé vysvětlení programu, které je uvedeno v příloze:

Zpracování kliknutí na tlačítko se provádí v podprogramech: wait_butt __- čekání na stisk a registrace po dobu 6 sekund. bez stisku, push_butt __- registrace doby stisku, wait_nobutt __- čekání na nestlačené tlačítko. Když se změní stav semaforu (žlutý a bliká zeleně), hodnoty pro výstupní port se načtou z tabulky v podprogramu tact__ (nízké nebo vysoké nibbles). Podobně indikace stavu při stisknutí tlačítka pochází z podprogramu ind__. Chcete -li přepnout do režimu spánku po uplynutí provozní doby, dojde k vynucenému přechodu na rutinu zpracování přerušení softwarovým nastavením příznaku přerušení. Změnou konstant CONST_MIN, CONST_REG, CONST_SL můžete změnit dobu zeleného blikání, počáteční režim při připojení baterie, provozní dobu bez dopadu až do přechodu do režimu SLEEP.

Deska s plošnými spoji je vyrobena z jednostranného laminátu potaženého fólií a má rozměry 22x87 mm. Nejvzdálenější diody LED jsou instalovány rovnoběžně s deskou v různých směrech. Prostřední jsou instalovány jeden ze strany instalace dílů a druhý ze strany kolejí se závitem vede do otvorů desky a upevňuje je ze strany dílů kapkou pájky, a ze strany kolejí pájením na odpovídající dráhy.

Všechny odpory s výkonem 0,125 W. LED diody lze odebírat jakékoli domácí nebo dovážené, nejlépe stejného typu s přímým poklesem napětí při proudu 10 mA asi 2 volty. Tlačítko - jakékoli bez fixace. Mikrokontrolér je nainstalován na bloku.

Konfigurační slovo se do paměti vloží automaticky při načtení firmwaru (v IC-Prog je „birdie“ nainstalován pouze v položce „PWRT“, ostatní položky jsou „vymazány“, „intOSC GP4“ je nastaveno v sloupec „oscilátor“). Nejprve je nutné načíst firmware z čistého mikroobvodu a zapsat hodnotu slova na konec paměti programu na 03FF, což je nutné k nastavení frekvence vnitřního generátoru konkrétní instance mikroobvodu. Po načtení souboru HEX do programu je nutné tuto hodnotu zadat ručně na 03FF. V tomto zařízení není odchylka frekvence kritická, ale přesto byste měli vědět, že tento mikroobvod takový postup vyžaduje. V krajním případě, pokud dojde ke ztrátě tovární hodnoty, nemůžete nic dělat - program v tomto případě přijal opatření pro správnou funkci.

Zařízení je umístěno ve vhodné plastové krabici. Pod diodami LED v krabici a víku jsou vytvořeny odpovídající otvory. V mé verzi je samotný semafor a základna s tlačítkem a baterií propojeny kusem plastové vodní trubky o průměru 20 mm.

Ahoj!
Chci ukázat, jak je napsán program pro řízení technologických zařízení na PLC.
Většinu času jsem se zabýval PLC vyrobeným společností Schneider Electric. Quantum, který jsem pro tento úkol vybral, je nejvýkonnějším a nejdražším PLC tohoto výrobce. Může ovládat zařízení s tisíci signály, pro semafory v reálný život přirozeně to nikdo nevyužije.

Nikdy jsem se nezabýval automatizací semaforů, takže jsem přišel s algoritmem sám. Tady to je:
1. Semafor pro regulovaný přechod pro chodce. Tito. semafor pro automobily, semafor pro chodce a tlačítko pro chodce, jehož stisknutím chodec upozorní na touhu přejít silnici.
2. Po zahájení programu se u aut rozsvítí zelená a u chodců červená.
3. Poté, co chodec stiskl tlačítko, bliká zelená pro auta, poté žlutá a poté červená. Poté se zelená rozsvítí pro chodce, po nastavený čas začne blikat, rozsvítí se červeně pro chodce, pak pro auta se rozsvítí žlutě a červeně, pak zeleně.
4. Během stanoveného časového období po zeleném světle na semaforu pro chodce stisknutím tlačítka chodec nespustí algoritmus přechodu. V tomto případě se přechodový algoritmus spustí až po uplynutí zadaného času.
Programování PLC se provádí v programovacím prostředí Unity v jazycích normy IEC 61131-3. PROTI tento standard obsahuje 5 jazyků. Například jsem zvolil jazyk funkčních bloků - FBD.
Zde je prohlížeč projektu v Unity:

Konfigurace PLC:


PLC se skládá z montážního panelu, napájecího zdroje (1), ovladače (2), modulu digitálního vstupu pro 32 signálů 24 V DC (4), modulu digitálního vstupu pro 32 signálů 24 V DC (5). Ve skutečném projektu montážních panelů připojených k jednomu řadiči pomocí různé sítě, mohou existovat desítky a stovky I / O modulů.
V editoru proměnných vytváříme proměnné požadovaných typů:


Proměnné přidružené ke kanálům I / O modulů mají adresu, která udává, ke kterému stojanu, modulu a kanálu je signál vázán.
Program se skládá ze sekcí, které se provádějí v každém skenovacím cyklu ovladače.
Zjednodušený cyklus skenování řadiče vypadá takto:
1. Čtení vstupních signálů ze vstupního modulu do proměnných s adresami.
2. Provedení sekcí.
3. Zápis hodnot z proměnných s adresami do výstupních signálů výstupních modulů.
4. Přejděte na položku 1.
Vytvořte sekci Hodiny s 0,5sekundovým pulzním generátorem. Blok TP, když se vstupní signál změní z 0 na 1, vydá impuls daného trvání.


Zde a níže jsou snímky obrazovky sekcí zobrazeny v režimu animace, nikoli v režimu úprav. Zobrazují hodnoty proměnných v tento momentčas při připojení k PLC s načteným programem (čísla pro číselné proměnné, zelená (1) -červená (0) pro boolean).
Hlavní část zpracovává hlavní logiku.
Blok SR nastaví výstup na 1, když S1 = 1, a resetuje výstup na 0, když R = 1.
Blok R_TRIG nastavuje výstup pro 1 skenovací cyklus na 1, když vstup přechází z 0 na 1 (detektor náběžné hrany).
Blok F_TRIG nastavuje výstup pro 1 skenovací cyklus na 1, když vstup přechází z 1 na 0 (detektor odtokové hrany).
Proměnná inButton vázaná na kanál tlačítek byla v sekci nahrazena inButtonForTest, takže můžete změnit její hodnotu na simulátoru ovladače bez skutečného hardwaru.


Sekce Výstupy generuje výstupní signály pro ovládání semaforů.


Načtěte projekt do simulátoru ovladače:


Význam libovolných proměnných lze zobrazit v animační tabulce:


Ale pro pohodlí ladění můžete vytvořit obrazovku operátora s jednoduchou grafikou, jejíž animace je svázána s proměnnými:

Pokus o přechod přes silnici:

Nečekal jsem, že k ovládání tak jednoduchého objektu, jako je semafor, bude potřeba 30 bloků.
V dalším článku vám ukážu, jak psát tento program pomocí všech jazyků normy IEC 61131-3 současně.

UPD. Opravena chyba v názvu standardu.

(Tvary), (Panel).

Před vytvořením aplikace byste si měli prostudovat popis nových komponent.

Cvičení. Simulujte semafory. Při zahájení projektu by měl být panel semaforu prázdný. Po stisknutí tlačítka Start se semafory začnou přepínat. Po stisknutí tlačítka Stop je panel semaforu opět prázdný. Pomocí časovače zajistěte, aby se dopravní signál v pravidelných intervalech měnil. Do pole Rychlost zadejte interval časovače.

Průběh projektu

1. Vytvořit nový projekt... Uložte jej do samostatné složky, pojmenujte jej Semafor.

2. Umístěte na formulář panel (TPanel) se třemi tvary (TShape), dvěma tlačítky (TButton), textovým polem (TEdit), nápisem (TLabel), časovačem (TTimer) podle ukázky:

Mělo by to vypadat takto:

2. Navrhneme:

Nastavte tyto hodnoty vlastností v inspektoru objektů:

Komponent Vlastnictví Význam
Formulář 1 Titulek Semafory
Panel 1 Titulek * Prázdný *
Tvar 1 Tvar stKruh
Tvar 2 Tvar stKruh
Tvar 3 Tvar stKruh
Štítek 1 Titulek Rychlost
Upravit 1 Text * prázdný *
Tlačítko 1 Titulek Start
Tlačítko 2 Titulek Stop

3. Vytvořte událost pro Form1 v sekci OnCreate - Stiskněte elipsu

Vytvořte událost pro Timer1 v sekci OnTimer - Stiskněte tři tečky

4. Přiřaďte tvarům barvy:

Finální typ práce:

5. Během načítání formuláře se časovač vypne, tvary na panelu se stanou neviditelnými.

Vytvořte obslužnou rutinu události pro událost FormCreate (poklepejte na komponentu Form1) a vložte tento kód:

var k: celé číslo; procedura TForm1.FormCreate (Odesílatel: TObject); begin Timer1.Enabled: = false; Tvar1.Viditelný: = nepravdivý; Tvar2.Viditelný: = nepravdivý; Shape3.Visible: = false; konec;

6. Chcete -li přepnout žárovky semaforu, napište kód programu do obslužné rutiny události Timer1Timer. Tento kód bude spuštěn v intervalu, který uživatel zadá do pole Rychlost. Podle údajů časovače je určen počet žárovek, které by se měly zapnout tento moment.

Dvakrát klikněte na komponentu Timer1 a vložte tento kód:

6. Napište kód programu pro tlačítko Start. Kliknutím na tlačítko z pole Rychlost se načte interval časovače, časovač se vymaže, časovač se zapne.

Dvakrát klikněte na komponentu Button1 a vložte kód:

postup TForm1.Button1Click (Odesílatel: TObject); begin Timer1.Interval: = StrToInt (Edit1.text); k: = 0; Timer1.Enabled: = true; konec;

7. Napište kód pro tlačítko Zastavit. Po kliknutí na tlačítko by se měl časovač vypnout, semafory se opět stanou neviditelnými.

Dvakrát klikněte na komponentu Button2 a vložte kód:

postup TForm1.Button2Click (Odesílatel: TObject); begin Timer1.Enabled: = false; Tvar1.Viditelný: = nepravdivý; Tvar2.Viditelný: = nepravdivý; Shape3.Visible: = false; konec;

8. Spusťte projekt. Do pole Rychlost zadejte 1000 (1000 ms = 1 s). Semafory se začnou přepínat v sekundových intervalech.

Artem Poznyak, student 10 "A" třídy střední školy №23, Ekibasbuz

Mnoho lidí si myslí, že Assembler je již zastaralý a nikde se nepoužívá, ale většinou se jedná o mladé lidi, kteří se profesionálně nevěnují programování systémů. Vývoj softwaru je samozřejmě dobrý, ale na rozdíl od programovacích jazyků na vysoké úrovni vás Assembler naučí hlouběji porozumět provozu počítače, optimalizovat práci s hardwarovými prostředky a také programovat jakoukoli techniku, čímž se bude vyvíjet směrem ke strojovému učení. . Abyste porozuměli tomuto starověkému YP, měli byste nejprve cvičit s jednoduché programy které nejlépe vysvětlují funkčnost Assembleru.

IDE pro Assembler

První otázka zní: v jakém vývojovém prostředí programovat v Assembleru? Odpověď je jednoznačná - MASM32... to standardní program, který se používá pro tuto PL. Můžete si jej stáhnout na oficiálním webu masm32.com ve formě archivu, který bude potřeba rozbalit a poté spustit instalační program install.exe. Alternativně můžete použít FASM, ale kód pro něj bude výrazně odlišný.

Před zahájením práce je hlavní nezapomenout přidat do systémové proměnné PATH následující řádek:

C: \ masm32 \ bin

Montážní program „Hello world“

Věří se, že toto základní program v programování, které začátečníci píší jako první, když se seznámí s jazykem. Tento přístup možná není zcela správný, ale tak či onak vám umožňuje okamžitě vidět vizuální výsledek:

386 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib / kernel32.lib .data msg_title db "Název", 0 msg_message db "Hello world", 0 .code start: vyvolat MessageBox, 0, addr msg_message, addr msg_title, MB_OK vyvolat ExitProcess, 0 konec start

Nejprve spusťte editor qeditor.exe ve složce s nainstalovaným MASM32 a napište do něj kód programu. Poté jej uložíme jako soubor s příponou „.asm“ a program sestavíme pomocí položky nabídky „Projekt“ → „Vytvořit vše“. Pokud v kódu nejsou žádné chyby, program se úspěšně zkompiluje a na výstupu získáme připravený exe soubor, který zobrazí okna okna s nápisem „Hello world“.

Sčítání dvou čísel v assembleru

V tomto případě se podíváme, jestli je součet čísel nulový nebo ne. Pokud ano, zobrazí se na obrazovce odpovídající zpráva, a pokud ne, objeví se další oznámení.

486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib /kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -90 add eax, ebx test eax, eax jz zero invoke MessageBox, 0, chr $ ("In eax not 0!"), chr $ ("Info"), 0 jmp lexit zero: vyvolejte MessageBox, 0, chr $ ("In eax 0!"), chr $ ("Info"), 0 lexit: vyvolejte ExitProcess, 0 konec start

Zde používáme takzvané štítky a speciální týmy jejich použití (jz, jmp, test). Podívejme se blíže:

  • test - slouží k logickému porovnání proměnných (operandů) ve formě bajtů, slov nebo dvojitých slov. Pro srovnání příkaz používá logické násobení a dívá se na bity: pokud jsou rovny 1, pak bit výsledku bude roven 1, v opačném případě - 0. Pokud dostaneme 0, příznaky se nastaví společně se ZF ( nulový příznak), který se bude rovnat 1 Výsledky jsou poté analyzovány na základě ZF.
  • jnz - pokud nebyl nikde nastaven příznak ZF, provede se na tomto štítku skok. Tento příkaz se často používá, když program obsahuje srovnávací operace, které nějak ovlivňují výsledek ZF. Patří sem test a cmp.
  • jz - pokud byl stále nastaven příznak ZF, štítek přeskočí.
  • jmp - bez ohledu na to, zda existuje ZF nebo ne, je štítek přeskočen.

Program montáže pro sčítání čísel

Primitivní program, který ukazuje proces přidávání dvou proměnných:

486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib /kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h B DB 2h buffer db 128 dup (duplicitní) formát db "% d", 0 .code start: MOV AL, A ADD AL, B vyvolat wsprintf, addr buffer, addr formát, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK vyvolat ExitProcess, 0 konec start

V Assembleru bude pro výpočet součtu zapotřebí mnoho akcí, protože programovací jazyk pracuje přímo se systémovou pamětí. Zde většinou manipulujeme se zdroji a nezávisle indikujeme, kolik alokovat pro proměnnou, v jaké formě vnímat čísla a kam je umístit.

Získání hodnoty z příkazového řádku v assembleru

Jedním z nejdůležitějších základních kroků v programování je získání dat z konzoly pro další zpracování. V tomto případě je získáme od příkazový řádek a zobrazit v okně Windows:

486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib /kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: volání GetCommandLine; výsledek bude umístěn do eax push 0 push chr $ ("Command Line") push eax; vezmeme text pro výstup z eax push 0 call MessageBox push 0 call ExitProcess end start

Můžete také použít alternativní metodu:

486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib /kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: volání GetCommandLine; výsledek bude umístěn do eax invoke GetCommandLine invoke MessageBox, 0, eax, chr $ ("Command Line"), 0 invoke ExitProcess, 0 push 0 call ExitProcess end start

Používá invoke, speciální makro, které zjednodušuje kód programu. V době kompilace jsou makro příkazy převedeny na příkazy assembleru. Tak či onak používáme zásobník - primitivní způsob ukládání dat, ale zároveň velmi pohodlný. Podle konvencí stdcall jsou ve všech funkcích WinAPI předávány proměnné přes zásobník, pouze v obrácené pořadí, a jsou umístěny v odpovídajícím registru eax.

Assembler smyčky

Případ použití:

Data msg_title db "Title", 0 A DB 1h buffer db 128 dup (?) Format db "% d", 0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL == 7 vyvolat wsprintf, addr buffer, formát addr, AL vyvolat MessageBox, 0, addr buffer, addr msg_title, MB_OK vyvolat ExitProcess, 0 konec start .data msg_title db "Title", 0 buffer db 128 dup (?) formát db "% d", 0 .code start: mov eax, 1 mov edx, 1 .WHILE edx == 1 včetně eax .IF eax == 7 .BREAK .ENDIF .ENDW vyvolat wsprintf, addr buffer, addr formát, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK vyvolejte ExitProcess, 0

Příkaz opakování slouží k vytvoření smyčky. Potom pomocí inc se hodnota proměnné zvýší o 1, bez ohledu na to, zda je in paměť s náhodným přístupem, nebo v samotném procesoru. Aby se přerušila práce cyklu, používá se směrnice „.BREAK“. Může jak zastavit cyklus, tak pokračovat ve své činnosti po „pauze“. Pomocí směrnice ".CONTINUE" můžete také přerušit provádění kódu programu a zkontrolovat podmínku opakování a při.

Součet prvků pole v assembleru

Zde shrnujeme hodnoty proměnných v poli pomocí smyčky "pro":

486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib/masm32/ lib /kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Název", 0 A DB 1h x dd 0,1,2,3,4,5,6,7, 8,9,10,11 n dd 12 buffer db 128 dup (?) Formát db "% d", 0. Začátek kódu: mov eax, 0 mov ecx, n mov ebx, 0 L: add eax, x add ebx, typ x dec ecx cmp ecx, 0 jne L vyvolat wsprintf, addr buffer, addr formát, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK vyvolat ExitProcess, 0 konec start

Příkaz dec, jako inc, změní hodnotu operandu o jeden, pouze v opačném směru, o -1. Ale cmp porovnává proměnné metodou odčítání: odečte jednu hodnotu od druhé a v závislosti na výsledku nastaví příslušné příznaky.

Příkaz jne naviguje popisek na základě výsledku porovnání proměnných. Pokud je záporný, dojde k přechodu, a pokud si operandy nejsou navzájem rovny, přechod se neprovede.

Assembler je zajímavý svou reprezentací proměnných, která vám umožňuje dělat s nimi, co chcete. Specialista, který přišel na všechny složitosti tohoto jazyka programování, má opravdu cenné znalosti, které lze využít mnoha způsoby. Jeden problém může vyřešit většina různé způsoby, takže cesta bude trnitá, ale neméně vzrušující.

Zobrazení příspěvků: 767