SIMD instrukce na 80×86: dokončení popisu MMX, instrukce 3DNow!

18. 2. 2025
Doba čtení: 67 minut

Sdílet

Intel microprocessor Pentium MMX 233 s architekturou P5 (P55C)
Autor: Raimond Spekking, podle licence: CC BY-SA 4.0
Dnes si popíšeme zbylé MMX instrukce a většinu instrukcí použijeme v příkladech. Také si popíšeme instrukční sadu 3DNow! společnosti AMD. Ta nebyla přímou konkurencí MMX, ale spíše první vlaštovkou vedoucí k SSE a AVX.

Obsah

1. Aritmetické a logické posuny prvků vektorů

2. První demonstrační příklad: logické posuny doleva

3. Druhý demonstrační příklad: logické posuny doprava

4. Třetí demonstrační příklad: aritmetické posuny doprava

5. Porovnání prvků vektorů

6. Čtvrtý demonstrační příklad: porovnání prvků na rovnost

7. Pátý demonstrační příklad: porovnání prvků na relaci „větší než“

8. Transformace mezi různými typy vektorů

9. Šestý demonstrační příklad: rozbalení bajtů z vektorů

10. Sedmý demonstrační příklad: rozbalení slov z vektorů

11. Osmý demonstrační příklad: rozbalení dvojslov z vektorů

12. Devátý demonstrační příklad: zabalení vektorů slov do vektoru bajtů

13. Desátý demonstrační příklad: řešení přetečení při zabalování vektorů

14. Instrukční sada MMX: shrnutí

15. Seznam všech popsaných instrukcí MMX

16. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX

17. Datové typy instrukcí 3DNow!

18. Vektorové instrukce definované v rozšíření 3DNow!

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

20. Odkazy na Internetu

1. Aritmetické a logické posuny prvků vektorů

Na články [1] a [2] dnes navážeme. Popíšeme si zbytek instrukcí ze sady MMX a většinu instrukcí použijeme v demonstračních příkladech. Taktéž si – ovšem už bez příkladů – popíšeme instrukční sadu 3DNow! společnosti AMD. Tato sada nebyla přímou konkurencí MMX, ale spíše první vlaštovkou, která vedla k SSE a posléze i k rozšířením AVX.

Začneme popisem MMX instrukcí určených pro provádění aritmetických a logických posunů prvků vektorů. Tyto instrukce se od sebe pochopitelně odlišují typem posunu (doleva, doprava s doplněním nuly či doprava s kopií nejvyššího bitu) i tím, jak široké jsou prvky vektorů. Je možné použít 16bitová slova, 32bitová slova a 64bitová slova (nikoli jednotlivé bajty). Žádná z těchto instrukcí nemění příznakové bity:

# Instrukce Stručný popis instrukce
1 PSLLW logický posun doleva vektorů s prvky typu 16bitové slovo
2 PSLLD logický posun doleva vektorů s prvky typu 32bitové slovo
3 PSLLQ logický posun doleva 64bitové hodnoty
     
4 PSRLW logický posun doprava vektorů s prvky typu 16bitové slovo
5 PSRLD logický posun doprava vektorů s prvky typu 32bitové slovo
6 PSRLQ logický posun doprava 64bitové hodnoty
     
7 PSRAW aritmetický posun doprava vektorů s prvky typu 16bitové slovo
8 PSRAD aritmetický posun doprava vektorů s prvky typu 32bitové slovo
Poznámka: jedná se o zkratky odvozené z Parallel Shift Left/Right Logical/Arithmetic Word/Doubleword/Quadword.

2. První demonstrační příklad: logické posuny doleva

V dnešním prvním demonstračním příkladu je ukázáno použití MMX instrukcí, které provádí logické posuny doleva, což odpovídá násobení mocninou 2. Jak již víme, jedná se o instrukce nazvané PSLLW, PSLLD a PSLLQ. Všechny tři zmíněné instrukce použijeme pro posun prvků ve vektoru, který bude mít fyzicky totožný obsah (a lišit se tedy bude jen tím, jaký formát instrukce pro posuny zpracují):

mmx_val db 0, 1, 2, 0xff, 0x00, 0xff, 0xff, 0x00

Tento demonstrační příklad po svém překladu a spuštění nejprve vypíše obsah původního vektoru a posléze i výsledky všech tří typů logických posunů. Mezerami jsou naznačeny hranice mezi jednotlivými prvky vektorů; posun nikdy nepřesáhne přes hranice prvků. První hodnoty jsou vstupní, druhé pak zobrazují výsledky operace (ruční editace):

psllw:
před posunem: 00FF FF00 FF02 0100
po posunu:    01FE FE00 FE04 0200
 
pslld:
před posunem: 00FFFF00 FF020100
po posunu:    01FFFE00 FE040200
 
psllq:
před posunem: 00FFFF00FF020100
po posunu:    01FFFE01FE040200

Následuje výpis zdrojového kódu tohoto příkladu:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
psllw_message:
         db 0x0a, "psllw:", 0x0a
         psllw_message_length equ $ - psllw_message
 
pslld_message:
         db 0x0a, "pslld:", 0x0a
         pslld_message_length equ $ - pslld_message
 
psllq_message:
         db 0x0a, "psllq:", 0x0a
         psllq_message_length equ $ - psllq_message
 
 
mmx_val db 0, 1, 2, 0xff, 0x00, 0xff, 0xff, 0x00
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
  
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm2, mm1                ; zapamatovat si hodnotu pro další použití
 
        psllw mm1, 1                 ; logicky posun doleva o jeden bit
        print_string psllw_message, psllw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm2                ; obnovit hodnotu registru mm1
        pslld mm1, 1                 ; logicky posun doleva o jeden bit
        print_string pslld_message, pslld_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm2                ; obnovit hodnotu registru mm1
        psllq mm1, 1                 ; logicky posun doleva o jeden bit
        print_string psllq_message, psllq_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

3. Druhý demonstrační příklad: logické posuny doprava

Druhá sada MMX instrukcí nazvaných PSRLW, PSRLD a PSRLQ taktéž provádí logické posuny, tentokrát však doprava, což odpovídá dělení mocninou 2. Do nejvyšších bitů prvků vektorů se v tomto případě dosadí nuly. Tyto instrukce si ukážeme na vektoru, který má nastaveny jen vybrané nejnižší bity jednotlivých bajtů:

mmx_val db 0, 1, 1, 1, 1, 0, 0, 0

Výsledky by měly vypadat následovně:

psrlw:
před posunem: 0000 0001 0101 0100
po posunu:    0000 0000 0080 0080
 
psrld:
před posunem: 00000001 01010100
po posunu:    00000000 00808080
 
psrlq:
před posunem: 0000000101010100
po posunu:    0000000080808080

Opět následuje úplný výpis zdrojového kódu tohoto demonstračního příkladu:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
psrlw_message:
         db 0x0a, "psrlw:", 0x0a
         psrlw_message_length equ $ - psrlw_message
 
psrld_message:
         db 0x0a, "psrld:", 0x0a
         psrld_message_length equ $ - psrld_message
 
psrlq_message:
         db 0x0a, "psrlq:", 0x0a
         psrlq_message_length equ $ - psrlq_message
 
 
mmx_val db 0, 1, 1, 1, 1, 0, 0, 0
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm2, mm1                ; zapamatovat si hodnotu pro další použití
 
        psrlw mm1, 1                 ; logicky posun doprava o jeden bit
        print_string psrlw_message, psrlw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm2                ; obnovit hodnotu registru mm1
        psrld mm1, 1                 ; logicky posun doprava o jeden bit
        print_string psrld_message, psrld_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm2                ; obnovit hodnotu registru mm1
        psrlq mm1, 1                 ; logicky posun doprava o jeden bit
        print_string psrlq_message, psrlq_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

4. Třetí demonstrační příklad: aritmetické posuny doprava

