Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3)

26. 9. 2024
Doba čtení: 50 minut

Sdílet

 Autor: Thomas Nguyen, podle licence: CC BY-SA 4.0
Dokončíme popis blokových a řetězcových instrukcí, které jsou specifickým rysem instrukční sady Intel 8086/8088. Ukážeme si vliv směru přenosu dat a zaměříme se i na problematiku rychlosti provádění blokových operací.

Obsah

1. Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3)

2. Blokový přenos prováděný po bajtech

3. Realizace blokového přenosu instrukcí MOVSx

4. Opakování operace blokového přenosu prefixem REP

5. Porovnání rychlosti jednotlivých realizací blokových přenosů

6. Krátké zopakování: přenos rastrového obrázku z kódového segmentu do obrazové paměti

7. Přenos maximálního počtu bajtů instrukcí REP MOVSB

8. Jak velký blok se přenese při nastavení CX=0?

9. Přenos po bajtech, 16bitových slovech nebo 32bitových slovech

10. Porovnání rychlosti přenosu realizovaného po bajtech, 16bitových či 32bitových slovech

11. Počet cyklů nutných pro přenos bloku o velikosti 64000 bajtů

12. Určení směru přenosu při blokových operacích

13. Blokový přenos ve chvíli, kdy se zdrojový a cílový blok překrývají

14. Realizace zpětného blokového přenosu

15. Korektní realizace zpětného blokového přenosu

16. Úplný zdrojový kód příkladu realizujícího zpětný blokový přenos

17. Vyhledávání znaku v řetězci

18. Seznam již popsaných instrukcí

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3)

V dnešním článku dokončíme popis blokových a řetězcových instrukcí, které jsou specifickým rysem instrukční sady mikroprocesorů Intel 8086 (a tím pádem i Intel 8088). Ukážeme si například vliv změny směru načítání či ukládání dat, vliv instrukčního prefixu REP, ale například i způsob vyhledání znaku v řetězci atd. Nezapomeneme ani na problematiku rychlosti provádění blokových operací, protože mikroprocesory Intel se v tomto ohledu dosti významným způsobem zlepšovaly.

Připomeňme si, které instrukce řadíme mezi instrukce řetězcové a blokové:

Instrukce Stručný popis instrukce
CLD nastaví příznak DF pro určení směru přenosu (nahoru/dolů)
STD nastaví příznak DF pro určení směru přenosu (nahoru/dolů)
   
LODSB načtení bajtu do AL z DS : [SI], zvýšení/snížení SI o 1
LODSW načtení slova do AX z DS : [SI], zvýšení/snížení SI o 2
STOSB uložení bajtu z AL do ES : [DI], zvýšení/snížení DI o 1
STOSW uložení slova z AX do ES : [DI], zvýšení/snížení DI o 2
MOVSB kombinace LODSB + STOSB v jediné instrukci (AL se nemodifikuje)
MOVSW kombinace LODSW + STOSW v jediné instrukci (AX se nemodifikuje)
   
CMPSB porovnání dvou bajtů z DS : [SI] a ES : [DI], zvýšení/snížení SI a DI
CMPSW porovnání dvou slov z DS : [SI] a ES : [DI], zvýšení/snížení SI a DI
SCASB nalezení bajtu v AL na adrese DS : [SI] (mění příznaky)
SCASW nalezení slova v AX na adrese DS : [SI] (mění příznaky)
   
INSB přečtení bajtu z portu, uložení na ES : [DI], zvýšení/snížení DI
OUTSB zápis bajtu na port z DS : [SI], zvýšení/snížení SI
   
REP/REPE/REPZ opakování další operace CX-krát
REPNE/REPNZ opakování další operace CX-krát, nebo až bude ZF==1

2. Blokový přenos prováděný po bajtech

Instrukce LODSB a STOSB můžeme velmi snadno „spárovat“ a realizovat tak operaci přesunu jednoho bajtu (popř. 16bitového nebo u pozdějších čipů i 32bitového slova). Připomeňme si, že LODSB načítá hodnotu z adresy DS : [SI] a STOSB ukládá hodnotu na adresu ES : [DI], přičemž se korektně zvýší jak registr SI, tak i registr DI. A pochopitelně můžeme mezi LODSB a STOSB vložit další instrukci/instrukce a realizovat tak například negaci obrázku atd. Typicky se tato dvojice instrukcí doplňuj instrukcí LOOP pro snížení registru CX o jedničku a skok ve chvíli, kdy se ještě nedosáhlo nuly:

opak:
        lodsb     ; precteni bajtu a posun adresy
        ...       ; modifikace bajtu v AL
        stosb     ; zapis bajtu a posun adresy
        loop opak

V dnešním prvním demonstračním příkladu přepíšeme část řetězce na adrese message částí řetězce na adrese replacement. Řetězce nejsou ukončeny nulou, takže použijeme explicitně nastavené počitadlo:

BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        print message
 
        push cs
        pop  es   ; ES:DI obsahuje adresu prvniho znaku ve zprave
        mov  di, message
 
        push cs
        pop  ds   ; DS:SI obsahuje adresu prvniho znaku ve zprave
        mov  si, replacement
 
        mov  cx, 12 ; pocet prepisovanych znaku
opak:
        lodsb     ; precteni znaku a posun adresy
        stosb     ; zapis znaku a posun adresy
        loop opak
 
        print message
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message     db "Hello, world!", 0x0d, 0x0a, "$"
replacement db "Zdravim svet"

