Zbytek důležitých instrukcí

Tohle bude pravděpodobně poslední lekce věnovaná instrukcím. Naplácám sem včechny důležitější instrukce, o kterých jsem ještě nepsal. Postupem času by sem také mohly(na čtenářské žádosti - čte to vůbec někdo ??) být přidány ještě nějaké další. Tak hrrr na to, ať už se konečně můžem vrhnout na rezidenty, viry a další vylomeniny.

Mimo instrukcí STOSB, LODSB a MOVSB zde uvedených existují též méně důležité CMPSB, SCASB, INSB a OUTSB. O nich si můžeš přečíst v SYSMANovi. Teď jedna doplňující věc ke všem instrukcím xxxSB(MOVSB, STOSB ..). Od 286 existují instrukce xxxSW(MOVSW, STOSW), neboli místo s jedním BYTEm se pracuje s WORDem(místo AL s AX). Od 386 pak jsou xxxSD(MOVSD, STOSD), které pracují s DWORDem(EAX). Kopírovat řetězce je samozřejmě rychlejší instrukcí MOVSD, než MOVSB. Proto ukázku kopírování řetězce zde přepíšu jako :
       MOV SI,OFFSET S1
       MOV DI,OFFSET S2
       PUSH DS
       POP ES       ; Neboli MOV ES,DS
       XOR CH,CH
       MOV CL,BYTE PTR DS:[SI-1] 
       INC CX       ; Dám do CX délku řetězce S1
       MOV DX,CX    ; Zálohuji si jí do DX
       SHR CX,2     ; Vydělím CX čtyřmi(budu kopírovat po čtyřech bytech)
       REP MOVSD    ; Přesun
       MOV CX,DX
       AND CX,3     ; Dodělám zbytek po dělení čtyřmi
       REP MOVSB

Neboli - nejdříve zkopíruji řetězec po DWORDech a zbylé byty dozkopíruji jednotlivě. Pokud je délka např. 14 bytů, pak celý řetězec i s nultým indexem(velikost) zabírá 15 bytů. 15 SHR 2 je 3. Zkopíruji tedy nejdříve 3x4 byty. Pak vezmu oněch 15 bytů a zjistím zbytek po dělení čtyřmi(AND CX,3) = 3. Pak zkopíruji zbylé tři byty a je to.

Ještě jedna poznámka k řetězcům. Směr posunu offsetu(INC DI, INC SI) u řetězcových instrukcí závisí na nastavení vlajky


Nyní instrukce pro jednoduché nastavování některých FLAGů. Jsou dva druhy : CLx(clear, vynuluj vlajku x) a STx(set, nastav vlajku x).

  1. CLI - touto instrukcí zakážeš jakékoliv přerušení(kromě nemaskovatelného)
  2. STI
  3. CLC
  4. STC
  5. CLD
  6. STD
  7. CMC - Výjimka. Znamená prohození hodnot Carry flagu.

Flagy jde samozřejmě měnit i jinak, ale trochu složitěji(třeba chci nastavit CF) :

       PUSHF         ; Uložím flagy do zásobníku
       POP AX        ; Načtu si je do AX
       OR AX,1       ; Nastavím první bit(CF)
       PUSH AX
       POPF

Úplně jsem se zapomněl zmínit o vstupu/výstupu na porty. Jak vysvětlit, co to porty jsou ... Začneme od Adama. Jak známo, počítač obsahuje mnoho součástek a většina z nich něco rozumného dělá. Ale jak s tou kterou součástkou komunikovat ? K tomu slouží právě porty, neboli jedno nebo obousměrná komunikace s ostatními částmi počítače - Disk, Mechanika, CD-ROM, klávesnice, ale i veškeré karty - Videokarta, zvuk. karta ... Ale i takové méně viditelné věci jako řadič přerušení, paralelní a sériové porty, paměť CMOS, atd. Nehodlám zde popisovat veškeré možné adresy a hodnoty, které máš kam poslat, aby to a to chodilo a opět odkazuji na SYSMANa.

Následuje nijak nesetříděný seznam posledních instrukcí :


Úvodní stránka Posuny a rotace Rezidentní programy
Rejstřík

Stránku připravuje Lukáš Valenta, 1. v celostátním kole soutěže v programování, kategorie mládež.