mov cíl,zdroj - Hodnotou zdroje se zkopíruje do cíle. int index - Provede se softwareové přerušení programu, které je určeno indexem. Přerušení je fyzicky nějaký podprogram, který mohou využívat všechny spuštěné programy. Jeho existenci se zajišťují různé problémy s kompatibilitou, kdy přerušení obhospořaduje například disk nebo klávesnici. Přerušení si může programátor nahradit vlastním podprográmkem, buď tak získá kontrolu například nad diskovými operacemi a nebo jej využívat pro vlastní potřeby. V budoucnu si povíme o přerušení trochu podorbněji. jmp návěští - Instrukce Jxx mění hodnotu registru IP podle tvaru této instrukce. Například: JMP nepodmíněný skok JC je-li CF roven 1 JZ je-li ZF roven 1 JNZ je-li ZF roven 0. xor oper1,oper2 - Provede logickou operaci XOR nezi oper1 a oper2. in index,výst. out index,vstup - Pošle/načte na/z port/u určený indexem vstupní/výstupní hondotu používá se při příme komunikaci s hardwarem například grafická karta nebo klávesnice. Většinou se jedná o velice elementární operace bez jakékoli kontroly regulérnosti a proto vám doporučuji pouštět na porty jen funkční konstanty získané z low-level dokumentace o konkrétním zařízení. loop návěští - Skáče na návěští dokud není registr CX roven nule. Při skoku se zároveň zmenší hodnota v CX o jedničku. push registr - Uloží registr na vrch zásobníku. pop registr - Vloží hodnotu z vrcholu zásobníku do registru rep instrukce - Opakuje instrukci (ins, outs, movs, lods, cmps, scas). Opakování se provede například CX-krát u instrukce movsb. lodsb - Nahrává do registru AL bajt z adrsy DS:[SI] a SI zvýší/sníží podle DF flagu. Pro přesun více bajtů se používá ve spojení s instrukcí rep (viz. rep). Počet přenášených bitů je určen tvarem instrukce: lodsb - 8-bit (i8086+) DS:[SI] -> al lodsw - 16-bit (i8086+) DS:[SI] -> ax lodsd - 32-bit (i80386+) DS:[ESI] -> eax movsb - Proved kopírování bloku paměti z adresy DS:SI na ES:DI. Pro přesun více bajtů se používá ve spojení s instrukcí rep (viz. rep). Počet přenášených bitů je určen tvarem instrukce: movsb - 8-bit (i8086+) -> cx+1 movsw - 16-bit (i8086+) -> cx+2 movsd - 32-bit (i80386+) -> cx+4 test oper1,opre2 - Provede logickou operaci AND, ale nemění operandy. Nastaví flagy podle vísledku. Používá se jako generátor podmínky pro následující instrukci skoku. cmp oper1,oper2 - Provede oper2-oper1, ale nemění operandy. Nastaví flagy podle vísledku. Používá se jako generátor podmínky pro následující instrukci skoku. inc operand - Provede operand = operand + 1 add oper1,opre2 - Provede oper1 = oper1 + oper2 • showcel.asm • DOSSEG ; segmenty jsou řazeny DOSovským řazením .MODEL SMALL ; data a kód v samostatných segmentech .STACK 200h ; velikost odkládacího zásobníku 200h bajtů .DATA ; část obsahující statická data PalRaw db 256 DUP("RGB") ; 256x opakující se text RGB = místo pro uložení palety ErrMsg db 10,13,"chyba" ; text chybové zprávy FName db "picture.cel",0,8 ; jméno CEL, který se má zobrazit (musí být 320x200) .CODE ; segment kódu Ideal ; režim Ideal: standartní syntaxe TASM START: ; začátek vlastního kódu mov ax,13h ; ax <- 13h : video mód 320x200x256 int 10h ; proveď přerušení BIOSu INT10h mov ax,seg FName ; ax <- segment FName mov ds,ax ; ds <- ax nelze provédst rovnou mov ds,seg FName mov dx,offset FName ; dx <- offset FName, jméno souboru je teď v ds:dx mov ax,3d00h ; funkce DOSu 3dh - otevření souboru int 21h ; proveď přerušení DOSu INT21h jc @error ; pokud došlo k chybě skočí na @error mov bx,ax ; bx <- ax - handler otevřeného souboru mov ax,4201h ; ah <- 42h, al <- 1h : funkce DOSu - seek na cx:dx xor cx,cx ; cx <- 0 mov dx,32 ; dx <- 32 - přeskočí hlavičku CEL souboru int 21h ; proveď přerušení DOSu INT21h mov dx,offset PalRaw ; dx <- offset PalRaw : paleta se uloží do ds:dx mov cx,768 ; cx <- 3*256 - počet bajtů palety 256*(R,G,B) mov ah,3fh ; funkce DOSu 3fh - čtení dat ze souboru int 21h ; proveď přerušení DOSu INT21h jc @error ; pokud došlo k chybě skočí na @error mov dx,03c8h ; dx <- 03c8h - register VGA karty: pel addr/write xor al,al ; al <- 0 - začátek nastevení palety out dx,al ; al vyšle na port dx inc dx ; dx <- 03c9h - register VGA karty: pel data mov si,offset PalRaw ; si <- offset PalRaw : paleta je na ds:si mov cx,768 ; cx <- 768 - počet opakování cyklu loop (3*256) @color: lodsb ; nahraje do al bajt z ds:si a provede inc si out dx,al ; nastaví 768-cx složku barvy (768-cx) div 3 loop @color ; provede dec cx a skáče na @color pokud cx>0 push ds ; uschová ds do zásobníku mov dx,0a000h ; dx <- A000h mov ds,dx ; ds <- dx : nelze provédst rovnou mov ds,0a000h xor dx,dx ; dx <- 0 (adresa začátku videopaměti A000:0000h) mov cx,0fa00h ; cx <- 64000 - počet pixelů na obrazovce 320*200 mov ah,3fh ; funkce DOSu 3fh - čtení dat ze souboru int 21h ; proveď přerušení DOSu INT21h pop ds ; obnovení ds registeru jc @error ; pokud došlo k chybě skočí na @error mov ah,3eh ; ah <- funkce DOSu 3eh - zavření souboru int 21h ; proveď přerušení DOSu INT21h xor ax,ax ; ax <- 0 int 16h ; volá přerušení 16h - čte znak z klávesnice ... mov ax,3h ; ax <- 3h : video mód 80x25x16 int 10h ; proveď přerušení BIOSu INT10h jmp @theend ; nepodmíněný skok na @theend @error: mov ax,3h ; ax <- 3h : video mód 80x25x16 int 10h ; proveď přerušení BIOSu INT10h mov ax,seg ErrMsg ; ax <- segment ErrMsg mov ds,ax ; ds <- ax nelze provédst rovnou mov ds,seg ErrMsg mov dx,offset ErrMsg ; dx <- offset ErrMsg, chybová zpráva je teď v ds:dx mov ah,9h ; funkce DOSu 9h - zobrazení řetězce na std. výstup int 21h ; proveď přerušení DOSu INT21h @theend: mov ax,4c00h ; funkce DOSu 4c00h - návrat řízení DOSu int 21h ; proveď přerušení DOSu INT21h END START ; konec CODE segmentu • txtscrol.asm • DOSSEG ; segmenty jsou řazeny DOSovským řazením .MODEL SMALL ; data a kód v samostatných segemntech .STACK 200h ; velikost odkládacího zásobníku 200h bajtů .DATA ; část obsahující statická data HiddenMsg db "B",15,"A",15,"F",15,"!",15 ; text, který se vypíše na 26. řádku bílou bravou .CODE ; segment kódu Ideal ; režim Ideal: standartní syntaxe TASM START: ; začátek vlastního kódu mov dx,seg HiddenMsg ; dx <- segment HiddenMsg mov ds,dx ; ds <- dx mov si,offset HiddenMsg ; si <- offset HiddenMsg : zpráva je teď na ds:si mov dx,0b800h ; dx <- 0b800h : segment začátku VRAM v 80x25x16 mov es,dx ; es <- dx mov di,25*160 ; di <- 25*80*2 : 26. řádka (normálně není vidět) mov cx,8 ; cx <- 8 dojde k přenos 8 bajtů z ds:si -> es:di rep movsb ; provede samotný přesun xor cx,cx ; cx <- 0 : cx bude čítač řádek @nextline: ; cyklus nastavující začátek vykreslování z VRAM mov dx,3d4h ; dx <- 3d4h : register VGA - CRTC adress register mov al,12 ; al <- 12 : na port půjde vyšší byte poč. adresy mov ah,ch ; ah <- ch : počáteční adresa - vyšší byte out dx,ax ; pošle ax na port dx (CRTC) inc al ; al <- 13 : na port půjde nižší byte poč. adresy mov ah,cl ; ah <- cl : počáteční adresa - nižšší byte out dx,ax ; pošle ax na port dx (CRTC) xor bx,bx ; bx <- 0 : bx bude čítač mikrořádek @nextrow: ; cykuls nastavující horizontální posun mov dx,3dah ; dx <- 3dah : register VGA - wait vertical retrace @@1: in al,dx ; z portu dx naplní register al test al,8 ; and al,8 : nemění se operandy jz @@1 ; jestliže je zero skáče na @@1 @@2: in al,dx ; z portu dx naplní register al test al,8 ; and al,8 : nemění se operandy jnz @@2 ; jestliže není zero skáče na @@2 mov dx,3d4h ; dx <- 3d4h : register VGA - CRTC adress register mov ah,bl ; ah <- bl : v bl je aktuální pozice mikrořádky mov al,8 ; al <- 8 : bude proveden vertikální posun out dx,ax ; na vyšle ax na port dx (CRTC) inc bl ; bl <- bl + 1 : další mikrořádek cmp bl,16 ; porovná bl a 16 jnz @nextrow ; je-li bl<16 skáče na @nextrow add cx,80 ; cx <- cx + 80 : další znaková řádka cmp cx,2000 ; porovná cx a 80*25 jnz @nextline ; je-li cx<2000 potom skáče na @nextline mov al,12 ; al <- 12 : na port půjde vyšší byte poč. adresy xor ah,ah ; ah <- 0 : počáteční adresa - vyšší byte out dx,ax ; pošle ax na port dx (CRTC) inc al ; al <- 13 : : na port půjde nižší byte poč. adresy out dx,ax ; pošle ax na port dx (CRTC) mov al,8 ; al <- 8 : bude proveden vertikální posun out dx,ax ; pošle ax na port dx (CRTC) mov ax,4c00h ; funkce DOSu 4c00h - návrat řízení DOSu int 21h ; proveď přerušení DOSu INT21h END START výheň