3. Realizace blokového přenosu instrukcí MOVSx

V praxi se velmi často setkáme s požadavkem na realizaci „čistého“ blokového přenosu, při němž se nijak nemění přenášená data. To znamená, že namísto:

opak:
        lodsb     ; precteni bajtu a posun adresy
        ...       ; modifikace bajtu v AL
        stosb     ; zapis bajtu a posun adresy
        loop opak

vlastně potřebujeme realizovat pouze:

opak:
        lodsb     ; precteni bajtu a posun adresy
        stosb     ; zapis bajtu a posun adresy
        loop opak

V instrukčním souboru mikroprocesorů Intel 8086/8088 ovšem existuje i instrukce MOVSx (tedy například MOVSB), která spojuje možnosti LODSB a STOSB do jediné instrukce (což je interně již dosti komplikovaná operace):

opak:
        movsb     ; precteni bajtu a posun adresy, zapis bajtu a posun adresy
        loop opak

Otestujme si i tuto operaci na nepatrně upraveném demonstračním příkladu:

BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        print message
 
        push cs
        pop  es   ; ES:DI obsahuje adresu prvniho znaku ve zprave
        mov  di, message
 
        push cs
        pop  ds   ; DS:SI obsahuje adresu prvniho znaku ve zprave
        mov  si, replacement
 
        mov  cx, 12 ; pocet prepisovanych znaku
opak:
        movsb     ; precteni znaku a posun adresy
                  ; zapis znaku a posun adresy
        loop opak
 
        print message
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message     db "Hello, world!", 0x0d, 0x0a, "$"
replacement db "Zdravim svet"

4. Opakování operace blokového přenosu prefixem REP

Již minule jsme se seznámili s instrukčním prefixem REP, který umožňuje opakovat některou z řetězcových nebo blokových operací (STOSB, LODSB atd.) CX-krát. Tentýž instrukční prefix je možné použít společně s operací MOVSB a realizovat tak skutečný blokový přenos z adresy DS : [SI] do paměťového bloku začínajícího na adrese ES : [DI], přičemž se přenese přesně CX bajtů:

        mov  cx, 12 ; pocet prepisovanych znaku
        rep movsb   ; precteni znaku a posun adresy
                    ; zapis znaku a posun adresy

Opět si ukažme použití takto modifikované instrukce pro přepis obsahu části řetězce jiným řetězcem. Bude se tedy jednat o zkrácenou verzi předchozích dvou demonstračních příkladů:

BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        print message
 
        push cs
        pop  es   ; ES:DI obsahuje adresu prvniho znaku ve zprave
        mov  di, message
 
        push cs
        pop  ds   ; DS:SI obsahuje adresu prvniho znaku ve zprave
        mov  si, replacement
 
        mov  cx, 12 ; pocet prepisovanych znaku
        rep movsb   ; precteni znaku a posun adresy
                    ; zapis znaku a posun adresy
 
        print message
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message     db "Hello, world!", 0x0d, 0x0a, "$"
replacement db "Zdravim svet"

5. Porovnání rychlosti jednotlivých realizací blokových přenosů

Zkusme si nyní porovnat rychlost různých realizací blokových přenosů. Budeme přitom uvažovat přenos z adresy DS : [SI] a na adresu ES : [DI], přičemž se SI a DI budou postupně zvyšovat o jedničku a provede se CX opakování. Takovou operaci lze realizovat mnoha způsoby, například explicitně zapsanou smyčkou:

opak:
        mov al, ds:[si]     ; 12+5+2=19
        mov es:[di], al     ; 12+5+2=19
        inc si              ; 3
        inc di              ; 3
        loop opak           ; 17
        ; celkem            ; 3904000
Poznámka: což dosahuje téměř času jedné sekundy!

Použití kombinace LODSB a STOSB by mělo vést k rychlejší realizaci:

opak:
        lodsb               ; 16
        stosb               ; 11
        loop opak           ; 17
        ; celkem            ; 2816000
Poznámka: ve skutečnosti je to o cca 12 cyklů méně – poslední skok se již neprovede.

Použití MOVSB s explicitně zapsanou smyčkou je opět o několik desítek procent rychlejší:

opak:
        movsb               ; 18
        loop opak           ; 17
        ; celkem            ; 2240000 = (18 + 17) * 64000
Poznámka: ve skutečnosti je to opět o cca 12 cyklů méně – poslední skok se již neprovede.

A konečně použití MOVSB s opakováním bude na Intelu 8088 či 8086 nejrychlejší možnou realizací blokového přenosu:

     rep movsb              ; 9 + 17n
        ; celkem            ; 1088009 = 9 + 17*64000
Poznámka: v komentářích je uveden počet cyklů platných pro procesoru Intel 8086 nebo Intel 8088.

6. Krátké zopakování: přenos rastrového obrázku z kódového segmentu do obrazové paměti

S programovým kódem uvedeným v této kapitole jsme se již setkali. Je zde realizován přenos rastrového obrázku z kódového segmentu do obrazové paměti (Video RAM). Vše se bude odehrávat ve standardním grafickém režimu 13H, takže přenášený obrázek bude mít velikost 320×200 pixelů, tedy přesně 64000 bajtů. Obrázek lze na platformě Intel 8086/8088 přenést buď po bajtech nebo po celých 16bitových slovech. Zvolíme druhou možnost (čímž mimochodem eliminujeme možnost reálného využití latche, což nám však nebude vadit):

; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*200/2   ; pocet zapisovanych bajtu (=pixelu)
        rep movsw           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

Výsledkem by měla být obrazovka s tímto obsahem:

Obrázek 1: Obrazovka po přenosu rastrového obrázku o velikosti 64000 bajtů

7. Přenos maximálního počtu bajtů instrukcí REP MOVSB

Instrukce REP MOVSB dokáže přenést maximálně CX bajtů a vzhledem k tomu, že CX je šestnáctibitovým registrem, je maximální velikost přenášeného bloku rovna 65535 bajtům. Nelze tedy přenést celý segment (jeden bajt chybí), což lze nahradit explicitně provedenou operací MOVSB na konci. Předpokládá se přitom, že SI i DI budou nulové, protože nelze provést přenosy přes hranice segmentů (dojde k přetečení):

     rep movsb  ; přenos 65535 bajtů
     movsb      ; přenos posledního bajtu

Ukažme si to (zde jen čistě pro opakování) na přenosu obrázku do obrazové paměti. Omezeni jsme na velikost kódového segmentu, tedy na 64kB i na možnost přenosu maximálně 65535 bajtů:

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku: prenos 65535 bajtu/pixelu
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        xor si, si          ; nyni DS:SI obsahuje adresu prvniho bajtu v kodovem segmentu
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 65535       ; pocet zapisovanych bajtu (=pixelu)
        rep movsb           ; prenos celeho obrazku

        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

Výsledek:

Obrázek 2: Výsledek přenosu celého kódového segmentu do obrazové paměti.

Ještě si ukažme, co se stane, když začneme přenášet data z poloviny kódového segmentu (tedy například od adresy 32000). Mělo by dojít k přetečení obsahu registru SI a tím pádem i k přenosu kódu i začátku obrazu do druhé poloviny obrazovky:

Obrázek 3: Výsledek přenosu celého kódového segmentu do obrazové paměti, ovšem začínáme od SI=32000 a nikoli od nuly.

8. Jak velký blok se přenese při nastavení CX=0?

Následující sekvence instrukcí přenese celých 65536 bajtů, protože LOOP nejdříve sníží obsah CX a posléze ho kontroluje na nulovost před provedením skoku:

        xor cx, cx          ; pocet zapisovanych bajtu (=pixelu)
opak:
        movsb
        loop opak

Ovšem co provede přepis této smyčky do následující podoby?

        xor cx, cx          ; pocet zapisovanych bajtu (=pixelu)
        rep movsb

Výsledkem bude, že se NEpřenese žádný blok, protože ve skutečnosti REP kontroluje obsah registru CX ještě před přenosem prvního bajtu:

Obrázek 4: Výsledek přenosu bloku o nulové délce.

Úplný zdrojový kód takto upraveného demonstračního příkladu vypadá následovně:

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku, prenos 0 bajtu.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_320x200_image_0B.asm
;
; nebo pouze:
;     nasm -o vga.com vga_320x200_image_0B.asm
 
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        xor cx, cx          ; pocet zapisovanych bajtu (=pixelu)
        rep movsb           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

9. Přenos po bajtech, 16bitových slovech nebo 32bitových slovech

Přenos rastrového obrázku (nebo libovolného jiného bloku) po bajtech již velmi dobře známe:

        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*200     ; pocet zapisovanych bajtu (=pixelu)
        rep movsb           ; prenos celeho obrazku

Víme také, že obrázek má „kulatou“ velikost 64000 bajtů, což je hodnota celočíselně dělitelná dvěma. Můžeme tedy alternativně přenášet i po celých šestnáctibitových slovech:

        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*200/2   ; pocet zapisovanych slov (=dvoupixelu)
        rep movsw           ; prenos celeho obrazku

Současně se jedná o hodnotu dělitelnou i čtyřmi, takže by bylo možné provádět blokový přenos i po 32bitových slovech. Taková možnost na čipech Intel 8086/8088 neexistuje, ovšem na čipech 80386 a vyšších je to možné realizovat pomocí instrukce MOVSD. Nejprve se tedy assembleru povolíme použití instrukčního souboru 80386:

BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru

A přenos provedeme takto:

        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*200/4   ; pocet zapisovanych 32bitovych slov (=ctyrpixelu)
        rep movsd           ; prenos celeho obrazku

Výsledný příklad by mohl vypadat následovně:

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku: prenos po 32bitovych slovech.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_320x200_image_movsd.asm
;
; nebo pouze:
;     nasm -o vga.com vga_320x200_image_movsd.asm
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*200/4   ; pocet zapisovanych 32bitovych slov (=ctyrpixelu)
        rep movsd           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

10. Porovnání rychlosti přenosu realizovaného po bajtech, 16bitových či 32bitových slovech

Podívejme se, jak rychlý bude přenos bloku při použití různých forem přenosu – po bajtech, šestnáctibitových slovech nebo po slovech 32bitových. Nyní již budeme rozlišovat mezi několika procesorovými architekturami (což je ovšem problematika, ke které se ještě vrátíme):