A konečně se podívejme na praktické použití instrukcí PSRAW a PSRAD, které provádí aritmetický posun doprava. To znamená, že původní nejvyšší bit je zachován (jeho hodnota je zkopírována do nového nejvyššího bitu). To opět odpovídá dělení mocninou 2, ovšem pro hodnoty se znaménkem. Tento příklad je kratší, protože v MMX nemáme k dispozici funkci pro posun 64bitové hodnoty (ta byla přidána později).

Výsledky vypsané tímto demonstračním příkladem (po nepatrné ruční editaci):

psraw:
před posunem: FF01 0000 FF01 0000
po posunu:    FF80 0000 FF80 0000
 
psrad:
před posunem: FF010000 FF010000
po posunu:    FF808000 FF808000

Opět se podívejme na jeho úplný zdrojový kód:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
psraw_message:
         db 0x0a, "psraw:", 0x0a
         psraw_message_length equ $ - psraw_message
 
psrad_message:
         db 0x0a, "psrad:", 0x0a
         psrad_message_length equ $ - psrad_message
 
 
mmx_val db 0, 0, 1, 0xff, 0, 0, 1, 0xff
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm2, mm1                ; zapamatovat si hodnotu pro další použití
 
        psraw mm1, 1                 ; aritmeticky posun doprava o jeden bit
        print_string psraw_message, psraw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm2                ; obnovit hodnotu registru mm1
        psrad mm1, 1                 ; aritmeticky posun doprava o jeden bit
        print_string psrad_message, psrad_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

5. Porovnání prvků vektorů

V instrukční sadě MMX nalezneme i šestici instrukcí určených pro porovnání prvků dvou vektorů. Porovnávat lze prvky typu bajt, slovo a dvojslovo, a to na relace „je rovno“ a „je větší než“. Testy na ostatní relace získáme snadno negací či spojením (AND/OR) dvou porovnání. Výsledkem porovnání je nový vektor, který obsahuje v daném místě (například sedmý prvek) buď samé nulové bity (relace naplatí) nebo naopak jedničkové bity (relace platí):

# Instrukce Stručný popis instrukce
1 PCMPEQB porovnání vektorů s prvky typu 8bitové slovo na relaci „je rovno“
2 PCMPEQW porovnání vektorů s prvky typu 16bitové slovo na relaci „je rovno“
3 PCMPEQD porovnání vektorů s prvky typu 32bitové slovo na relaci „je rovno“
     
4 PCMPGTB porovnání vektorů s prvky typu 8bitové slovo na relaci „větší než“
5 PCMPGTW porovnání vektorů s prvky typu 16bitové slovo na relaci „větší než“
6 PCMPGTD porovnání vektorů s prvky typu 32bitové slovo na relaci „větší než“

6. Čtvrtý demonstrační příklad: porovnání prvků na rovnost

V dnešním čtvrtém demonstračním příkladu je realizováno porovnání prvků dvou vektorů na rovnost. Vektory (resp. přesněji řečeno dvojice registrů MMX) je porovnávána postupně po bajtech, 16bitových slovech a 32bitových slovech. Výsledkem jsou hodnoty obsahující jedničkové bity u shodných prvků a nulové bity u prvků, které se od sebe liší. Podívejme se na výsledky porovnání:

pcmpeqb:
první vektor: 03 02 01 00 03 02 01 00
druhý vektor: 09 02 09 00 09 02 01 00
porovnání:    00 FF 00 FF 00 FF FF FF
 
pcmpeqw:
první vektor: 0302 0100 0302 0100
druhý vektor: 0902 0900 0902 0100
porovnání:    0000 0000 0000 FFFF
 
pcmpeqd:
první vektor: 03020100 03020100
druhý vektor: 09020900 09020100
porovnání:    00000000 00000000

Výše uvedené výsledky byly spočteny a vypsány tímto příkladem:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
pcmpeqb_message:
         db 0x0a, "pcmpeqb:", 0x0a
         pcmpeqb_message_length equ $ - pcmpeqb_message
 
pcmpeqw_message:
         db 0x0a, "pcmpeqw:", 0x0a
         pcmpeqw_message_length equ $ - pcmpeqw_message
 
pcmpeqd_message:
         db 0x0a, "pcmpeqd:", 0x0a
         pcmpeqd_message_length equ $ - pcmpeqd_message
 
 
mmx_val_1 db 0, 1, 2, 3, 0, 1, 2, 3
mmx_val_2 db 0, 1, 2, 9, 0, 9, 2, 9
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        movq mm3, mm1                ; zapamatovat si hodnotu pro další použití
        movq mm4, mm2                ; zapamatovat si hodnotu pro další použití
 
        pcmpeqb mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpeqb_message, pcmpeqb_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        pcmpeqw mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpeqw_message, pcmpeqw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        pcmpeqd mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpeqd_message, pcmpeqd_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

7. Pátý demonstrační příklad: porovnání prvků na relaci „větší než“

Prozatím jsme si ukázali způsob porovnání prvků vektorů na relaci „je rovno“. Druhá sada MMX instrukcí dokáže provést porovnání na relaci „větší než“ (a zbylé čtyři možnosti získáme negacemi a operacemi AND/OR, které již známe). Podívejme se tedy na výsledky získané porovnáním dvojice vektorů instrukcemi PCMPGTB, PCMPGTW a PCMPGTD:

pcmpgtb:
první vektor: 03 02 01 00 03 02 01 00
druhý vektor: 00 03 00 01 00 03 02 01
porovnání:    FF 00 FF 00 FF 00 00 00
 
pcmpgtw:
první vektor: 0302 0100 030 20100
druhý vektor: 0003 0001 000 30201
porovnání:    FFFF FFFF FFF F0000
 
pcmpgtd:
první vektor: 03020100 03020100
druhý vektor: 00030001 00030201
porovnání:    FFFFFFFF FFFFFFFF

Tyto výsledky byly získány s využitím následujícího demonstračního příkladu:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
pcmpgtb_message:
         db 0x0a, "pcmpgtb:", 0x0a
         pcmpgtb_message_length equ $ - pcmpgtb_message
 
pcmpgtw_message:
         db 0x0a, "pcmpgtw:", 0x0a
         pcmpgtw_message_length equ $ - pcmpgtw_message
 
pcmpgtd_message:
         db 0x0a, "pcmpgtd:", 0x0a
         pcmpgtd_message_length equ $ - pcmpgtd_message
 
 
mmx_val_1 db 0, 1, 2, 3, 0, 1, 2, 3
mmx_val_2 db 1, 2, 3, 0, 1, 0, 3, 0
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        movq mm3, mm1                ; zapamatovat si hodnotu pro další použití
        movq mm4, mm2                ; zapamatovat si hodnotu pro další použití
 
        pcmpgtb mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpgtb_message, pcmpgtb_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        pcmpgtw mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpgtw_message, pcmpgtw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        pcmpgtd mm1, mm2             ; porovnani prvku vektoru na rovnost
        print_string pcmpgtd_message, pcmpgtd_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

8. Transformace mezi různými typy vektorů

V instrukční sadě MMX nalezneme i devět instrukcí, které slouží pro „zabalení“ či naopak „rozbalení“ prvků vektorů. Ty se používají například tehdy, pokud se zpracovávají multimediální data s rozdílným způsobem proložení hodnot v datovém toku (streamu).

Operace zabalení pracují tak, že na vstupu jsou dva vektory s prvky určité velikosti (16bitů, 32bitů) a tyto prvky jsou zkonvertovány do bajtů, popř. 16bitových slov. Těchto nových prvků je sice dvojnásobné množství (na vstupu jsou dva vektory), ale s poloviční bitovou šířkou, takže se všechny vejdou do cílového vektoru. Při snižování počtu bitů (tedy rozsahu) se používá aritmetika se saturací, a to buď se znaménkovou saturací (hodnoty –128 až 127, pro 16bitový rozsah pak –32768 až 32767) nebo se saturací bez znaménka (hodnoty 0 až 255, pro 16bitový rozsah pak 0 až 65535).

