Konečně jsi se prokousal teoretickými řečmy. To svědší o tom, že tě zřejmě assembler opravdu zajímá, proto se už pustíme do prvních instrukcí. V závorce za každou novou instrukcí je její plné jméno a překlad do češtiny.
Tato instrukce jednoduše přesune něco někam. Nejlépe vysvětlit
na příkladech:
MOV AX,5 ; AX := 5; MOV AH,BL ; AH := BL; MOV 5,EDI ; To je blbost. MOV AX,BL ; Do 16-bitového argumentu nelze dát 8-bitový. MOV AX,PROM ; AX := PROM(kde PROM je proměnná) MOV AX,WORD PTR CS:[OFFSET PROM+3] ; AX := word na adrese CS:(offset objektu prom+3)Teď několik pravidel, která musíš dodržet:
MOV AX,1234 MOV ES,AX
MOV PROMENNA1,PROMENNA2 ; Nelze -------- MOV AX,PROMENNA1 ; Samozřejmě pokud je PROMENNA1 16-bitová MOV PROMENNA2,AX ; Toto je v pořádkuObecně platí, že žádná instrukce nemůže mít jako parametry víc než jednu adresu.
Máme dva druhy přerušení-hardwarová a softwarová. Hardwarové přerušení je generováno řadičem přerušení, pokud si o něj nějaké zařízení řekne(třeba klávesnice po stisku klávesy(INT 9) nebo třeba systémový časovač(INT 8)). V případě, že je povolené přerušení(Interrupt flag je 1) je činnost procesoru přerušena(po skončení aktuální instrukce) a je zavolána obslužná rutina, jejíž adresa je uložena v tabulce přerušení. Ta je umístěna na samém začátku paměti, tedy na adrese 0:0 a obsahuje 256 4-bytových adres.
Softwarové přerušení se od harwarového liší jen tím, že není generováno žádným řadičem, program si ho musí volat sám právě pomocí instrukce INT(hardwarové přerušení můžeš takto volat taky). Na těchto přerušeních jsou umístěny služby BIOSu, DOSu, VIDEO karty, Ovladače myši, atd. Jejich detailní popis nalezneš také v programu SYSMAN.
Instrukce INT uloží do zásobníku adresu aktuální instrukce a hodnotu registru FLAGs(Přerušení by je porušilo a při hardwarovém by to znamenalo téměř okamžitě zboření). Poté nastaví IF a TF na nula(vysvětlení viz. kapitola Rezidentní programy) a nakonec se zavolá příslušná obsluha přerušení, která končí instrukcí IRET.
Následující tabulka obsahuje některá z důležitých přerušení(H/S = Hardwarové/Softwarové):
Číslo přerušení | H/S | Popis |
---|---|---|
0H | S | Volá ho procesor po dělení nulou |
2H | S | Nemaskovatelné přerušení(NMI). Volá se při havárii, např. výpadek proudu |
8H | H | Systémový časovač. Normálně se volá 18.2x za vteřinu |
9H | H | Klávesnice. Po stisku a puštění klávesy |
10H | S | Služby obrazovky |
16H | S | Klávesnice. Služby typu "čekej na klávesu" |
20H | H | Důležité! Ukončení programu |
21H | H | Důležité! Služby DOSu. Práce se soubory, vstup a výstup, alokace paměti atd. |
33H | H | Ovládání myši |
Jednoduše řečeno opak instrukce INT. Přečte si ze zásobníku FLAGy, adresu instrukce, kde se skončilo a vrátí se na ní. Tuto instrukci uvádím pouze proto, že jsem se o ní zmínil výše. Dokud nebudeš psát residentní programy(programy, které zůstanou v paměti i po skončení. Třeba ovladač myši), tak ji nebudeš potřebovat.
Porovnání(Nedestruktivní odečtení-odečte argument2 od argument1 ale nikam neuloží výsledek) argumentů a změna některých FLAGů- ZF, OF, AF, CF. Podle nich se pak určuje, jaký z argumentů je vlastně >, <, =, >=, <=. K tomu slouží podmíněné skoky. Tyto instrukce nejprve zhodnotí příslušné FLAGy a podle výsledku se buď skočí nebo ne.
Jak již bylo řečeno výše, tyto skoky nejprve zhodnotí příslušné FLAGy a podle výsledku se rozhodnou, zda skočit na určené návěští nebo ne. Jejich seznam máš dole, to v závorce je druhá možnost zápisu. Vyber si jaký chceš používat, je to úplně jedno.
CMP AX,BX JZ(JE) @DAL ; Pokud ZF = 1, neboli AX=BX JA(JNBE) @DAL ; Pokud je AX > BX po bezznaménkové aritmetice JB(JC) @DAL ; Pokud je AX < BX po bezznaménkové aritmetice JG(JNLE) @DAL ; Pokud je AX > BX po znaménkové aritmetice JL(JNGE) @DAL ; Pokud je AX < BX po znaménkové aritmetice a další variace jako např. : JNC @DAL ; Pokud je vlajka CF = 0 ještě sem napíšu skok nepodmíněný : JMP @DAL ; Skočí vždy-žádná podmínka
Tyto instrukce pro začátek stačí, teď si můžeš napsat první program. Přečti si všechny zadání příkladů k odzkoušení, protože v nich nalezneš popisy např. služeb DOSu, které budeš v tom kterém příkladu potřebovat. Mnou psaná vzorová(?) řešení máš v odkazu dole zabalená do ZIPu.
Kdo by neznal program "Ahoj světe", byl to první program nás všech vypisující právě tuto hlášku. Teď nějaké údaje.
AH = 9H | číslo služby |
DS:DX | adresa řetězce. DS máš nastavené od spuštění, zbývá jen nastavit DX na offset textu |
Udělej program, který vypíše tento text : "Stoji to 50$. Vic ne.". Bylo by úplně to samé, jako program č. 1, ale rozdíl je v tom, že službu DOSu AH=9 nedonutíš, aby vypsala znak "$". Musíš použít něco jiného. To je služba AH=2, která vypíše na obrazovku(lépe řečeno na standartní výstup) znak, který dostane v registru DL.
Napiš program, který nejprve počká na nějakou klávesu a pak vypíše text. Pokud stiskl "1", vypíše "Bylo to číslo 1", "2"-"Bylo to číslo 2", "3"-"Bylo to číslo 3" nebo "Byla to nějaká jiná klávesa". Co potřebuješ znát ?
Vzorová řešení |
Úvodní stránka | Registry procesoru | Aritmetika, zásobník |
Stránku připravuje Lukáš Valenta,
1. v celostátním kole soutěže v programování, kategorie mládež.