Operace 8086 186 286 386 486 Pentium
rep movsb 9+17n 8+8n 5+4n 7+4n 12+3n* 3+n
rep movsw 9+25n 8+8n 5+4n 7+4n 12+3n* 3+n
rep movsd × × × 7+4n 12+3n* 3+n

Povšimněte si, že rozdíl mezi šířkou přenášených dat nalezneme vlastně jen na čipu 8086.

Poznámka: na Pentiu není možné tyto instrukce párovat s jinou instrukcí, což je i pochopitelné, když si uvědomíme, jak složitá operace se vlastně provádí.

11. Počet cyklů nutných pro přenos bloku o velikosti 64000 bajtů

Nyní je již snadné zjistit, kolik strojových cyklů se „spálí“ při přenosu bloku o velikosti 64000 bajtů. Přitom porovnáváme čistě jen počet cyklů a nikoli reálný čas, protože ten závisí na frekvenci hodinového signálu a tedy znamená, že dvě totožné sekvence instrukcí se provedou rychleji na mikroprocesoru s vyšší frekvencí hodinového signálu. Nás však nyní bude zajímat čistě rychlost implementace blokových operací:

Operace Přenosů 8086 186 286 386 486 Pentium
rep movsb 64000 1088009 512008 256005 256007 192012 64003
rep movsw 32000 800009 256008 128005 128007 96012 32003
rep movsd 16000 × × × 64007 48012 16003
Poznámka: zde je tedy více než zřejmé, že kvalitnější architektura mikroprocesorů (a šířka datové sběrnice) je stejně důležitým údajem, jako informace o hodinové frekvenci.

12. Určení směru přenosu při blokových operacích

Instrukcemi CLD a STD se mění hodnota příznaku DF uloženého v příznakovém registru FLAGS. Tento příznak ovlivňuje chování těch instrukcí, v nichž se mění zdrojový indexový registr SI a/nebo cílový indexový registr DI. Hodnoty těchto registrů se totiž mohou jak zvyšovat (což jsme si již ukázali), tak i snižovat. Blokový přenos se snižováním adres (a nikoli jejich zvyšováním) se využije ve chvíli, kdy se zdrojový a cílový blok překrývají, což je problém, který je možné si relativně snadno vizualizovat, jak to ostatně uvidíme v navazujících kapitolách.

Poznámka: čipy Intel 8086/8088 byly tak pomalé relativně k rychlosti operační paměti, že se nepoužívala vyrovnávací paměť (cache), takže blokové přenosy směrem dolů nebyly z tohoto pohledu příliš problematické. V dalších generacích řady x86 to však již tak jednoduché není.

13. Blokový přenos ve chvíli, kdy se zdrojový a cílový blok překrývají

Nyní se pokusíme o provedení následujících operací:

  1. Vykreslíme část rastrového obrázku, konkrétně jeho prvních 100 řádků do obrazové paměti.
  2. Přesuneme blok o velikosti 320×100 bajtů (=stejný počet pixelů) ve video RAM z adresy 0 na adresu 320×10, což znamená, že se pokusíme o přesun (resp. kopii) obrázku o deset obrazových řádků níže.

Realizace těchto dvou operací v assembleru je snadná.

První operace:

        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku

Výsledek první operace:

Obrázek 5: Obrazovka po provedení první operace.