Naopak operace rozbalení mají na vstupu dvojici vektorů s prvky šířky 8 bitů, 16 bitů nebo 32 bitů. Polovina těchto prvků (vyšší či nižší) je spojena s prvky z druhého vektoru na prvky s vyšší bitovou šířkou (16 bitů, 32 bitů či 64 bitů), tedy tak, jakoby jeden z vektorů obsahovat vyšší bity prvků a druhý naopak prvky nižší (alternativně se na tyto operace můžeme dívat jako na proložení dvou vektorů – interleave). Podrobnosti si ukážeme na demonstračních příkladech, z nichž bude funkce těchto instrukcí patrná.

# Instrukce Stručný popis instrukce
1 PACKSSWB „zabalení“ slov do bajtů se saturací (se znaménkem)
2 PACKUSWB „zabalení“ slov do bajtů se saturací (bez znaménka)
3 PACKSSDW „zabalení“ dvojslov do slov se saturací (se znaménkem)
4 PUNPCKLBW „rozbalení“ nižších bajtů do slov
5 PUNPCKHBW „rozbalení“ vyšších bajtů do slov
6 PUNPCKLWD „rozbalení“ nižších slov do dvojslov
7 PUNPCKHWD „rozbalení“ vyšších slov do dvojslov
8 PUNPCKLDQ „rozbalení“ nižších dvojslov do dvojice 64bitových skalárů
9 PUNPCKHDQ „rozbalení“ vyšších dvojslov do dvojice 64bitových skalárů

9. Šestý demonstrační příklad: rozbalení bajtů z vektorů

Podívejme se nejprve na instrukci PUNPCKLBW, která zpracovává vektory bajtů. Z každého vektoru získá spodní čtyři bajty a ty následně proloží do výsledného vektoru:

77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88
 
.. .. .. .. 33 22 11 00
.. .. .. .. BB AA 99 88
 
punpcklbw:
BB 33 AA 22 99 11 88 00

Instrukce PUNPCKHBW pracuje podobným způsobem, ale používá vyšší bajty, nikoli bajty nižší:

77 66 55 44 33 22 11 00
FF EE DD CC BB AA 99 88
 
77 66 55 44 .. .. .. ..
FF EE DD CC .. .. .. ..
 
punpckhbw:
FF 77 EE 66 DD 55 CC 44

Tyto výsledky byly získány následujícím demonstračním příkladem:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
punpcklbw_message:
         db 0x0a, "punpcklbw:", 0x0a
         punpcklbw_message_length equ $ - punpcklbw_message
 
punpckhbw_message:
         db 0x0a, "punpckhbw:", 0x0a
         punpckhbw_message_length equ $ - punpckhbw_message
 
 
 
mmx_val_1 db 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
mmx_val_2 db 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        movq mm3, mm1                ; zapamatovat si hodnotu pro další použití
        movq mm4, mm2                ; zapamatovat si hodnotu pro další použití
 
        punpcklbw mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpcklbw_message, punpcklbw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        punpckhbw mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpckhbw_message, punpckhbw_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

10. Sedmý demonstrační příklad: rozbalení slov z vektorů

Instrukce PUNPCKLWD a PUNPCKHWD pracují podobně, jako výše ukázané instrukce PUNPCKLBW a PUNPCKHBW, ovšem namísto vektorů bajtů pracují s vektory 16bitových slov. Ukažme si nejdříve výsledné efekty obou instrukcí:

3333 2222 1111 0000
7777 6666 5555 4444
 
.... .... 1111 0000
.... .... 5555 4444
 
punpcklwd:
5555 1111 4444 0000

a:

3333 2222 1111 0000
7777 6666 5555 4444
 
3333 2222 .... ....
7777 6666 .... ....
 
punpckhwd:
7777 3333 6666 2222

Tyto výsledky byly získány následujícím demonstračním příkladem:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
punpcklwd_message:
         db 0x0a, "punpcklwd:", 0x0a
         punpcklwd_message_length equ $ - punpcklwd_message
 
punpckhwd_message:
         db 0x0a, "punpckhwd:", 0x0a
         punpckhwd_message_length equ $ - punpckhwd_message
 
 
 
mmx_val_1 dw 0x0000, 0x1111, 0x2222, 0x3333
mmx_val_2 dw 0x4444, 0x5555, 0x6666, 0x7777
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        movq mm3, mm1                ; zapamatovat si hodnotu pro další použití
        movq mm4, mm2                ; zapamatovat si hodnotu pro další použití
 
        punpcklwd mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpcklwd_message, punpcklwd_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        punpckhwd mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpckhwd_message, punpckhwd_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

11. Osmý demonstrační příklad: rozbalení dvojslov z vektorů

A konečně si ukažme použití dvojice instrukcí PUNPCKLDQ a PUNPCKHDQ. Tyto instrukce kombinují prvky typu dvojslovo (32 bitů) z dvojice vektorů a vytvoří jedinou 64bitovou skalární hodnotu. První z těchto instrukcí zpracovává spodní dvojslova vektorů, druhá pak horní dvojslova:

11111111 00000000
33333333 22222222
 
punpckldq:
22222222 00000000
 
punpckhdq:
33333333 11111111

A opět si ukažme, jak vypadá zdrojový kód příkladu, který tyto hodnoty spočetl a vypsal:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
punpckldq_message:
         db 0x0a, "punpckldq:", 0x0a
         punpckldq_message_length equ $ - punpckldq_message
 
punpckhdq_message:
         db 0x0a, "punpckhdq:", 0x0a
         punpckhdq_message_length equ $ - punpckhdq_message
 
 
 
mmx_val_1 dd 0x00000000, 0x11111111
mmx_val_2 dd 0x22222222, 0x33333333
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        movq mm3, mm1                ; zapamatovat si hodnotu pro další použití
        movq mm4, mm2                ; zapamatovat si hodnotu pro další použití
 
        punpckldq mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpckldq_message, punpckldq_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        movq mm1, mm3                ; obnovit hodnotu registru mm1
        movq mm2, mm4                ; obnovit hodnotu registru mm2
        punpckhdq mm1, mm2           ; zkombinovani obsahu dvou vektoru
        print_string punpckhdq_message, punpckhdq_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

12. Devátý demonstrační příklad: zabalení vektorů slov do vektoru bajtů

V dnešním předposledním demonstračním příkladu je ukázána instrukce PACKSSWB, která z dvojice vektorů obsahujících 16bitová slova vytvoří jediný vektor s osmibitovými prvky. Budeme přitom konvertovat prvky, které jsou sice uloženy v šestnácti bitech, ale jejich hodnoty nepřesáhnou 127 a tudíž nebude docházet k saturaci. Oba vstupní vektory i vypočtený výstupní vektor vypadají následovně:

0033 0022 0011 0000
0077 0066 0055 0044
 
packsswb:
77 66 55 44 33 22 11 00

Tento výpočet byl proveden následujícím příkladem:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
packswb_message:
         db 0x0a, "packsswb:", 0x0a
         packswb_message_length equ $ - packswb_message
 
 
 
 
mmx_val_1 dw 0x00, 0x11, 0x22, 0x33
mmx_val_2 dw 0x44, 0x55, 0x66, 0x77
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        packsswb mm1, mm2            ; zkombinovani obsahu dvou vektoru
        print_string packswb_message, packswb_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

13. Desátý demonstrační příklad: řešení přetečení při zabalování vektorů

Zajímavé bude zjistit, jak se totožná instrukce PACKSSWB bude chovat ve chvíli, kdy vstupní vektory obsahují hodnoty větší než 127. V takovém případě by se totiž měla projevit saturace – vyšší či nižší hodnoty nikdy nepřesáhnou rozsah –128 až 127 (127 odpovídá 0×7F). To si snadno ověříme:

