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ň