Druhá operace:

        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        xor si, si          ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*10      ; ES:DI ukazuje na zacatek radku cislo 10 ve video RAM (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku

Obrázek 6: Obrazovka po provedení druhé operace.

Je dobré si uvědomit, proč vypadá výsledek tak, jak vypadá. Přenesení každého řádku znamená, že si přepíšeme část zdrojového bloku, protože zdrojový a cílový blok se překrývají. Konkrétně se prvních 10 obrazových řádků rozkopíruje do dalších 10 řádků atd., takže ve výsledku se prvních 10 řádků několikrát opakuje v cílovém obrázku. Důvod je ten, že kopírujeme od prvního bajtu směrem k bajtu poslednímu a „dopředně“ si zdroj přepisujeme.

Otázka na čtenáře: jaký bude vizuální výsledek následující operace?

        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        xor si, si          ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 1           ; ES:DI ukazuje na zacatek ciloveho bloku (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku

Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_320x200_image_movsb_forward.asm
;
; nebo pouze:
;     nasm -o vga.com vga_320x200_image_movsb_forward.asm
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
 
        ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        xor si, si          ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*10      ; ES:DI ukazuje na zacatek radku cislo 10 ve video RAM (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

14. Realizace zpětného blokového přenosu

Výše uvedený problém je možné vyřešit tak, že začneme blokový přenos od posledního bajtu a budeme postupně snižovat obsah indexových registrů SI a DI a nikoli je zvyšovat. Navíc je nutné instrukcí STD změnit směr přenosu. Upravený kód může v první variantě vypadat následovně:

        ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        mov si, 320*100     ; konec bloku, ktery se ma prenest
                            ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*(100+10) ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        std                 ; zmena smeru prenosu!
        rep movsb           ; prenos celeho obrazku

A takto vypadají výsledky:

Obrázek 7: Obrazovka po provedení první operace.

Obrázek 8: Obrazovka po provedení druhé operace.

Povšimněte si levého horního rohu. Přes provedením přenosu jsme totiž pixel v tomto rohu vyplnili černou barvou:

        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
        mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem

Při pohledu na obrázek číslo 8 je patrné, že jsme se dopustili klasické „chyby ± 1“, což se pokusíme napravit.

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_320x200_image_movsb_backward_1.asm
;
; nebo pouze:
;     nasm -o vga.com vga_320x200_image_movsb_backward_1.asm
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku
 
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
        mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem
 
        wait_key            ; cekani na klavesu
 
        ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        mov si, 320*100     ; konec bloku, ktery se ma prenest
                            ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*(100+10) ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        std                 ; zmena smeru prenosu!
        rep movsb           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

15. Korektní realizace zpětného blokového přenosu

Jak by tedy měla vypadat korektní realizace zpětného blokového přenosu? Musíme začít od reálné poslední adresy, což ovšem nejsou offsety 320×100 a 320×(100+10), ale hodnoty 320×100–1 a 320×(100+10)-1. Nepatrně tedy upravíme konstanty, kterými naplníme registry SI (od které adresy se bude provádět přenos) a DI (na kterou adresu se bude přenášet):

        ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        mov si, 320*100-1   ; konec bloku, ktery se ma prenest
                            ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*(100+10)-1 ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination)

Samotný blokový přenos již bude probíhat naprosto stejným způsobem:

        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        std                 ; zmena smeru prenosu!
        rep movsb           ; prenos celeho obrazku

A takto vypadají výsledky:

Obrázek 9: Obrazovka po provedení první operace.

Obrázek 10: Obrazovka po provedení druhé operace.

Z těchto dvou screenshotů je patrné, že nyní by měl být blokový přenos korektní.

16. Úplný zdrojový kód příkladu realizujícího zpětný blokový přenos

Úplný zdrojový kód demonstračního příkladu provádějícího zpětný blokový přenos v obrazové paměti vypadá následovně:

; Graficky rezim karty VGA s rozlisenim 320x200 pixelu.
; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_320x200_image_movsb_backward_2.asm
;
; nebo pouze:
;     nasm -o vga.com vga_320x200_image_movsb_backward_2.asm
 
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
;-----------------------------------------------------------------------------
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        mov     ah, 0x4c
        int     0x21
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; nastaveni grafickeho rezimu
%macro gfx_mode 1
        mov     ah, 0
        mov     al, %1
        int     0x10
%endmacro
 
; paleta ve stupnich sedi
%macro grayscale_palette 0
        mov ax, 0x1010      ; cislo sluzby a podsluzby VGA BIOSu
        xor bl, bl          ; index barvy
next_dac:
        mov ch, bl          ; prvni barvova slozka
        shr ch, 1
        shr ch, 1
        mov cl, ch          ; druha barvova slozka
        mov dh, ch          ; treti barvova slozka
        int 0x10            ; modifikace mapovani v DAC
        inc bl              ; zvysit index v DAC
        jnz next_dac        ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        gfx_mode 0x13       ; nastaveni rezimu 320x200 s 256 barvami
        grayscale_palette   ; nastaveni palety se stupni sedi
 
        mov ax, cs
        mov ds, ax
        mov si, image       ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku
 
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov es, ax
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        rep movsb           ; prenos celeho obrazku
 
        xor di, di          ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM
        mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem
 
        wait_key            ; cekani na klavesu
 
        ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat
        mov ax, 0xa000      ; video RAM v textovem rezimu
        mov ds, ax
        mov si, 320*100-1   ; konec bloku, ktery se ma prenest
                            ; DS:SI ukazuje na zacatek video RAM (source)
 
        mov es, ax
        mov di, 320*(100+10)-1 ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination)
 
        mov cx, 320*100     ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum
        std                 ; zmena smeru prenosu!
        rep movsb           ; prenos celeho obrazku
 
        wait_key            ; cekani na klavesu
        exit                ; navrat do DOSu
 
; pridani binarnich dat s rastrovym obrazkem
image:
    incbin "image_320x200.bin"

17. Vyhledávání znaku v řetězci

Některé operace nabízené mikroprocesory Intel 8086/8088 lze použít i pro zpracování řetězců. Ukažme si například, jak by bylo možné realizovat nalezení první mezery v řetězci s následnou záměnou této mezery na hvězdičku:

message     db "Hello, world!", 0x0d, 0x0a, "$"

Výsledkem by měl být řetězec:

message     db "Hello,*world!", 0x0d, 0x0a, "$"

Samotné nalezení mezery lze realizovat operací REPNE SCASB, která postupně načítá jednotlivé bajty a porovnává je s obsahem registru AL. Po nalezení shody je tato operace ukončena:

        pop  es   ; ES:DI obsahuje adresu prvniho znaku ve zprave
        mov  di, message
 
        mov al, " "   ; hledani mezery v retezci
        repne scasb

Nyní nám postačuje upravit obsah indexového registru DI a provést zápis nového znaku:

        mov al, "*"   ; prepis mezery za hvezdicku
        dec di
        stosb

Úplný zdrojový kód dnešního posledního demonstračního příkladu vypadá následovně:

ict ve školství 24

BITS 16         ; 16bitovy vystup pro DOS
CPU 8086        ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        print message
 
        push cs
        pop  es   ; ES:DI obsahuje adresu prvniho znaku ve zprave
        mov  di, message
 
        mov al, " "   ; hledani mezery v retezci
        repne scasb
 
        mov al, "*"   ; prepis mezery za hvezdicku
        dec di
        stosb
 
        print message ; tisk upravene zpravy
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message     db "Hello, world!", 0x0d, 0x0a, "$"

18. Seznam již popsaných instrukcí

Podobně jako v sedmnácté části tohoto seriálu si i dnes uvedeme rozšířenou tabulku se všemi instrukcemi mikroprocesorů Intel 8086/8088, které byly doposud popsány (a doplněny demonstračními příklady):

ADC Add with carry
ADD Add
AND Logical AND
CMP Compare operands
DEC Decrement by 1
DIV Unsigned divide
IDIV Signed divide
IMUL Signed multiply in One-operand form
INC Increment by 1
Jcc Jump if condition
JMP Jump
JCXZ Jump if CX is zero
LOOP/LOOPx Loop control
MUL Unsigned multiply
NEG Two's complement negation
NOT Negate the operand, logical NOT
OR Logical OR
RCL Rotate left (with carry)
RCR Rotate right (with carry)
ROL Rotate left
ROR Rotate right
SAL Shift Arithmetically left (signed shift left)
SAR Shift Arithmetically right (signed shift right)
SBB Subtraction with borrow
SHL Shift left (unsigned shift left)
SHR Shift right (unsigned shift right)
SUB Subtraction
TEST Logical compare (AND)
XOR Exclusive OR
   
XLAT Table look-up translation
   
DAA Decimal adjust AL after addition
DAS Decimal adjust AL after subtraction
AAA ASCII adjust AL after addition
AAD ASCII adjust AX before division
AAM ASCII adjust AX after multiplication
AAS ASCII adjust AL after subtraction
   
CLD Clear direction flag
STC Set carry flag
LODSB Load string byte
LODSW Load string word
STOSB Store byte in string
STOSW Store word in string
MOVSB Move byte from string to string
MOVSW Move word from string to string
CMPSB Compare bytes in memory
CMPSW Compare words
SCASB Compare byte string
SCASW Compare word string
REPxx Repeat MOVS/STOS/CMPS/LODS/SCAS

19. Repositář s demonstračními příklady

Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:

# Příklad Stručný popis Adresa
1 hello.asm program typu „Hello world“ naprogramovaný v assembleru pro systém DOS https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm
2 hello_shorter.asm kratší varianta výskoku z procesu zpět do DOSu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm
3 hello_wait.asm čekání na stisk klávesy https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm
4 hello_macros.asm realizace jednotlivých částí programu makrem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm
       
5 gfx4_putpixel.asm vykreslení pixelu v grafickém režimu 4 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm
6 gfx6_putpixel.asm vykreslení pixelu v grafickém režimu 6 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm
7 gfx4_line.asm vykreslení úsečky v grafickém režimu 4 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm
8 gfx6_line.asm vykreslení úsečky v grafickém režimu 6 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm
       
9 gfx6_fill1.asm vyplnění obrazovky v grafickém režimu, základní varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm
10 gfx6_fill2.asm vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm
11 gfx6_fill3.asm vyplnění obrazovky instrukcí REP STOSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm
12 gfx6_fill4.asm vyplnění obrazovky, synchronizace vykreslování s paprskem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm
       
13 gfx4_image1.asm vykreslení rastrového obrázku získaného z binárních dat, základní varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm
14 gfx4_image2.asm varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm
15 gfx4_image3.asm varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm
16 gfx4_image4.asm korektní vykreslení všech sudých řádků bitmapy https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm
17 gfx4_image5.asm korektní vykreslení všech sudých i lichých řádků bitmapy https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm
       
18 gfx4_image6.asm nastavení barvové palety před vykreslením obrázku https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm
19 gfx4_image7.asm nastavení barvové palety před vykreslením obrázku, snížená intenzita barev https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm
20 gfx4_image8.asm postupná změna barvy pozadí https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm
       
21 gfx6_putpixel1.asm vykreslení pixelu, základní varianta se 16bitovým násobením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm
22 gfx6_putpixel2.asm vykreslení pixelu, varianta s osmibitovým násobením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm
23 gfx6_putpixel3.asm vykreslení pixelu, varianta bez násobení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm
24 gfx6_putpixel4.asm vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm
25 gfx6_putpixel5.asm vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm
       
26 cga_text_mode1.asm standardní textový režim s rozlišením 40×25 znaků https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm
27 cga_text_mode3.asm standardní textový režim s rozlišením 80×25 znaků https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm
28 cga_text_mode_intensity.asm změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm
29 cga_text_mode_cursor.asm změna tvaru textového kurzoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm
30 cga_text_gfx1.asm zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm
31 cga_text_mode_char_height.asm změna výšky znaků https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm
32 cga_text_160×100.asm grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm
       
33 hercules_text_mode1.asm využití standardního textového režimu společně s kartou Hercules https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm
34 hercules_text_mode2.asm zákaz blikání v textových režimech https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm
35 hercules_turn_off.asm vypnutí generování video signálu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm
36 hercules_gfx_mode1.asm přepnutí karty Hercules do grafického režimu (základní varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm
37 hercules_gfx_mode2.asm přepnutí karty Hercules do grafického režimu (vylepšená varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm
38 hercules_putpixel.asm subrutina pro vykreslení jediného pixelu na kartě Hercules https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm
       
39 ega_text_mode_80×25.asm standardní textový režim 80×25 znaků na kartě EGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm
40 ega_text_mode_80×43.asm zobrazení 43 textových řádků na kartě EGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm
41 ega_gfx_mode_320×200.asm přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm
42 ega_gfx_mode_640×200.asm přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm
43 ega_gfx_mode_640×350.asm přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm
44 ega_gfx_mode_bitplanes1.asm ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm
45 ega_gfx_mode_bitplanes2.asm ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm
       
46 ega_320×200_putpixel.asm vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm
47 ega_640×350_putpixel.asm vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm
       
48 ega_standard_font.asm použití standardního fontu grafické karty EGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm
49 ega_custom_font.asm načtení vlastního fontu s jeho zobrazením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm
       
50 ega_palette1.asm změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm
51 ega_palette2.asm změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm
52 ega_palette3.asm změna všech barev v barvové paletě s využitím programové smyčky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm
53 ega_palette4.asm změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm
       
54 vga_text_mode_80×25.asm standardní textový režim 80×25 znaků na kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm
55 vga_text_mode_80×50.asm zobrazení 50 a taktéž 28 textových řádků na kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm
56 vga_text_mode_intensity1.asm změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm
57 vga_text_mode_intensity2.asm změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm
58 vga_text_mode_9th_column.asm modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm
59 vga_text_mode_cursor_shape.asm změna tvaru textového kurzoru na grafické kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm
60 vga_text_mode_custom_font.asm načtení vlastního fontu s jeho zobrazením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm
       
61 vga_gfx_mode_640×480.asm přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm
62 vga_gfx_mode_320×200.asm přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm
63 vga_gfx_mode_palette.asm změna všech barev v barvové paletě grafické karty VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm
64 vga_gfx_mode_dac1.asm využití DAC (neočekávané výsledky) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm
65 vga_gfx_mode_dac2.asm využití DAC (očekávané výsledky) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm
       
66 vga_640×480_putpixel.asm realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm
67 vga_320×200_putpixel1.asm realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm
68 vga_320×200_putpixel2.asm realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm
       
69 vga_gfx_mode_dac3.asm přímé využití DAC v grafickém režimu 13h https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm
       
70 vga_gfx_mode_unchained_step1.asm zobrazení barevných pruhů v režimu 13h https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm
71 vga_gfx_mode_unchained_step2.asm vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm
72 vga_gfx_mode_unchained_step3.asm vykreslení barevných pruhů do vybraných bitových rovin https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm
       
73 vga_gfx_mode_320×400.asm nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm
74 vga_320×200_image.asm zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm
75 vga_320×200_unchained_image1.asm zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm
76 vga_320×200_unchained_image2.asm zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm
77 vga_320×400_unchained_image.asm zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm
       
78 vga_vertical_scroll1.asm vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm
79 vga_vertical_scroll2.asm vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm
80 vga_split_screen1.asm režim split-screen a scrolling, nefunční varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm
81 vga_split_screen2.asm režim split-screen a scrolling, plně funkční varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm
82 vga_horizontal_scroll1.asm horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm
83 vga_horizontal_scroll2.asm horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm
84 vga_horizontal_scroll3.asm jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm
       
85 vga_320×240_image.asm nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm
       
86 io.asm knihovna maker pro I/O operace https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm
87 vga_lib.asm knihovna maker a podprogramů pro programování karty VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm
88 vga_320×240_lib.asm nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm
       
89 vga_bitblt1.asm první (naivní) implementace operace BitBLT https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm
90 vga_bitblt2.asm operace BitBLT s výběrem bitových rovin pro zápis https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm
91 vga_bitblt3.asm operace BitBLT s výběrem bitových rovin pro čtení i zápis https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm
92 vga_bitblt4.asm korektní BitBLT pro 16barevný režim, realizace makry https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm
93 vga_bitblt5.asm korektní BitBLT pro 16barevný režim, realizace podprogramem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm
       
94 vga_bitblt_rotate.asm zápisový režim s rotací bajtu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm
95 vga_bitblt_fast.asm rychlá korektní 32bitová operace typu BitBLT https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm
96 vga_320×400_bitblt1.asm přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm
97 vga_320×400_bitblt2.asm přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm
98 vga_write_modes1.asm volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm
99 vga_write_modes2.asm volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm
100 vga_write_modes3.asm volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm
       
101 instruction_jump.asm použití instrukce JMP https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm
102 instruction_jnz.asm použití instrukce JNZ pro realizaci programové smyčky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm
103 instruction_jz_jmp.asm použití instrukcí JZ a JMP pro realizaci programové smyčky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm
104 instruction_loop.asm použití instrukce LOOP pro realizaci programové smyčky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm
       
105 instruction_template.asm šablona všech následujících demonstračních příkladů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm
106 instruction_print_hex.asm tisk osmibitové hexadecimální hodnoty https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm
107 instruction_xlat.asm využití instrukce XLAT pro získání tisknutelné hexadecimální cifry https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm
       
108 instruction_daa.asm operace součtu s využitím binární i BCD aritmetiky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm
109 instruction_daa_sub.asm instrukce DAA po provedení operace rozdílu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm
110 instruction_das.asm instrukce DAS po provedení operace rozdílu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm
111 instruction_aaa.asm korekce výsledku na jedinou BCD cifru operací AAA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm
112 instruction_mul.asm ukázka výpočtu součinu dvou osmibitových hodnot https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm
113 instruction_aam.asm BCD korekce po výpočtu součinu instrukcí AAM https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm
       
114 instruction_stosb.asm blokový zápis dat instrukcí STOSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm
115 instruction_rep_stosb.asm opakované provádění instrukce STOSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm
116 instruction_lodsb.asm čtení dat instrukcí LODSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm
117 instruction_movsb.asm přenos jednoho bajtu instrukcí MOVSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm
118 instruction_rep_movsb.asm blokový přenos po bajtech instrukcí MOVSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm
119 instruction_rep_scas.asm vyhledávání v řetězci instrukcí SCAS https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm
       
120 vga_320×200_image_0B.asm výsledek blokového přenosu ve chvíli, kdy je CX=0 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm
121 vga_320×200_image_64kB.asm výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm
122 vga_320×200_image_movsb.asm blokový přenos v rámci obrazové paměti instrukcí REP MOVSB https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm
123 vga_320×200_image_movsw.asm blokový přenos v rámci obrazové paměti instrukcí REP MOVSW https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm
124 vga_320×200_image_movsd.asm blokový přenos v rámci obrazové paměti instrukcí REP MOVSD https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm
125 vga_320×200_image_movsb_forward.asm blokový přenos překrývajících se bloků paměti (zvyšující se adresy) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_forward.asm
126 vga_320×200_image_movsb_backward1.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward1.asm
127 vga_320×200_image_movsb_backward2.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward2.asm

20. Odkazy na Internetu

  1. The Intel 8088 Architecture and Instruction Set
    https://people.ece.ubc.ca/~ed­c/464/lectures/lec4.pdf
  2. x86 Opcode Structure and Instruction Overview
    https://pnx.tf/files/x86_op­code_structure_and_instruc­tion_overview.pdf
  3. x86 instruction listings (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_instruction_listin­gs
  4. x86 assembly language (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_assembly_language
  5. Intel Assembler (Cheat sheet)
    http://www.jegerlehner.ch/in­tel/IntelCodeTable.pdf
  6. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  7. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  8. Chip Hall of Fame: Intel 8088 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor
  9. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  10. Apple II History Home
    http://apple2history.org/
  11. The 8086/8088 Primer
    https://www.stevemorse.or­g/8086/index.html
  12. flat assembler: Assembly language resources
    https://flatassembler.net/
  13. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  14. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  15. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  16. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  17. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  18. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  19. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  20. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  21. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  22. Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
    https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/
  23. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  24. RGB Classic Games
    https://www.classicdosgames.com/
  25. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  26. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  27. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  28. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  29. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  30. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  31. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  32. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  33. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  34. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  35. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  36. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  37. 6845 – Motorola CRT Controller
    https://stanislavs.org/hel­ppc/6845.html
  38. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  39. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  40. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  41. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  42. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  43. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  44. flat assembler: Assembly language resources
    https://flatassembler.net/
  45. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  46. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  47. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  48. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  49. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  50. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  51. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  52. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  53. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  54. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  55. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  56. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  57. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  58. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  59. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  60. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  61. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  62. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  63. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  64. DOSBox
    https://www.dosbox.com/
  65. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  66. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  67. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  68. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  69. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  70. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  71. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  72. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  73. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  74. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  75. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  76. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  77. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  78. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
  79. Why the EGA can only use 16 of its 64 colours in 200-line modes
    https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/
  80. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  81. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  82. Why were those colors chosen to be the default palette for 256-color VGA?
    https://retrocomputing.stac­kexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga
  83. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  84. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  85. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  86. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
  87. Introduction to VGA Mode ‚X‘
    https://web.archive.org/web/20160414072210/htt­p://fly.srk.fer.hr/GDM/ar­ticles/vgamodex/vgamx1.html
  88. VGA Mode-X
    https://web.archive.org/web/20070123192523/htt­p://www.gamedev.net/referen­ce/articles/article356.asp
  89. Mode-X: 256-Color VGA Magic
    https://downloads.gamedev­.net/pdf/gpbb/gpbb47.pdf
  90. Instruction Format in 8086 Microprocessor
    https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx
  91. How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
    https://retrocomputing.stac­kexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing
  92. VGA Hardware
    https://wiki.osdev.org/VGA_Hardware
  93. Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
    https://moddingwiki.shika­di.net/wiki/OPL_chip
  94. Does anybody understand how OPL2 percussion mode works?
    https://forum.vcfed.org/in­dex.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/
  95. Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
    https://www.youtube.com/watch?v=a7I-QmrkAak
  96. Yamaha OPL vs OPL2 vs OPL3 comparison
    https://www.youtube.com/wat­ch?v=5knetge5Gs0
  97. OPL3 Music Crockett's Theme
    https://www.youtube.com/wat­ch?v=HXS008pkgSQ
  98. Bad Apple (Adlib Tracker – OPL3)
    https://www.youtube.com/wat­ch?v=2lEPH6Y3Luo
  99. FM Synthesis Chips, Codecs and DACs
    https://www.dosdays.co.uk/to­pics/fm_synthesizers.php
  100. The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
    https://www.youtube.com/wat­ch?v=6JlFIFz1CFY
  101. [adlib tracker II techno music – opl3] orbit around alpha andromedae I
    https://www.youtube.com/wat­ch?v=YqxJCu_WFuA
  102. [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
    https://www.youtube.com/wat­ch?v=daSV5mN0sJ4
ikonka

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.