0300 0200 0100 0000
0700 0600 0500 0400
 
packsswb:
7F 7F 7F 7F 7F 7F 7F 00

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

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
packswb_message:
         db 0x0a, "packsswb:", 0x0a
         packswb_message_length equ $ - packswb_message
 
 
 
 
mmx_val_1 dw 0x0000, 0x0100, 0x0200, 0x0300
mmx_val_2 dw 0x0400, 0x0500, 0x0600, 0x0700
 
;-----------------------------------------------------------------------------
section .bss
mmx_tmp resb 8
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        emms                         ; inicializace MMX
        mov ebx, mmx_val_1
        movq mm1, [ebx]              ; nacteni prvni hodnoty do registru MM1
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        mov ebx, mmx_val_2
        movq mm2, [ebx]              ; nacteni druhe hodnoty do registru MM2
        print_mmx_reg_as_hex mm2     ; tisk hodnoty registru MM2
 
        packsswb mm1, mm2            ; zkombinovani obsahu dvou vektoru
        print_string packswb_message, packswb_message_length
        print_mmx_reg_as_hex mm1     ; tisk hodnoty registru MM1
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

14. Instrukční sada MMX: shrnutí

V tomto seriálu jsme si popsali a ukázali prakticky všechny instrukce MMX. Tato instrukční sada znamenala v době svého uvedení poměrně zásadní vylepšení celé platformy 80×86, a to zejména v multimediální oblasti (zvuky, grafika, video), popř. v oblasti zpracování signálů (softwarové modemy, o nichž se diskutovalo pod předchozími články). Zavedení MMX navíc nevyžadovalo zásadní zásahy do operačních systémů ani aplikací, protože se vlastně znovupoužily registry matematického koprocesoru. A navíc dokázala jednotka MMX pracovat z velké části nezávisle na hlavním CPU – a to dokonce do takové míry, že MMX instrukce nedokázaly pracovat ani s pracovními registry CPU, ale ani s příznakovým registrem (což některé operace naopak komplikovalo).

S postupným nasazováním platformy 80×86 do oblastí, v nichž se dříve používaly (grafické) pracovní stanice, ovšem znamenalo i potřebu urychlení operací s hodnotami uloženými v systému plovoucí řádové čárky. Zde MMX nebyla vůbec užitečná; spíše naopak, protože koexistence výpočtů s MMX a FPU vyžadovala přepínání a inicializace obou subsystémů. Částečné řešení přinesla teprve instrukční sada 3DNow!, o níž se krátce zmíníme níže. Ovšem zásadně se situace změnila s příchodem technologie SSE (Streaming SIMD Extensions), které se budeme věnovat příště. Právě tato technologie totiž rozšířila šířky vektorových registrů na 128 bitů, doplnila chybějící celočíselné instrukce a zavedla operace pro provádění operací s hodnotami typu single (jednoduchá přesnost). Právě technologií SSE (prozatím bez uvedení rozlišující verze) se budeme zabývat v navazujícím článku.

Poznámka: připomeňme si, že MMX i SSE znamená zavedení SIMD operací, což je forma paralelismu, který se do značné míry odlišuje od souběžného či paralelního provádění výpočtů ve více vláknech. To, která forma paralelismu se použije, záleží na řešeném problému a do značné míry i na možnostech vývojáře (znalosti, dostupný čas na řešení).

15. Seznam všech popsaných instrukcí MMX

Všechny popsané MMX instrukce jsou shrnuty v následující tabulce:

# Instrukce Stručný popis instrukce
1 EMMS inicializace subsystému MMX
2 MOVQ přesun 64bitového vektoru z paměti do registru MMX či naopak
     
3 PADDB součet dvou osmiprvkových vektorů, každý prvek má šířku osmi bitů
4 PADDW součet dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů
5 PADDD součet dvou dvouprvkových vektorů, každý prvek má šířku 32 bitů
6 PADDQ součet dvou 64bitových celých čísel
7 PADDSB součet dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů se znaménkem
8 PADDUSB součet dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů bez znaménka
9 PADDSW součet dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů se znaménkem
10 PADDUSW součet dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů bez znaménka
     
11 PSUBB rozdíl dvou osmiprvkových vektorů, každý prvek má šířku osmi bitů
12 PSUBW rozdíl dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů
13 PSUBD rozdíl dvou dvouprvkových vektorů, každý prvek má šířku 32 bitů
14 PSUBSB rozdíl dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů se znaménkem
15 PSUBUSB rozdíl dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů bez znaménka
16 PSUBSW rozdíl dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů se znaménkem
17 PSUBUSW rozdíl dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů bez znaménka
     
18 PMULLW součin dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů, uloží se spodních 16 bitů výsledků
19 PMULHW součin dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů, uloží se horních 16 bitů výsledků
20 PMADDWD kombinace součinu prvků vektorů se součtem mezivýsledků
     
21 PAND logická operace AND s 64bitovými hodnotami
22 POR logická operace OR s 64bitovými hodnotami
23 PXOR logická operace XOR s 64bitovými hodnotami
24 PANDN logická operace AND NOT s 64bitovými hodnotami
     
25 PSLLW logický posun doleva vektorů s prvky typu 16bitové slovo
26 PSLLD logický posun doleva vektorů s prvky typu 32bitové slovo
27 PSLLQ logický posun doleva 64bitové hodnoty
28 PSRLW logický posun doprava vektorů s prvky typu 16bitové slovo
29 PSRLD logický posun doprava vektorů s prvky typu 32bitové slovo
30 PSRLQ logický posun doprava 64bitové hodnoty
31 PSRAW aritmetický posun doprava vektorů s prvky typu 16bitové slovo
32 PSRAD aritmetický posun doprava vektorů s prvky typu 32bitové slovo
     
33 PCMPEQB porovnání vektorů s prvky typu 8bitové slovo na relaci „je rovno“
34 PCMPEQW porovnání vektorů s prvky typu 16bitové slovo na relaci „je rovno“
35 PCMPEQD porovnání vektorů s prvky typu 32bitové slovo na relaci „je rovno“
36 PCMPGTB porovnání vektorů s prvky typu 8bitové slovo na relaci „větší než“
37 PCMPGTW porovnání vektorů s prvky typu 16bitové slovo na relaci „větší než“
38 PCMPGTD porovnání vektorů s prvky typu 32bitové slovo na relaci „větší než“
     
39 PACKSSWB „zabalení“ slov do bajtů se saturací (se znaménkem)
40 PACKUSWB „zabalení“ slov do bajtů se saturací (bez znaménka)
41 PACKSSDW „zabalení“ dvojslov do slov se saturací (se znaménkem)
42 PUNPCKLBW „rozbalení“ nižších bajtů do slov
43 PUNPCKHBW „rozbalení“ vyšších bajtů do slov
44 PUNPCKLWD „rozbalení“ nižších slov do dvojslov
45 PUNPCKHWD „rozbalení“ vyšších slov do dvojslov
46 PUNPCKLDQ „rozbalení“ nižších dvojslov do dvojice 64bitových skalárů
47 PUNPCKHDQ „rozbalení“ vyšších dvojslov do dvojice 64bitových skalárů

16. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX

Rozšíření instrukční sady procesorů z rodiny x86 o instrukce MMX bylo v době jejího uvedení poměrně razantní – jednalo se v podstatě o největší změnu této architektury od vzniku procesoru 80386, tj. od zavedení virtuálního režimu, 32bitových registrů a plnohodnotných operací s 32 bitovými hodnotami. Z hlediska společnosti Intel se samozřejmě jednalo o nemalou konkurenční výhodu získanou nad firmami AMD, Cyrix či IDT, zejména poté, co se podpora MMX operací zařadila do některých programových produktů (například do zásuvných modulů Photoshopu, ale například i do přehrávačů MP3, ovladačů SW modemů atd.). Ovšem tehdejší druhý největší výrobce čipů x86 – společnost AMD – o necelé dva roky později představila vlastní rozšíření instrukční sady, které bylo označeno poměrně nabubřelým názvem 3DNow! (včetně onoho vykřičníku na konci). Toto rozšíření instrukční sady bylo poprvé implementováno v mikroprocesoru AMD K6–2 a později též v AMD K6–3 a Athlon.

Obrázek 1: Mikroprocesor AMD K6–2 implementující mj. i instrukční sadu 3DNow!

Inženýři z firmy AMD použili a současně i rozšířili instrukční sadu MMX o několik nových celočíselných instrukcí, ovšem hlavní konkurenční výhodou (a to poměrně podstatnou) byly nové instrukce pro práci s čísly reprezentovanými 32bitovými hodnotami s plovoucí řádovou čárkou. Kromě toho bylo do instrukční sady 3DNow! přidáno několik operací sloužících pro přečtení bloku dat do vyrovnávací paměti (cache). U některých typů procesorů (Athlon) bylo navíc možné určit, zda je blok dat načtených do vyrovnávací paměti určený pro čtení nebo i pro zápis (pokud se jednalo o blok určený pro zápis, byl mu nastaven atribut modified).

Obrázek 2: Další pohled na mikroprocesor AMD K6–2 s implementací instrukční sady 3DNow!.

Poznámka: 3DNow! tak můžeme považovat za první krok k rozšířením SSE a AVX.

17. Datové typy instrukcí 3DNow!

Již v předchozí kapitole jsme se zmínili o tom, že instrukční sada 3DNow! byla vlastně v první řadě rozšířením instrukční sady MMX. To mj. znamená, že byly podporovány všechny datové typy MMX, tj. osmiprvkové vektory s osmibitovými hodnotami, čtyřprvkové vektory se 16bitovými hodnotami, dvouprvkové vektory s 32bitovými hodnotami a konečně i 64bitové skalární hodnoty.

Navíc však bylo možné – a do jisté míry přelomové – do 64bitových registrů MMX uložit dvojici 32bitových čísel s plovoucí řádovou čárkou odpovídající formátu single precision definovaném v normě IEEE 754. Zavedení tohoto nového typu dvouprvkového vektoru s sebou přinášelo dvě výhody: mnohé FP operace se mohly provádět paralelně (součet prvků vektorů atd.) a navíc bylo velmi snadné kombinovat původní celočíselné MMX operace s operacemi nad reálnými čísly. To nebylo u původní implementace MMX snadné, protože se muselo provádět přepínání mezi činností matematického koprocesoru a jednotkou MMX.

Obrázek 3: Mikroprocesor Intel Atom sice implementuje instrukční sadu MMX, ale nikoli 3Dnow!, což je ovšem kompenzováno podporou SSE a SSE2.

V případě instrukční sady 3DNow! se toto přepínání provádět nemuselo (pokud tedy nebylo nutné pracovat s hodnotami s dvojitou či rozšířenou přesností, tj. s datovými typy double a extended), navíc měli programátoři k dispozici konverzní instrukce PI2FD a PF2ID pro převod celočíselných 32bitových hodnot na hodnoty s plovoucí řádovou čárkou (se zaokrouhlením) a naopak. Mimochodem: pro přepnutí kontextu mezi FPU operacemi a MMX/3DNow! operacemi bylo možné použít instrukci FEMMS pro rychlé přepnutí kontextu. Tato operace je rychlejší, než původní instrukce EMMS ze sady MMX (tu jsme použili), ovšem po přepnutí je obsah pracovních registrů nedefinovaný (což většinou nevadí).

Obrázek 4: Uložení dvou 32bitových čísel s plovoucí řádovou čárkou v 64bitovém registru.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)

18. Vektorové instrukce definované v rozšíření 3DNow!

Všechny vektorové instrukce provádějící operace s 32bitovými numerickými hodnotami s plovoucí řádovou čárkou, které jsou implementovány v instrukční sadě 3DNow!, jsou vypsány v následující tabulce:

# Instrukce Popis
1 PI2FD převod 32bitových celočíselných hodnot na FP hodnoty
2 PF2ID převod 32bitových FP hodnot na celočíselné hodnoty
3 PFCMPGE porovnání na relaci „větší nebo rovno“
4 PFCMPGT porovnání na relaci „větší než“
5 PFCMPEQ porovnání na relaci „rovnost“
6 PFACC součet obou prvků zdrojového registru i obou prvků cílového registru
7 PFADD součet dvou dvouprvkových vektorů
8 PFSUB rozdíl dvou dvouprvkových vektorů
9 PFSUBR rozdíl dvou dvouprvkových vektorů s prohozením operandů
10 PFMIN výpočet minima (vždy mezi příslušnými prvky vektorů)
11 PFMAX výpočet maxima (vždy mezi příslušnými prvky vektorů)
12 PFMUL součin dvou dvouprvkových vektorů
13 PFRCP výpočet aproximace převrácené hodnoty
14 PFRSQRT výpočet aproximace druhé odmocniny
15 PFRCPIT1 první krok přesného výpočtu převrácené hodnoty
16 PFRSQIT1 první krok přesného výpočtu druhé odmocniny
17 PFRCPIT2 další krok výpočtu převrácené hodnoty či druhé odmocniny

Obrázek 5: Formát 32bitových čísel s plovoucí řádovou čárkou podporovaný instrukcemi 3Dnow!)
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)

Při provádění porovnání prvků dvou vektorů, tj. při provádění instrukcí PFCMPGE, PFCMPGT a PFCMPEQ, je výsledkem této operace nový dvouprvkový vektor obsahující pouze hodnoty 0×0000_0000 a 0×FFFF_FFFF. U porovnávání se navíc nerozlišuje kladná a záporná nula.

Pravděpodobně nejzajímavější je poslední pětice instrukcí PFRCP, PFRSQRT, PFRCPIT1, PFRSQIT1 a PFRCPIT2. Instrukce PFRCP slouží k rychlému výpočtu převrácené hodnoty, ovšem pouze s přesností na 14 bitů. Pokud tato přesnost není dostatečná (pro mnoho účelů však stačí), musí být použita následující sekvence:

PFRCP      ; první přiblížení k výsledku s přesností 14 bitů
PFCPIT1    ; první krok přesného výpočtu převrácené hodnoty
PFRCPIT2   ; druhý krok přesného výpočtu převrácené hodnoty

Důležité je, že první přiblížení se k výsledku je provedeno velmi rychle, konkrétně pouze ve dvou taktech, protože se využívá tabulky výsledků umístěné v paměti ROM. Teprve další dvojice instrukcí využívá pomalejší iterační výpočet. Podobný princip platí i pro rychlý vs. přesný výpočet druhé odmocniny (a opět – mnohdy nám postačuje jen první přiblížení, nikoli přesný výsledek).

zabbix_tip

Obrázek 6: Subrutina pro operaci dělení s 24 bitovou přesností implementovanou pomocí instrukcí 3Dnow!.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)

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
       
128 sound_bell.asm přehrání zvuku pomocí tisku ASCII znaku BELL https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm
129 sound_beep.asm přehrání zvuku o zadané frekvenci na PC Speakeru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm
130 sound_play_pitch.asm přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm
       
131 sound_opl2_basic.asm přehrání komorního A na OPL2 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm
132 sound_opl2_table.asm přehrání komorního A na OPL2, použití tabulky s hodnotami registrů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm
       
133 sound_opl2_table2.asm přepis tabulky s obsahy registrů pro přehrání komorního A https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm
134 sound_key_on.asm přímé ovládání bitu KEY ON mezerníkem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm
135 sound_adsr.asm nastavení obálky pro tón přehrávaný prvním kanálem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm
136 sound_modulation.asm řízení frekvence modulátoru klávesami 1 a 0 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm
       
137 keyboard_basic.asm přímá práce s klávesnicí IBM PC https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm
       
138 sound_stereo_opl2.asm stereo zvuk v konfiguraci DualOPL2 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm
139 sound_opl2_multichannel.asm vícekanálový zvuk na OPL2 (klávesy), delší varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm
140 sound_opl2_multichannel2.asm vícekanálový zvuk na OPL2 (klávesy), kratší varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm
141 sound_opl3_stereo1.asm stereo výstup na OPL3 (v kompatibilním režimu) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm
142 sound_opl3_stereo2.asm stereo výstup na OPL3 (v režimu OPL3) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm
143 sound_opl3_multichannel.asm vícekanálový zvuk na OPL3 (klávesy) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm
       
144 sound_opl3_waveform1.asm interaktivní modifikace tvaru vlny u prvního operátoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm
145 sound_opl3_waveform2.asm oprava chyby: povolení režimu kompatibilního s OPL3 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm
146 sound_opl3_waveform3.asm vliv tvaru vln na zvukový kanál s FM syntézou https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm
147 sound_opl3_waveform4.asm modifikace tvaru vlny nosné vlny i modulátoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm
148 sound_opl3_4operators1.asm výběr AM/FM režimu ve čtyřoperátorovém nastavení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm
149 sound_opl3_4operators2.asm výběr AM/FM režimu ve čtyřoperátorovém nastavení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm
       
150 timer_basic.asm základní obsluha přerušení od časovače/čítače https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm
151 timer_restore.asm obnovení původní obsluhy přerušení při ukončování aplikace https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm
152 timer_restore_better_structure.asm refaktoring předchozího demonstračního příkladu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm
153 timer_faster_clock.asm zrychlení čítače na 100 přerušení za sekundu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm
       
154 instruction_push_imm.asm instrukce PUSH s konstantou https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_imm.asm
155 instruction_imul_imm.asm instrukce IMUL s konstantou https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_imul_imm.asm
156 instruction_into1.asm instrukce INTO s obsluhou přerušení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into1.asm
157 instruction_into2.asm instrukce INTO s obsluhou přerušení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into2.asm
158 instruction_bound1.asm instrukce BOUND s obsluhou přerušení (nekorektní řešení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound1.asm
159 instruction_bound2.asm instrukce BOUND s obsluhou přerušení (korektní řešení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound2.asm
160 vga_320×200_putpixel286.asm instrukce bitového posunu s konstantou větší než 1 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel286.asm
161 instruction_push_pop.asm instrukce PUSH a POP se všemi pracovními registry https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop.asm
       
162 instruction_push_pop_B.asm instrukce s novými segmentovými registry https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop_B.asm
163 instruction_near_jz_jmp.asm blízké skoky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_near_jz_jmp.asm
164 instruction_bsf.asm nová instrukce BSF https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsf.asm
165 instruction_bsr.asm nová instrukce BSR https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsr.asm
166 instruction_add_32bit.asm 32bitový součet https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_add_32bit.asm
167 instruction_inc_32bit.asm 32bitová instrukce INC v šestnáctibitovém režimu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit.asm
168 instruction_inc_32bit_B.asm 32bitová instrukce INC v 32bitovém režimu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit_B.asm
       
169 ems_status.asm zjištění stavu (emulace) paměti EMS https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_status.asm
170 ems_total_mem.asm získání celkové kapacity paměti EMS v blocích https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_total_mem.asm
171 ems_free_mem.asm získání volné kapacity paměti EMS v blocích https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_free_mem.asm
172 xms_free_mem.asm získání volné kapacity paměti XMS v blocích https://github.com/tisnik/8bit-fame/blob/master/pc-dos/xms_free_mem.asm
       
173 vga_320×200_short_address1.asm blokový přenos provedený v rámci prostoru segmentu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address1.asm
174 vga_320×200_short_address2.asm rozepsaný blokový přenos provedený v rámci prostoru segmentu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address2.asm
175 vga_320×200_short_address3.asm přenos nelze provést přes hranici offsetu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address3.asm
176 vga_320×200_short_address4.asm přenos nelze provést přes hranici offsetu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address4.asm
177 vga_320×200_long_address1.asm 32bitový blokový přenos https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address1.asm
178 vga_320×200_long_address2.asm rozepsaný 32bitový blokový přenos provedený v rámci prostoru segmentu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address2.asm
179 vga_320×200_long_address3.asm přístup do obrazové paměti přes segment 0×0000 a 32bitový offset https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address3.asm
180 vga_320×200_long_address4.asm otestování, jak lze přenášet data s využitím 32bitového offsetu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address4.asm
       
181 print_msw.asm přečtení a zobrazení obsahu speciálního registru MSW https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_msw.asm
182 print_cr0.asm přečtení a zobrazení obsahu speciálního registru CR0 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_cr0.asm
183 prot_mode286.asm přechod do chráněného režimu na čipech Intel 80286 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode286.asm
184 prot_mode386.asm přechod do chráněného režimu na čipech Intel 80386 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode386.asm
185 prot_mode_back_to_real_mode286.asm přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80286 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mo­de286.asm
186 prot_mode_back_to_real_mode386.asm přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80386 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mo­de386.asm
187 prot_mode_check.asm test, zda se mikroprocesor již nachází v chráněném režimu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_check.asm
188 unreal_mode.asm nastavení nereálného režimu (platné pro Intel 80386) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/unreal_mode.asm
       
189 float32_constants.asm vytištění základních FP konstant typu single https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float32_constants.asm
190 float64_constants.asm vytištění základních FP konstant typu double https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float64_constants.asm
191 fpu_arithmetic.asm základní aritmetické operace prováděné matematickým koprocesorem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_arithmetic.asm
192 fpu_divide_by_zero.asm dělení nulou matematickým koprocesorem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_zero.asm
193 fpu_divide_by_neg_zero.asm dělení záporné hodnoty nulou matematickým koprocesorem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm
194 fpu_divide_by_neg_zero2.asm dělení hodnoty zápornou nulou matematickým koprocesorem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero2.asm
195 fpu_divide_zero_by_zero.asm výpočet 0/0 matematickým koprocesorem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_zero_by_zero.asm
       
196 io.asm pomocná makra pro komunikaci s DOSem a BIOSem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm
197 print.asm pomocná makra pro tisk FPU hodnot typu single a double v hexadecimálním tvaru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print.asm
       
198 fpu_divide.asm operace podílu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide.asm
199 fpu_divide_r.asm operace podílu s prohozenými operandy https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_r.asm
200 fpu_sqrt.asm výpočet druhé odmocniny https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt.asm
201 fpu_sqrt_neg_value.asm výpočet druhé odmocniny ze záporné hodnoty https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt_neg_value.asm
202 fpu_check.asm detekce typu matematického koprocesoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_check.asm
203 fpu_compare.asm porovnání dvou hodnot s vyhodnocením výsledku https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_compare.asm
204 fpu_status_word.asm tisk obsahu stavového slova koprocesoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word.asm
205 fpu_status_word_stack.asm tisk obsahu stavového slova koprocesoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word_stack.asm
       
206 Makefile https://github.com/tisnik/8bit-fame/blob/master/pc-linux/Makefile
207 hex2string.asm subrutina pro převod 32bitové hexadecimální hodnoty na řetězec https://github.com/tisnik/8bit-fame/blob/master/pc-linux/hex2string.asm
208 linux_macros.asm pomocná makra pro tvorbu aplikací psaných v assembleru pro Linux https://github.com/tisnik/8bit-fame/blob/master/pc-linux/linux_macros.asm
209 mmx_init.asm inicializace subsystému MMX https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_init.asm
210 mmx_paddb1.asm zavolání MMX instrukce pro součet vektorů bajtů (bez přetečení) https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb1.asm
211 mmx_paddb2.asm zavolání MMX instrukce pro součet vektorů bajtů (s přetečením) https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb2.asm
212 mmx_paddusb.asm zavolání MMX instrukce pro součet vektorů bajtů se saturací https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddusb.asm
213 mmx_paddw.asm zavolání MMX instrukce pro součet vektorů šestnáctibitových slov https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddw.asm
214 mmx_paddd.asm zavolání MMX instrukce pro součet vektorů 32bitových slov https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddd.asm
215 mmx_paddq.asm zavolání MMX instrukce pro součet 64bitových slov https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddq.asm
216 mmx_paddx.asm porovnání operací součtu pro vektory s prvky různých typů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx.asm
217 mmx_support.asm zjištění, zda je MMX podporována https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_support.asm
       
218 mmx_paddx_saturation.asm součet osmiprvkových a čtyřprvkových vektorů se saturací https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx_saturation.asm
219 mmx_psubx.asm rozdíl vektorů s různým počtem a šířkou prvků https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_psubx.asm
220 mmx_pmullw1.asm součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta bez přetečení) https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw1.asm
221 mmx_pmullw2.asm součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta s přetečením) https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw2.asm
222 mmx_pmulhw.asm součin vektorů prvek po prvku se získáním horních 16 bitů výsledků (varianta s přetečením) https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmulhw.asm
223 mmx_pmaddwd.asm součin vektorů prvek po prvku, součet mezivýsledků https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmaddwd.asm
224 mmx_logical.asm logické instrukce MMX https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_logical.asm
       
225 mmx_shift_left.asm logické posuny prvků vektorů doleva https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_left.asm
226 mmx_shift_right.asm logické posuny prvků vektorů doprava https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_right.asm
227 mmx_arithmetic_right.asm aritmetické posuny prvků vektorů doprava https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_arithmetic_right.asm
228 mmx_cmpeq.asm porovnání prvků vektorů na rovnost https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpeq.asm
229 mmx_cmpgt.asm porovnání prvků vektorů na relaci „větší než“ https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpgt.asm
230 mmx_unpack_bytes.asm rozbalení bajtů z vektorů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_bytes.asm
231 mmx_unpack_words.asm rozbalení slov z vektorů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_words.asm
232 mmx_unpack_dwords.asm rozbalení dvojslov z vektorů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_dwords.asm
233 mmx_pack_into_bytes1.asm zabalení vektorů slov do vektoru bajtů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes1.asm
234 mmx_pack_into_bytes2.asm řešení přetečení při zabalování vektorů https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes2.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. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  17. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  18. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  19. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  20. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  21. 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/
  22. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  23. RGB Classic Games
    https://www.classicdosgames.com/
  24. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  25. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  26. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  27. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  28. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  29. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  30. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  31. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  32. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  33. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  34. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  35. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  36. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  37. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  38. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  39. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  40. 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/
  41. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  42. flat assembler: Assembly language resources
    https://flatassembler.net/
  43. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  44. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  45. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  46. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  47. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  48. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  49. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  50. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  51. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  52. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  53. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  54. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  55. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  56. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  57. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  58. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  59. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  60. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  61. DOSBox
    https://www.dosbox.com/
  62. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  63. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  64. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  65. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  66. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  67. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  68. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  69. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  70. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  71. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  72. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  73. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  74. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  75. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
  76. 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/
  77. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  78. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  79. 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
  80. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  81. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  82. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  83. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
  84. Introduction to VGA Mode ‚X‘
    https://web.archive.org/web/20160414072210/htt­p://fly.srk.fer.hr/GDM/ar­ticles/vgamodex/vgamx1.html
  85. VGA Mode-X
    https://web.archive.org/web/20070123192523/htt­p://www.gamedev.net/referen­ce/articles/article356.asp
  86. Mode-X: 256-Color VGA Magic
    https://downloads.gamedev­.net/pdf/gpbb/gpbb47.pdf
  87. Instruction Format in 8086 Microprocessor
    https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx
  88. 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
  89. VGA Hardware
    https://wiki.osdev.org/VGA_Hardware
  90. Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
    https://moddingwiki.shika­di.net/wiki/OPL_chip
  91. 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/
  92. Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
    https://www.youtube.com/watch?v=a7I-QmrkAak
  93. Yamaha OPL vs OPL2 vs OPL3 comparison
    https://www.youtube.com/wat­ch?v=5knetge5Gs0
  94. OPL3 Music Crockett's Theme
    https://www.youtube.com/wat­ch?v=HXS008pkgSQ
  95. Bad Apple (Adlib Tracker – OPL3)
    https://www.youtube.com/wat­ch?v=2lEPH6Y3Luo
  96. FM Synthesis Chips, Codecs and DACs
    https://www.dosdays.co.uk/to­pics/fm_synthesizers.php
  97. The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
    https://www.youtube.com/wat­ch?v=6JlFIFz1CFY
  98. [adlib tracker II techno music – opl3] orbit around alpha andromedae I
    https://www.youtube.com/wat­ch?v=YqxJCu_WFuA
  99. [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
    https://www.youtube.com/wat­ch?v=daSV5mN0sJ4
  100. Hyper Duel – Black Rain (YMF262 OPL3 Cover)
    https://www.youtube.com/wat­ch?v=pu_mzRRq8Ho
  101. IBM 5155–5160 Technical Reference
    https://www.minuszerodegre­es.net/manuals/IBM/IBM_5155_5160_Techni­cal_Reference_6280089_MAR86­.pdf
  102. a ymf262/opl3+pc speaker thing i made
    https://www.youtube.com/watch?v=E-Mx0lEmnZ0
  103. [OPL3] Like a Thunder
    https://www.youtube.com/wat­ch?v=MHf06AGr8SU
  104. (PC SPEAKER) bad apple
    https://www.youtube.com/wat­ch?v=LezmKIIHyUg
  105. Powering devices from PC parallel port
    http://www.epanorama.net/cir­cuits/lptpower.html
  106. Magic Mushroom (demo pro PC s DOSem)
    http://www.crossfire-designs.de/download/articles/sou­ndcards//mushroom.rar
  107. Píseň Magic Mushroom – originál
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_con­verted.mp3
  108. Píseň Magic Mushroom – hráno na PC Speakeru
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_spe­aker.mp3
  109. Pulse Width Modulation (PWM) Simulation Example
    http://decibel.ni.com/content/docs/DOC-4599
  110. Resistor/Pulse Width Modulation DAC
    http://www.k9spud.com/trax­mod/pwmdac.php
  111. Class D Amplifier
    http://en.wikipedia.org/wi­ki/Electronic_amplifier#Clas­s_D
  112. Covox Speech Thing / Disney Sound Source (1986)
    http://www.crossfire-designs.de/index.php?lang=en&what=ar­ticles&name=showarticle.htm&ar­ticle=soundcards/&page=5
  113. Covox Digital-Analog Converter (Rusky, obsahuje schémata)
    http://phantom.sannata.ru/kon­kurs/netskater002.shtml
  114. PC-GPE on the Web
    http://bespin.org/~qz/pc-gpe/
  115. Keyboard Synthesizer
    http://www.solarnavigator­.net/music/instruments/ke­yboards.htm
  116. FMS – Fully Modular Synthesizer
    http://fmsynth.sourceforge.net/
  117. Javasynth
    http://javasynth.sourceforge.net/
  118. Software Sound Synthesis & Music Composition Packages
    http://www.linux-sound.org/swss.html
  119. Mx44.1 Download Page (software synthesizer for linux)
    http://hem.passagen.se/ja_linux/
  120. Software synthesizer
    http://en.wikipedia.org/wi­ki/Software_synthesizer
  121. Frequency modulation synthesis
    http://en.wikipedia.org/wi­ki/Frequency_modulation_syn­thesis
  122. Yamaha DX7
    http://en.wikipedia.org/wi­ki/Yamaha_DX7
  123. Wave of the Future
    http://www.wired.com/wired/ar­chive/2.03/waveguides_pr.html
  124. Analog synthesizer
    http://en.wikipedia.org/wi­ki/Analog_synthesizer
  125. Minimoog
    http://en.wikipedia.org/wiki/Minimoog
  126. Moog synthesizer
    http://en.wikipedia.org/wi­ki/Moog_synthesizer
  127. Tutorial for Frequency Modulation Synthesis
    http://www.sfu.ca/~truax/fmtut.html
  128. An Introduction To FM
    http://ccrma.stanford.edu/sof­tware/snd/snd/fm.html
  129. John Chowning
    http://en.wikipedia.org/wi­ki/John_Chowning
  130. I'm Impressed, Adlib Music is AMAZING!
    https://www.youtube.com/wat­ch?v=PJNjQYp1ras
  131. Milinda- Diode Milliampere ( OPL3 )
    https://www.youtube.com/wat­ch?v=oNhazT5HG0E
  132. Dune 2 – Roland MT-32 Soundtrack
    https://www.youtube.com/wat­ch?v=kQADZeB-z8M
  133. Interrupts
    https://wiki.osdev.org/In­terrupts#Types_of_Interrup­ts
  134. Assembly8086SoundBlasterDma­SingleCycleMode
    https://github.com/leonardo-ono/Assembly8086SoundBlas­terDmaSingleCycleMode/blob/mas­ter/sbsc.asm
  135. Interrupts in 8086 microprocessor
    https://www.geeksforgeeks­.org/interrupts-in-8086-microprocessor/
  136. Interrupt Structure of 8086
    https://www.eeeguide.com/interrupt-structure-of-8086/
  137. A20 line
    https://en.wikipedia.org/wi­ki/A20_line
  138. Extended memory
    https://en.wikipedia.org/wi­ki/Extended_memory#eXtended_Me­mory_Specification_(XMS)
  139. Expanded memory
    https://en.wikipedia.org/wi­ki/Expanded_memory
  140. Protected mode
    https://en.wikipedia.org/wi­ki/Protected_mode
  141. Virtual 8086 mode
    https://en.wikipedia.org/wi­ki/Virtual_8086_mode
  142. Unreal mode
    https://en.wikipedia.org/wi­ki/Unreal_mode
  143. DOS memory management
    https://en.wikipedia.org/wi­ki/DOS_memory_management
  144. Upper memory area
    https://en.wikipedia.org/wi­ki/Upper_memory_area
  145. Removing the Mystery from SEGMENT : OFFSET Addressing
    https://thestarman.pcminis­try.com/asm/debug/Segments­.html
  146. Segment descriptor
    https://en.wikipedia.org/wi­ki/Segment_descriptor
  147. When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?
    https://stackoverflow.com/qu­estions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the
  148. A Brief History of Unreal Mode
    https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/
  149. Segment Limits
    https://wiki.osdev.org/Segment_Limits
  150. How do 32 bit addresses in real mode work?
    https://forum.osdev.org/vi­ewtopic.php?t=30642
  151. The LOADALL Instruction by Robert Collins
    https://www.rcollins.org/ar­ticles/loadall/tspec_a3_doc­.html
  152. How do you put a 286 in Protected Mode?
    https://retrocomputing.stac­kexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode
  153. Control register
    https://en.wikipedia.org/wi­ki/Control_register
  154. CPU Registers x86
    https://wiki.osdev.org/CPU_Re­gisters_x86
  155. x86 Assembly/Protected Mode
    https://en.wikibooks.org/wi­ki/X86_Assembly/Protected_Mo­de
  156. MSW: Machine Status Word
    https://web.itu.edu.tr/kes­gin/mul06/intel/intel_msw­.html
  157. 80×87 Floating Point Opcodes
    http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html
  158. Page Translation
    https://pdos.csail.mit.edu/6­.828/2005/readings/i386/s05_02­.htm
  159. 80386 Paging and Segmenation
    https://stackoverflow.com/qu­estions/38229741/80386-paging-and-segmenation
  160. 80386 Memory Management
    https://tldp.org/LDP/khg/Hy­perNews/get/memory/80386mm­.html
  161. DOSEMU
    http://www.dosemu.org/
  162. Intel 80386, a revolutionary CPU
    https://www.xtof.info/intel80386.html
  163. PAI Unit 3 Paging in 80386 Microporcessor
    https://www.slideshare.net/Kan­chanPatil34/pai-unit-3-paging-in-80386-microporcessor
  164. 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
    https://stackoverflow.com/qu­estions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how
  165. Pi in the Pentium: reverse-engineering the constants in its floating-point unit
    http://www.righto.com/2025/01/pentium-floating-point-ROM.html
  166. Simply FPU
    http://www.website.masmfo­rum.com/tutorials/fptute/
  167. Art of Assembly language programming: The 80×87 Floating Point Coprocessors
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–3.html
  168. Art of Assembly language programming: The FPU Instruction Set
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–4.html
  169. INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
    http://www.ragestorm.net/dow­nloads/387intel.txt
  170. x86 Instruction Set Reference: FLD
    http://x86.renejeschke.de/html/fi­le_module_x86_id100.html
  171. x86 Instruction Set Reference: FLD1/FLDL2T/FLDL2E/FLDPI/­FLDLG2/FLDLN2/FLDZ
    http://x86.renejeschke.de/html/fi­le_module_x86_id101.html
  172. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  173. 8087 Numeric Data Processor
    https://www.eeeguide.com/8087-numeric-data-processor/
  174. Data Types and Instruction Set of 8087 co-processor
    https://www.eeeguide.com/data-types-and-instruction-set-of-8087-co-processor/
  175. 8087 instruction set and examples
    https://studylib.net/doc/5625221/8087-instruction-set-and-examples
  176. GCC documentation: Extensions to the C Language Family
    https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions
  177. GCC documentation: Using Vector Instructions through Built-in Functions
    https://gcc.gnu.org/online­docs/gcc/Vector-Extensions.html
  178. SSE (Streaming SIMD Extentions)
    http://www.songho.ca/misc/sse/sse­.html
  179. Timothy A. Chagnon: SSE and SSE2
    http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf
  180. Intel corporation: Extending the Worldr's Most Popular Processor Architecture
    http://download.intel.com/techno­logy/architecture/new-instructions-paper.pdf
  181. SIMD architectures:
    http://arstechnica.com/ol­d/content/2000/03/simd.ar­s/
  182. Tour of the Black Holes of Computing!: Floating Point
    http://www.cs.hmc.edu/~ge­off/classes/hmc.cs105…/sli­des/class02_floats.ppt
  183. 3Dnow! Technology Manual
    AMD Inc., 2000
  184. Intel MMXTM Technology Overview
    Intel corporation, 1996
  185. MultiMedia eXtensions
    http://softpixel.com/~cwrig­ht/programming/simd/mmx.phpi
  186. AMD K5 („K5“ / „5k86“)
    http://www.pcguide.com/ref/cpu/fam/g5K5-c.html
  187. Sixth Generation Processors
    http://www.pcguide.com/ref/cpu/fam/g6­.htm
  188. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  189. Very long instruction word (Wikipedia)
    http://en.wikipedia.org/wi­ki/Very_long_instruction_word
  190. CPU design (Wikipedia)
    http://en.wikipedia.org/wi­ki/CPU_design
  191. Bulldozer (microarchitecture)
    https://en.wikipedia.org/wi­ki/Bulldozer_(microarchitec­ture)
  192. MMX (instruction set)
    https://en.wikipedia.org/wi­ki/MMX_(instruction_set)
  193. Extended MMX
    https://en.wikipedia.org/wi­ki/Extended_MMX
  194. Saturation arithmetic
    https://en.wikipedia.org/wi­ki/Saturation_arithmetic
Neutrální ikona do widgetu na odběr článků ze seriálů

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.