A.D.Danilecki, Poznan, Polska
Politechnika Poznanska, Wydzial Informatyki i Zarzadzania
W tej chwili adanilecki _malpa_ cs.put.poznan.pl
Z wykorzystaniem wielu listow z uwagami od wielu autorow
Krótki wstęp do programowania z wykorzystaniem inline assemblera x86


Dodatek A: Opis niektórych instrukcji assemblera



A.1: Alfabetyczny spis instrukcji
A.2: Tematyczny spis instrukcji
A.3: Opis
Część A-H *
Część I-O *
Część P-Z *
A.4 Znaczniki rejestr (EFLAGS)
A.5 Przyrostki instrukcji

Instrukcje te powinny występować albo w pliku .s ( z kodem źródłowym w assemblerze) albo w środku dyrektywy asm. Jeżeli nie chcemy by gcc optymalizowało wnętrza dyrektywy asm, powinniśmy dodać słowo volatile . Dla zgodności z innymi kompilatorami, możemy zamiast tych słów użyć równoważnych __asm__ __volatile__ . Instrukcje powinny być pisane w cudzysłowiach, oddzielane znakami nowej linii, np

asm ("instrukcja \n Instrukcja");
albo
asm ("instrukcja\n" "Instrukcja\n");
Aby uzyskać przejrzysty kod po zassemblowaniu go przez gcc (gcc -S) powinniśmy stosować dodatkowo tabulacje '\t'. Zapis następujący :
asm (
"instrukcja"
"instrukcja"
);
jest błędny.

Postać instrukcji assemblerowej opisana jest też w punkcie drugim niniejszego dokumentu.
Ogólne zasady opisano również tam.

Dla przypomnienia : używamy '%' przed nazwą rejestrów (%% gdy używamy rozszerzonego asma) np : %ebx,%ecx,%edx, %esi,%edi,%ebp,%esp... Używamy '$' przed stałą. Używamy przyrostków określających typ argumentów, mianowicie 'b' by określić że argument ma długość jednego bajtu (np char), 'w' jeśli ma długość dwóch bajtów, 'l' jeśli ma długość czterech bajtów (np int).

Możemy używać etykiet, do których później możemy skakać instrukcjami loop czy też jmp . Etykietą jest dowolny ciąg znaków zakończony ':' czyli dwukropkiem. Nazwa etykiety musi występować samotnie w linii.

Następujące oznaczenia zostały przyjęte do oznaczania typu argumentów:
  • imm - stała
  • reg - rejestr
  • mem - adres
  • mmxreg - rejestr MMX
  • fpureg - rejestr koprocesora
  • Liczba następująca po takim oznaczeniu, jedna z : 8,16,32,64 i oznacza typ operandu - że ma być traktowany jako liczba odpowiednio 8-bitowa itd. Oznaczenia rejestrów:

  • %mm0-%%mm7 - 8 rejstrów MMX (64-bitowe)
  • %st0-%st7 - 8 rejestrów koprocesora
    rejestry ogólnego przeznaczenia :
  • %cl,%bl,%al,%dl - rejstry 8-bitowe
  • %ch,%bh,%ah,%dh - rejestry 8-bitowe, starsze 8 bitów rejestrów ex, ax itd.
  • %ex,%ax,%dx,%bx - rejstry 16- bitowe
  • %edx,%ecx,%eax,%ebx - rejestry 32 bitowe
    rejestry wskaźnikowe:
  • %esp (stack pointer),%ebp(frame pointer)
    rejestry indeksowe
  • %esi,%edi
    rejestry segmentowe
  • %ss,%cs,%ds,%es,%gs,%fs (stack,code,4*data)
    rejestry kontrolne
  • %cr0, %cr2, %cr3 (?)
    rejestry testowe
  • %tr6-7
    rejstry do debugingu
  • %db0-7

  • %eax- inaczej akumulator, często wykorzystywany w operacjach arytmetycznych.
    %ecx - wykorzystywany często w pętlach
    %ebx - wskaźnik do danych w segmencie %ds.
    %edx - wskaźnik wejścia/wyjścia
    %esi : wskaźnik do danych w segmencie %ds. Źródło w operacjach na łańcuchach
    %edi : wskaźnik do danych w segmencie %es . Przeznaczenie w operacjach na łańcuchach.
    %esp : wskaźnik na stos
    %ebp : wskaźnik na dane na stosie
    Dodatkowo : wskaźnik rozkazów ip, (pokazujący następną instrukcję do wykonania, nie zajmuj się nim, ja nigdy się nim nie zajmowałem) rejestr znaczników w których ważne dla nas są: CF - wskaźnik przeniesienia, PF - wskaźnik parzystości, AF - wskaźnik przeniesienia pomocniczego, ZF - wskaźnik zera (uzywany chyba najczęściej), SF -wskaźnik znaku.

    Dodatkowo są rejestry : Control registers, Test registers, Debug registers.
    Nigdy ich nie używałem i mogę się tylko domyślać do czego służą. Jeśli ktoś wie, zna przykłady wykorzystania proszę o kontakt.

    Jak już wspomniałem, kiepski ze mnie assemblerowiec, więc nie wszystkie opisane w dodatku instrukcje znam i używam. Te które używam, które sprawdziłem z gcc i których działania jestem pewien, zaznaczone są w spisie symbolem (#).

    Opis każdej komendy wygląda następująco :

    NAZWA

    dostępna: 386/486/PPro/MMX/PII
    liczba mikrokodów:
    komenda sprawdzona/ komenda niesprawdzona
    Opis:
    Patrz też:
    kategoria:

    Liczbę mikrokodów zaczerpnąłem z dokumentu 'optimize.pdf' z strony www.intel.com/design/manuals. Chętnie bym się dowiedział czy nie ma tam jakichś pomyłek, i jak się ma ilość mikrokodów do liczby taktów w trakcie których wykonywana jest instrukcja (Tak jak to podane jest w książce np. A.Marciniaka). Mogę tylko podejrzewać, że liczba mikrokodów, podana w instrukcji intelowskiej jest liczbą opcodów na jakie tłumaczona jest instrukcja, ew. liczbę bajtów może i nijak ma się do ilości taktów (cykli zegarowych) czyli czasu wykonania tej instrukcji. Tak czy inaczej informację tę należy traktować z przymrużeniem oka, jako wskazówkę zaledwie która instrukcja jest krótsza, a która dłuższa.
    Jeżeli instrukcja jest nie sprawdzona przeze mnie, to podchodź podejrzliwie do podanej kolejności operandów. Pamiętaj, korzystałem z dokumentacji w których zawsze korzystano z składni intelowskiej, podczas gdy w gcc korzystamy z składni unixowej ( Żeby było śmieszniej, nie jestem na sto procent pewien, że tak jest zawsze.)Czasami chciało mi się to poprawiać, ale znacznie częściej nie :) Sorry :). Jeżeli znasz się dobrze na asmie w notacji unixowej, proszę, skontaktuj się ze mną, żebym mógł poprawić ewentualne błędy
    Niektóre instrukcje nie są w ogóle przyjmowane przez gcc, np. retf. Jako takie nie zostały wymienione w tym spisie.

    A.1: Alfabetyczny spis instrukcji


    do spisu treści
    Oznaczenia
    (#) instrukcja sprawdzona przeze mnie ( na 100% jestem pewien jej działania )
    (+) instrukcja zawarta w spisie tematycznym
    (*) instrukcja opisana
    AAA + *
    AAD + *
    AAM + *
    AAS + *
    ADC + *
    ADD + * #
    AND + * #
    ARPL + *
    BOUND + *
    BSF + * #
    BSR + * #
    BSWAP + * #
    BT + * #
    BTC + * #
    BTR + * #
    BTS + * #
    CALL + *
    CBW + *
    CDQ + *
    CLC + *
    CLD + *
    CLI + * #
    CLTS + *
    CMC + *
    CMOV + *
    CMP + * #
    CMPSB + *
    CMPSL + *
    CMPSW + *
    CMPXCHG + *
    CMPXCHG8B + *
    CPUID + * #
    CWD + *
    CWDE + *
    DAA + *
    DAS + *
    DEC + * #
    DIV + * #
    EMMS + *
    ENTER + *
    FABS + *
    FADD + *
    FADDP + *
    FBLDP + *
    FBSTP + *
    FCHS + *
    FCLEX + *
    FCMOV + *
    FCOM + *
    FCOMI + *
    FCOMIP + *
    FCOMP + *
    FCOMPP + *
    FCOS + *
    FDECSTP + *
    FDISI + *
    FDIV + *
    FDIVP + *
    FDIVR + *
    FDIVRP + *
    FENI + *
    FFREE + *
    FIADD + *
    FICOM + *
    FICOMP + *
    FIDIV + *
    FIDIVR + *
    FILD + *
    FIMUL + *
    FINCSTP + *
    FINIT + *
    FIST + *
    FISTP + *
    FISUB + *
    FLD + *
    FLDCW + * #
    FLDENV + *
    FLDxx + *
    FMUL + *
    FMULP + *
    FNINIT + *
    FNCLEX + *
    FNDISI + *
    FNOP + *
    FPATAN + *
    FPREM + *
    FPREM1 + *
    FPTAN + *
    FRNDINT + *
    FRSTOR + *
    FSAVE + *
    FSCALE + *
    FSETPM + *
    FSIN + *
    FSINCOS + *
    FSQRT + *
    FST + *
    FSTCW + * #
    FSTENV + *
    FSTP + *
    FSTSW + *
    FSUB + *
    FSUBP + *
    FSUBR + *
    FSUBRP + *
    FTST + *
    FUCOM + *
    FUCOMI + *
    FUCOMIP + *
    FXAM + *
    FXCH + *
    FxDISI + *
    FxENI + *
    F2XM1 + *
    FXTRACT + *
    FYL2X + *
    FYL2XP1 + *
    HLT + *
    IBTS + *
    ICEBP + *
    IDIV + *
    IMUL + * #
    IN + *
    INC + * #
    INSB + *
    INSL + *
    INSW + *
    INT + *
    INT01 + *
    INT1 + *
    INT3 + *
    INTO + *
    INVD + *
    INVLPG + *
    IRET + *
    IRETD + *
    IRETW + *
    Jcc + * #
    JCXZ + * #
    JECXZ + * #
    JMP + * #
    LAHF + *
    LAR + *
    LDS + *
    LEA + * #
    LEAVE + *
    LES + *
    LFS + *
    LGDT + *
    LGS + *
    LIDT + *
    LLDT + *
    LMSW + *
    LOADALL *
    LOCK + *
    LODSB + *
    LODSD + *
    LODSW + *
    LOOP + * #
    LOOPE + * #
    LOOPNE + * #
    LOOPNZ + * #
    LOOPZ + * #
    LSL *
    LSS + *
    LTR + *
    MOV + * #
    MOVD + * #
    MOVQ + * #
    MOVSB + *
    MOVSL + *
    MOVSW + *
    MOVSX + *
    MOVZX + *
    MUL + * #
    NEG + * #
    NOP + * #
    NOT + * #
    OR + * #
    OUT + *
    OUTSB + *
    OUTSL + *
    OUTSW + *
    PACKSSDW + *
    PACKSSWB + *
    PACKUSWB + *
    PADDSIW + *
    PADDxx + *
    PAND + *
    PANDN + *
    PAVEB + *
    PCMP + *
    PDISTIB + *
    PMACHRIW + *
    PMADDWD + *
    PMAGW + *
    PMULHRIW + *
    PMULHRW + *
    PMULHW + *
    PMULLW + *
    PMVccZB + *
    POP + * #
    POPAx + *
    POPFx + *
    POR + *
    PSLLx + *
    PSRAx + *
    PSRLx + *
    PSUBSIW + *
    PSUBxx + *
    PUNPCKxx + *
    PUSH + * #
    PUSHAx + *
    PUSHFx + *
    PXOR + *
    RCL + *
    RCR + *
    RDMSR *
    RDPMC *
    RDTSC *
    REP + *
    RET + *
    ROL + *
    ROR + *
    RSM *
    SAHF + *
    SAL + *
    SAR + *
    SBB + *
    SCASB *
    SCASL *
    SCASW *
    SETcc + * #
    SGDT + *
    SHL + *
    SHLD + *
    SHR + *
    SHRD + *
    SIDT + *
    SLDT + *
    SMI *
    SMSW + *
    STC + *
    STD + *
    STI + *
    STOSB + *
    STOSL + *
    STOSW + *
    STR + *
    SUB + * #
    TEST + *
    VERR *
    VERW *
    WAIT + *
    WBINVD + *
    WRSMR *
    XADD + *
    XBTS *
    XCHG + *
    XLATB + *
    XOR + *

    A.2: Tematyczny spis instrukcji


    do spisu treści
    Niektóre instrukcje mogą się znaleźć równocześnie w kilku kategoriach, np instrukcje MMX (kategoria MMX i arytmetyczne).Nie wszystkie instrukcje ujęte w spisie alfabetycznym znajdują się w spisie tematycznym (nie żebym był leniwy)
    Kategorie :

    Instrukcje MMX

    Instrukcje specyficzne dla Pentium/Pentium Pro/Pentium II

    Intrukcje arytmetyczne

    Instrukcje koprocesora - zmiennoprzecinkowe

    Instrukcje operujące na liczbach całkowitych

    Instrukcje łańcuchowe

    Instrukcje logiczne

    Instrukcje skoków, pętli i porównań

    Instrukcje wejścia-wyjścia

    Instrukcje manipulujące danymi

    Instrukcje przerwań

    Inne instrukcje

    Instrukcje MMX

    EMMS
    MOVD
    MOVQ
    PACKSSDW
    PACKSSWB
    PACKUSWB
    PADDSIW - Cyrix
    PADDxx
    PAND
    PANDN
    PAVEB - Cyrix
    PCMP
    PDISTIB - Cyrix
    PMACHRIW - Cyrix
    PMADDWD
    PMAGW - Cyrix
    PMULHRIW - Cyrix
    PMULHRW - Cyrix
    PMULHW
    PMULLW
    PMVccZB - Cyrix
    POR
    PSLLx
    PSRAx
    PSRLx
    PSUBSIW - Cyrix
    PSUBxx
    PUNPCKxx
    PXOR

    Instrukcje manipulujące danymi

    CMOVcc
    IN
    MOV
    MOVD
    MOVQ
    MOVSB
    MOVSL
    MOVSW
    MOVSX
    MOVZX
    PACKSSDW
    PACKSSWB
    PACKUSWB
    POP
    POPAx
    POPFx
    PUNPCKxx
    PUSH
    PUSHAx
    PUSHFx

    Instrukcje wejścia-wyjścia

    IN
    INSB
    INSL
    INSW
    OUT
    OUTSB
    OUTSL
    OUTSW

    Instrukcje arytmetyczne

    AAA
    AAD
    AAM
    AAS
    ADC
    ADD
    DAA
    DAS
    DEC
    DIV
    IDIV
    IMUL
    INC
    MUL
    PADDxx
    PMADDWD
    PMULHW
    PMULLW
    PSUBxx
    SBB
    SUB
    XADD
    XCHG
    XLATB

    Instrukcje koprocesora - zmiennoprzecinkowe

    FABS
    FADD
    FADDP
    FBLDP
    FBSTP
    FCHS
    FCLEX
    FCMOV
    FCOM
    FCOMI
    FCOMIP
    FCOMP
    FCOMPP
    FCOS
    FDECSTP
    FDISI
    FDIV
    FDIVP
    FDIVR
    FDIVRP
    FENI
    FFREE
    FIADD
    FICOM
    FICOMP
    FIDIV
    FIDIVR
    FILD
    FIMUL
    FINCSTP
    FINIT
    FIST
    FISTP
    FISUB
    FLD
    FLDxx
    FLDCW
    FLDENV
    FLDxx
    FMUL
    FMULP
    FNINIT
    FNOP
    FPATAN
    FPREM
    FPREM1
    FPTAN
    FRNDINT
    FRSTOR
    FSAVE
    FSCALE
    FSETPM
    FSIN
    FSINCOS
    FSQRT
    FST
    FSTCW
    FSTENV
    FSTP
    FSTSW
    FSUB
    FSUBP
    FSUBR
    FSUBRP
    FTST
    FUCOM
    FUCOMI
    FUCOMIP
    FXAM
    FXCH
    FxDISI
    FxENI
    F2XM1
    FXTRACT
    FYL2X
    FYL2XP1

    Instrukcje operujące na liczbach całkowitych

    AAA
    AAD
    AAM
    AAS
    ADC
    ADD
    AND
    BSF
    BSR
    BSWAP
    BT
    BTC
    BTR
    BTS
    CBW
    CDQ
    CMP
    CMPXCHG
    CMPXCHG8B
    CWD
    CWDE
    DAA
    DAS
    DEC
    DIV
    FIADD
    FIDIV
    FIDIVR
    FIMUL
    FISUB
    FLD
    FLDxx
    IDIV
    IMUL
    INC
    MUL
    NEG
    NOT
    RCL
    RCR
    ROL
    ROR
    SAL
    SAR
    SHL
    SHLD
    SHR
    SHRD
    SBB
    SETcc
    SUB
    TEST
    XADD
    XCHG
    XLATB
    XOR

    Instrukcje logiczne

    AND
    BSF
    BSR
    BT
    BTC
    BTR
    BTS
    NEG
    NOT
    PAND
    PANDN
    PCMP
    PSLLx
    PSRAx
    PSRLx
    PXOR
    RCL
    RCR
    ROL
    ROR
    SAL
    SAR
    SHL
    SHLD
    SHR
    SHRD
    SETcc
    TEST
    XOR

    Instrukcje specyficzne dla Pentium/ Pentium Pro/Pentium II

    CMOVcc
    CMPXCHG8B
    FCMOV
    FCOMI
    FCOMIP
    FUCOMI
    FUCOMIP
    ICEBP

    Instrukcje skoków, pętli i porównań

    CMOVcc
    CMP
    CMPSB
    CMPSL
    CMPSW
    CMPXCHG
    CMPXCHG8B
    Jcc
    JCXZ
    JECXZ
    JMP
    LOOP
    LOOPE
    LOOPNE
    LOOPNZ
    LOOPZ

    Instrukcje łańcuchowe

    CMPSB
    CMPSL
    CMPSW
    INSB
    INSL
    INSW
    LODSB
    LODSD
    LODSW
    OUTSB
    OUTSD
    OUTSW
    STOSB
    STOSL
    STOSW

    Instrukcje przerwań

    FDISI
    FENI
    CLI
    ICEBP
    INT
    INT01
    INT1
    INT3
    INTO
    IRET
    IRETD
    IRETW
    STI

    Inne instrukcje

    ARPL
    BOUND
    CALL
    CLC
    CLD
    CLI
    CLTS
    CMC
    CPUID
    EMMS
    ENTER
    HLT
    IBTS
    INVD
    INVLPG
    LAHF
    LAR
    LEA
    LEAVE
    LDS
    LES
    LFS
    LGS
    LGDT
    LIDT
    LLDT
    LMSW
    LOCK
    LSS
    LTR
    NOP
    REP
    RET
    SAHF
    SGDT
    SIDT
    SLDT
    SMSW
    STC
    STD
    STI
    STR
    WAIT
    WBINVD




    Początek opisu

    AAA

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: aaa
    Opis: Powinna być używana po użyciu komendy ADD , której wynik był umieszczony w %al. Jej celem jest sprawdzenie, czy nastąpiło przepełnienie przy dodawaniu (np 16+16 = wynik to 32 i nie mieści się w rejestrze %al). Używana jest przy operacjach na liczbach w rozpakowanym formacie BCD (gdzie binarnie kodujemy liczby dziesiętnie, tzn : 1000 1000 zwykle to 128+8=136, ale w kodowaniu BCD byłoby to 88). Gdy dokonujemy operacji na liczbach w spakowanym formacie BCD, powinniśmy używać zamiast tej instrukcji poleceń DAA lub DAS . Nigdy poza UTK (zajęciami z układów techniki cyfrowej) i tym podobnych nie zajmowałem się liczbami w formacie BCD. Podobno łatwo liczby te tłumaczyć do formatu ASCII i z powrotem.
    Jeżeli cztery mniej znaczące bity AL są większe od 9 lub AF jest równe 1, to do %al jest dodawane 6, cztery bardziej znaczące bity AL są zerowane, AH jest zwiększane o 1, a AF i CF przyjmują wartość 1.
    Patrz też: AAD , AAS , AAM DAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    AAD

    Dostępna: od 386
    Liczba Mikrokodów: 3
    komenda niesprawdzona
    Składnia: aad
    aad imm
    Opis: Instrukcja powinna być wykonana przed dwójkowym dzieleniem dwóch operandów wyrażonych w rozpakowanym kodzie BCD (iloraz również jest wtedy wyrażony w tym kodzie). Do %al jest dodawana wartość 10*%ah, a %ah ustawiana jest na zero. Jest to w operacja odwrotna do AAM.
    AAS , AAM DAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    AAM

    Dostępna: od 386
    Liczba Mikrokodów: 4
    komenda niesprawdzona
    Składnia: aam
    amm imm
    Opis : Instrukcję tą powinieneś wykonać po pomnożeniu dwu liczb w formacie rozpakowanym BCD i pozostawieniu rezultatu w %al. Dzieli %al przez dziesięć i pozostawia wynik w %ah, a resztę z dzielenia w %al. Zamiast dzielić przez dziesieć można podzielić przez dowolną stałą. Np. "aam 16\n" spowoduje że dwie czwórki bitów (ang. nibbles) z rejestru %al zostaną rozdzielone między %ah i %al.
    Patrz też: AAD , AAS , AAA DAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    AAS

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: aas
    Opis: Powinna być używana po użyciu komendy SUB , której wynik był umieszczony w %al. Jej celem jest sprawdzenie, czy nie nastąpił niedomiar przy odejmowaniu. Uzywana jest przy operacjach na liczbach w rozpakowanym formacie BCD (gdzie binarnie kodujemy liczby dziesiętnie, tzn : 1000 1000 zwykle to 128+8=136, ale w kodowaniu BCD byłoby to 88). Gdy dokonujemy operacji na liczbach w spakowanym formacie BCD, powinniśmy używać zamiast tej instrukcji poleceń DAA lub DAS . Nigdy poza UTK (zajęciami z układów techniki cyfrowej) i tym podobnych nie zajmowałem się liczbami w formacie BCD. Podobno łatwo liczby te tłumaczyć do formatu ASCII i z powrotem.
    Jeżeli cztery mniej znaczące bity AL są większe od 9 lub AF jest równe 1, to do %al jest dodawane 6, cztery bardziej znaczące bity AL są zerowane, AH jest zmniejszane o 1, a AF i CF przyjmują wartość 1.
    Patrz też: AAD , AAM , AAA DAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    ADC

    Dostępna: od 386
    Liczba Mikrokodów: różnie dla różnej składni, patrz niżej
    komenda niesprawdzona
    składnia :
    adc %al,imm8 : 2
    adc %eax,imm16/32 : 2
    adc m16/32,imm16/32 : 4
    adc m16/32, r16/32 : 4
    adc m8,imm8 : 4
    adc m8,r8 : 4
    adc r16/32,imm16/32 : 2
    adc r16/32,m16/32 : 3
    adc r16/32,rm16/32: 2
    adc r8,m8 : 2
    adc r8,imm8 : 3
    adc r8,rm8 : 2
    adc rm16/32,r16/32 : 3
    adc rm8,r8 : 2
    Opis: Instrukcja ta dodaje dwie liczby całkowite, do wyniku dodaje CF i wynik umieszcza w operandzie "przeznaczenie", czyli w notacji intelowskiej- pierwszym w notacji unixowej - w drugim. Prxy okazji - czy ktoś wie co znaczy "rm"? W opisie mikrokodów wyżej stosuję notację intelowską (najpierw przeznaczenie, potem źródło) bo tak łatwiej mi przepisuje sie z dokumentacji. Flaga CF jest ustawiana jeżeli znowu nastąpi przepełnienie.
    Patrz też: ADD Kategoria : Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    ADD

    Dostępna: od 386
    Liczba Mikrokodów: różnie dla różnej składni, patrz niżej
    komenda niesprawdzona
    składnia :
    add %al,imm8 : 1
    add %eax,imm16/32 : 1
    add m16/32,imm16/32 : 4
    add m16/32, r16/32 : 4
    add m8,imm8 : 4
    add m8,r8 : 4
    add r16/32,imm16/32 : 1
    add r16/32,imm8 : 1
    add r16/32,m16/32: 2
    add r16/32,rm16/32 : 1
    add r8,imm8 : 1
    add r8,m8 : 2
    add r8,rm8 : 1
    add rm16/32,r16/32 : 1
    add rm8,r8 : 1
    Opis: Instrukcja ta dodaje dwie liczby całkowite i wynik umieszcza w operandzie "przeznaczenie", czyli w notacji intelowskiej- pierwszym w notacji unixowej - w drugim. Przy okazji - czy ktoś wie co znaczy "rm"? W opisie mikrokodów wyżej stosuję notację intelowską (najpierw przeznaczenie, potem źródło) bo tak łatwiej mi przepisuje sie z dokumentacji. Flaga CF jest ustawiana jeżeli nastąpi przepełnienie.
    Przykład : movl $2,%eax \n addl $2,%eax wynik : w %eax jest 4 .
    Patrz też: ADC , XADD , FADD , FIADD
    Kategoria : Instrukcje Arytmetyczne
    Instrukcje operujące na licznach całkowitych

    AND

    Dostępna: od 386
    Liczba Mikrokodów: 3
    komenda niesprawdzona
    Składnia:
    and %al,imm8 : 1
    and %eax,imm16/32 : 1
    and m16/32,imm16/32 : 4
    and m16/32, r16/32 : 4
    and m8,imm8 : 4
    and m8,r8 : 4
    and r16/32,imm16/32 : 1
    and r16/32,imm8 : 1
    and r16/32,m16/32: 2
    and r16/32,rm16/32 : 1
    and r8,imm8 : 1
    and r8,m8 : 2
    and r8,rm8 : 1
    and rm16/32,r16/32 : 1
    and rm8,r8 : 1
    Opis: Boolowskie mnożenie obu operandów. Tzn, tak samo jak operator '&' w C : 1 & 1 == 1 a 1&0. 0&0, 0&1 ==0. Identyczną operację, tyle tylko że na liczbach typu long long, przeprowadza PAND . Wynik zostawiany jest w drugim operandzie.

    Przykład : movl $7,%ecx \n movl $3,%edx \n and %ecx,%edx Wynik : w %edx pozostaje 3.
    Patrz też: OR , XOR NOT , NEG POR , PXOR PAND , PANDN
    Kategoria: Instrukcje logiczne
    Instrukcje operujące na licznach całkowitych

    ARPL

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia: arpl m16
    arpl rm16,r16
    Opis: Jeżeli pole uprzewilejowania pierwszego operandu, którym powinien być selector segmentu, jest mniejsze niż pole uprzewilejowania drugiego operandu, to ZF przyjmuje wartość 1, i pole uprzewilejowania pierwszego argumentu przyjmuje wartość odpowiedniego pola drugiego argumentu
    Patrz Też:
    Kategoria : Inne Instrukcje

    BOUND

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    bound r16/32,m16/32
    Opis : Instrukcja ta oczekuje, że drugi argument wskazuje na miejsce w pamięci zawierające dwie wartości tego samego rozmiaru jak pierwszy argument (tzn. dwa słowa gdy pierwszym argumentem jest rejestr 16-bitowy, dwa podwójne słowa gdy pierwszym argumentem jest rejestr 32-bitowy). Jeżeli wartość w pierwszym argumencie jest mniejsza od pierwszej wartości w pamięci, lub większa lub równa niż druga wartość, wysyła wyjątek BR (wyjątek 5, fault - czyli że po wystąpieniu wyjątku i wywołaniu procedury obsługi próbuje się ponownie wykonać instrukcję która wywołała wyjątek - za "Laboratorium systemu operacyjnego Linux ", praca zbiorowa studentów Uniwersystetu Warszawskiego. Tutaj widać że A.Marciniak nie rozumie różnicy między wyjątkiem a przerwaniem) (przekroczenie tablicy) stąd komenda ta nadaje się do testowania tablic.
    Patrz także: Kategoria : Inne Instrukcje

    BSF

    Dostępna: od 386
    Liczba Mikrokodów: 3 lub 2
    komenda sprawdzona
    Składnia:
    bsf im16/32,r16/32
    bsf rm16/32,r16/32
    Opis: Przeszukuje pierwszy operand w poszukiwaniu ustawionego bitu (czyli =1). Jeżeli go znajdzie, w drugim operandzie znajduje się jego index, ZF ustawiany jest na 1. Jeżeli pierwszy operand jest równy zeru, ZF ustawiany jest na 0. Przeszukuje od najmniej znaczącego do najbardziej znaczącego. Indeksy zaczynają się od 0 (najmniej znaczący bit) do 16/32 (najbardziej znaczący bit.
    Przykłady : movl $3,%eax \n bsf %eax,%ecx \n %ecx równe jest 0. movl $6,%eax \n bsf %eax,%ecx \n %ecx równe jest 1.
    Patrz także : BSR BT BTC BTR
    Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    BSR

    Dostępna: od 386
    Liczba Mikrokodów: 3 lub 2
    komenda sprawdzona
    Składnia:
    bsr m16/32,r16/32
    bsr rm16/32,r16/32
    Opis: Przeszukuje pierwszy operand w poszukiwaniu ustawionego bitu (czyli =1). Jeżeli go znajdzie, w drugim operandzie znajduje się jego index, ZF ustawiany jest na 1. Jeżeli pierwszy operand jest równy zeru, ZF ustawiany jest na 0. Przeszukuje od najbardziej znaczącego do najmniej znaczącego. Indeksy zaczynają się od 0 (najmniej znaczący bit) do 16/32 (najbardziej znaczący bit.
    Przykłady : movl $3,%eax \n bsf %eax,%ecx \n %ecx równe jest 1. movl $6,%eax \n bsf %eax,%ecx \n %ecx równe jest 2.
    Patrz także : BSF BT BTC BTR Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    BSWAP

    Dostępna: od 486
    Liczba Mikrokodów: 2
    komenda sprawdzona
    Składnia:
    bswap r32
    Opis: Instrukcja ta zamienia bity 0-7 z bitami 24-31, a bity 8-15 z bitami 16-23, czyli zamienia kolejnością słowa w rejestrze.
    Przykład : movl $1,%eax \n bswap %eax \n %eax równa się 2^24 (bit 0 zamienił się miejscem z bitem 24 ) czyli 16777216
    Patrz też: XCHG
    Kategoria : Instrukcje operujące na liczbach całkowitych

    BT

    Dostępna: od 386
    Liczba Mikrokodów: 2/complex/1/1
    komenda sprawdzona
    Składnia:
    bt imm8,reg16/32
    bt r16/32,m16/32
    bt imm8,rm16/32
    bt r16/32,rm16/32

    Opis: Jeżeli bit drugiego operandu o indeksie podanym pierwszym operandem równa się 1, CF również równa się jeden. W przeciwnym wypadku CF równa się 0.
    Przykład: movl $1,%eax \n bt $0,%eax CF równa się 1.
    Patrz też: BTC , BTR BTS
    Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    BTC

    Dostępna: od 386
    Liczba Mikrokodów: 4/complex/1/1
    komenda sprawdzona
    Składnia:
    btc imm8,reg16/32
    btc r16/32,m16/32
    btc imm8,rm16/32
    btc r16/32,rm16/32

    Opis: Jeżeli bit drugiego operandu o indeksie podanym pierwszym operandem równa się 1, CF również równa się jeden. W przeciwnym wypadku CF równa się 0. Bit o podanym indeksie zostaje uzupełniony (tzn jeśli równa się 0, to po wykonaniu będzie się równał 1, jeśli równa się 1, to będzie się równał 0)
    Przykład: movl $1,%eax \n btc $0,%eax CF równa się 1. %eax równa się 0 movl $5,%eax \n btc $2,%eax CF równa się 1. %eax równa się 1.
    Patrz też: BT , BTR , BTS
    Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    BTR

    Dostępna: od 386
    Liczba Mikrokodów: 4/complex/1/1
    komenda sprawdzona
    Składnia:
    btr imm8,reg16/32
    btr r16/32,m16/32
    btr imm8,rm16/32
    btr r16/32,rm16/32

    Opis: Jeżeli bit drugiego operandu o indeksie podanym pierwszym operandem równa się 1, CF również równa się jeden. W przeciwnym wypadku CF równa się 0. Bit o podanym indeksie zostanie wyzerowany.
    Przykład: movl $1,%eax \n btr $0,%eax CF równa się 1. %eax równa się 0.
    Patrz też: BTC , BT , BTS
    Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    BTS

    Dostępna: od 386
    Liczba Mikrokodów: 4/complex/1/1
    komenda sprawdzona
    Składnia:
    bts imm8,reg16/32
    bts r16/32,m16/32
    bts imm8,rm16/32
    bts r16/32,rm16/32

    Opis: Jeżeli bit drugiego operandu o indeksie podanym pierwszym operandem równa się 1, CF również równa się jeden. W przeciwnym wypadku CF równa się 0. Bit o podanym indeksie zostanie ustawiony (będzie się równał jeden)
    Przykład: movl $1,%eax \n bts $0,%eax CF równa się 1. %eax równa się 1.
    Patrz też: BTC , BTR BT
    Kategoria : Instrukcje logiczne , Instrukcje operujące na liczbach całkowitych

    CALL

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda sprawdzona
    Składnia: call nazwa ew. call adres
    Opis : Wywołuje procedurę o podanej nazwie lub zaczynającej się pod podanym adresem. Powrót z wywołania następuje poprzez intrukcję RET
    Patrz także: RET
    Kategoria : Inne instrukcje

    CBW

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda sprawdzona
    Składnia: cbw
    Opis: Rozszerza liczbę 8-bitową w %al w liczbę 16-bitową w %ax poprzez powielenie bitu znaku - tzn, jeśli najstarszy bit %al był jeden, to %ah wypełniony jest jedynkami, w przeciwnym razie wypełniony jest zerami. Dopuszczalna jest także nazwa cbtw.
    Patrz także: CDQ , CWD , CWDE
    Kategoria : Instrukcje operujące na liczbach całkowitych

    CDQ

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda sprawdzona
    Składnia: cdq
    Opis: Rozszerza liczbę 32-bitową w %eax w liczbę 64-bitową w %eax:%edx poprzez powielenie bitu znaku - tzn, jeśli najstarszy bit %eax był jeden, to %edx wypełniony jest jedynkami, w przeciwnym razie wypełniony jest zerami. Dopuszczalna jest także nazwa cltd (change long to double? cholera wie :)) )
    Patrz także: CBW , CWD , CWDE
    Kategoria : Instrukcje operujące na liczbach całkowitych

    CLC

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: clc
    Opis: Zeruje flagę przeniesienia (CF)
    Patrz też : CLD , CLI , CLTS , STC , STD , STI , CMC
    Kategoria : Inne instrukcje

    CLD

    Dostępna: od 386
    Liczba Mikrokodów: nie wiem
    komenda niesprawdzona
    Składnia: cld
    Opis: Zeruje flagę kierunku (DF)
    Patrz też : CLC , CLI , CLTS , STC , STD , STI , CMC
    Kategoria : Inne instrukcje

    CLI

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda sprawdzona
    Instrukcja uprzywilejowana
    Składnia: cli
    Opis: Zeruje flagę zezwolenia na przerwanie (IF) , uniemożliwiając wystąpienia przerwań (za wyjątkiem NMI). Przywrócić obsługę przerwań można komendą STI . Wszelkie programy które próbowałem uruchomić z tą instrukcją kończyły się zrzuceniem core. Czyżby tą instrukcję można było wykonywać tylko w trybie jądra? Ktoś zna się na tym?
    przykład : cli \n ( od tej pory ignorujemy sygnały przerwań)
    Patrz też : CLC , CLD , CLTS , STC , STD , STI , CMC
    Kategoria : Inne instrukcje

    CLTS

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Instrukcja uprzywilejowana
    Składnia: clts
    Instrukcja CLTS sluzy do skasowania bitu TS w rejestrze CR0 (MSW). Bit TS (Task Switched) jest ustawiany przez procesor podczas przelaczania zadan. W przypadku odwolania sie do koprocesora (instrukcja ESC i wszystkie pochodne czyli wszystkie instrukcje koproca) gdy jest ustawiony ten bit, jest generowany wyjatek #NM (nr 8) ostrzegajacy, ze zostalo zmienione zadanie (zmienil sie kontekst: zawartosc rejestrow, obszar segmentow itd.) a w rejstrach koprocesora znajduja sie jeszcze wartosci starego zadania i nalezy je gdzies zachowac zeby nie zginely podczas powrotu do przerwanego zadania. Powinna to wlasnie wykonac procedura obslugi wyjatku #NM, a pozniej powinna ona skasowac bit TS (co wlasnie sie robi instrukcja CLTS) oznajmujac tym samym ze kontekst koprocesora zostal zachowany. Instrukcja ta jest uprzywilejowana i moze byc tylko wykonywana na zerowym poziomie ochrony (w trybie jadra), a zwykly programista (nie systemowy) raczej nie powinien sie nia interesowac. Patrz też : CLC , CLI , CLD , STC , STD , STI , CMC
    Kategoria : Inne instrukcje

    CMC

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: cmc
    Opis: Uzupełnia do dwóch CF, czyli jeśli wartością CF było zero, to zmienia wartość CF na jeden, jeśli wartością CF było jeden, to przypisuje CF wartość zero.
    Patrz też : CLC , CLI , CLD , STC , STD , STI
    Kategoria : Inne instrukcje

    CMOV

    Dostępna: od Pentium Pro (P6)
    Liczba Mikrokodów: 2 (między rejestrami) 3 (pamięć)
    komenda niesprawdzona
    Składnia:
    cmovcc r16/32,r16/32
    cmovcc r16/32,m16/32
    gdzie cc oznacza jeden z przyrostków: B,NAE,C,E,Z,BE,N,L,NGE,LE,NG,NB,AE,NC,NBE,A,NE,NZ,NL,GE,NLE,G,NO,NP,PO,NS,O,P,PE,S opisanych tutaj
    Opis : przeniesienie warunkowe. Przenieś wartość wtedy gdy... Warunek przeniesienia zależy od użytego przerostka, np CMOVE %eax,%edx znaczy przenieś wartość z %eax do %edx jeśli ZF == 1. Nie mogłem sprawdzić tej komendy gdyż jest ona charakterystyczna dla P6.
    Patrz też : CPUID , FCMOV , PRZYROSTKI
    Kategoria: Instrukcje specyficzne dla Pentium/ Pentium Pro/Pentium II , Instrukcje skoków, pętli i porównań

    CMP

    Dostępna: od 386
    Liczba Mikrokodów: 1 (pierwszy argument rejestr, a drugi rejestr lub stała) 3 (pamięć)
    komenda sprawdzona
    Składnia:
    cmp r8/16/32,r8/16/32
    cmp r8/16/32,m8/16/32 , cmp imm,r8/16/32/m8/16/32 (tam gdzie r może też być rm

    Opis : Dokonuje porównania dwóch liczb. Faktycznie działa w ten sposób, że odejmuje od pierwszego operandu drugi i nie zapamiętuje wyników, ustawiając tylko odpowiednie flagi, mianowicie : OF,ZF,SF,PF,AF,CF. Np. jeżeli oba operandy były sobie równe, ustawiony jest znacznik ZF.
    Przykład : movl $2,%ebx \n cmp $1,%ebx \n jl koniec \n movl $0,%ebx \n koniec: %ebx równe jest 0

    Patrz też : Jcc , FCOM , FICOM , CMPXCHG , CMPSB , FLAGI
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje operujące na liczbach całkowitych

    CMPSB

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    cmpsb
    Opis : Porównuje bajt o adresie DS:SI lub DS:ESI z bajtem o adresie ES:DI lub ES:EDI i w zależności od wyniku ustawia odpowiednie flagi (takie same jak CMP ). Następnie, w zależności od DF (destination flag, wskaźnika kierunku) zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0) SI i DI (lub ESI i EDI). Zdaje mi się, że można spokojnie założyć że używamy ESI i EDI ( jako że Linux jest 32-bitowy)
    Przykład : movl $a,%esi \n movl $b,%edi \n cmpsb
    Patrz też : CMP , CMPSL , CMPSW , FLAGI
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje łańcuchowe

    CMPSL

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    cmpsb
    Opis : Porównuje podwójne słowo o adresie DS:SI lub DS:ESI z bajtem o adresie ES:DI lub ES:EDI i w zależności od wyniku ustawia odpowiednie flagi (takie same jak CMP ). Następnie, w zależności od DF (destination flag, wskaźnika kierunku) zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0) SI i DI (lub ESI i EDI) o 4. Zdaje mi się, że można spokojnie założyć że używamy ESI i EDI ( jako że Linux jest 32-bitowy)
    Patrz też : CMP , CMPSB , CMPSW , FLAGI
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje łańcuchowe

    CMPSW

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    cmpsw
    Opis : Porównuje słowo o adresie DS:SI lub DS:ESI z bajtem o adresie ES:DI lub ES:EDI i w zależności od wyniku ustawia odpowiednie flagi (takie same jak CMP ). Następnie, w zależności od DF (destination flag, wskaźnika kierunku) zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0) SI i DI (lub ESI i EDI) o 2. Zdaje mi się, że można spokojnie założyć że używamy ESI i EDI ( jako że Linux jest 32-bitowy)
    Przykład : movl $a,%esi \n movl $b,%edi \n cmpsb To działa, ale jakim cudem? Skąd gcc wie że a ma być pod %ds:%esi a b pod %es:%edi? Help?
    Patrz też : CMP , CMPSB , CMPSL , FLAGI
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje łańcuchowe

    CMPXCHG

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    cmpxchg r8/16/32,rm/r/m8/16/32
    Opis : Porównuje swój drugi operand z %al, %ah bądź %eax ( w zależności od rozmiaru operandu) i jeżeli jest on równy temu rejestrowi, kopiuje pierwszy operand do drugiego operandu. W przeciwnym wypadku ustawia ZF na zero.
    Patrz też : CMP , CMPSB , CMPXCHG8B , CMPSL
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje operujące na liczbach całkowitych

    CMPXCHG8B

    Dostępna: od pentium
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Składnia:
    cmpxchg8b rm64
    Opis : Porównuje swój operand z %eax:%edx i jeżeli liczba 64-bitowa w miejscu w pamięci określonym przez operand jest równa tej parze rejestrów, kopiuje parę %ecx:%ebx do miejsca w pamięci określonego przez ten operand. Ustawia równocześni ZF na 1. W przeciwnym wypadku ustawia ZF na zero.
    Patrz też : CMP , CMPSB , CMPXCHG , CMPSL
    Kategoria: Instrukcje skoków, pętli i porównań , Instrukcje operujące na liczbach całkowitych

    CPUID

    Dostępna: od pentium
    Liczba Mikrokodów: complex
    komenda sprawdzona
    Składnia:
    cpuid
    Opis : Służy do pobierania informacji na temat procesora. Informacje te różnią się w zależności od tego, jaką zawartość miał rejestr %eax podczas jej wywołania, i tak:
  • gdy %eax wynosi 0, to po wykonaniu %eax zawiera maksymalną liczbę jaką jest w stanie zaakceptować jako parametr wejściowy dla instrukcji cpuid (obecnie będzie to 2), a %ebx:%edx:%ecx zawierają napis określający nazwę komputera, np "GenuineIntel"
  • Jeżeli w %eax na wejściu jest 1, to na wyjściu %eax zawiera informację o wersji procesora, a %edx rozmaite informacje, np. jeśli komputer może używać instrukcji MMX, to ustawiony jest 23 bit rejstru %edx, jeżeli może używać warunkowych instrukcji cmovcc i fcmovcc, to ustawiony jest bit 15, i wreszcie bit 8 ustawiony jest gdy może używać instrukcji cmpxchg8b.
  • gdy %eax zawiera 2, to %eax,%ebx,%ecx i %edx zawierają informacjem na temat cache'u i TLB.

  • Przykład : patrz przykład w rozdziale Wykorzystanie instrukcji charakterystycznych dla MMX i Pentium
    Patrz też :
    Kategoria: Inne instrukcje

    CWD

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda sprawdzona
    Składnia: cwd
    Opis: Rozszerza liczbę 16-bitową w %ax w liczbę 32-bitową w %ax:%dx poprzez powielenie bitu znaku - tzn, jeśli najstarszy bit %ax był jeden, to %dx wypełniony jest jedynkami, w przeciwnym razie wypełniony jest zerami. Gcc dopuszcza także syntax AT&T czyli nazwę cwtd (change word to double jak sądzę)
    Patrz także: CDQ , CBW , CWDE
    Kategoria : Instrukcje operujące na liczbach całkowitych

    CWDE

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda sprawdzona
    Składnia: cwde
    Opis: Rozszerza liczbę 16-bitową w %ax w liczbę 32-bitową w %eax poprzez powielenie bitu znaku - tzn, jeśli najstarszy bit %ax był jeden, to górne 16 bitów %eax wypełnione jest jedynkami, w przeciwnym razie wypełnione jest zerami. Gcc dopuszcza także syntax AT&T, tak przynajmniej piszą w dokumentacji, czyli cwtl (jak sądzę skrót od change word to long).
    Patrz także: CDQ , CWD , CBW
    Kategoria : Instrukcje operujące na liczbach całkowitych

    DAA

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: daa
    Opis: Powinna być używana po użyciu komendy ADD , której wynik był umieszczony w %al. Jej celem jest sprawdzenie, czy nastąpiło przepełnienie przy dodawaniu (np 16+16 = wynik to 32 i nie mieści się w rejestrze %al). Używana jest przy operacjach na liczbach w spakowanym formacie BCD (gdzie binarnie kodujemy liczby dziesiętnie, tzn : 1000 1000 zwykle to 128+8=136, ale w kodowaniu BCD byłoby to 88). Gdy dokonujemy operacji na liczbach w rozpakowanym formacie BCD, powinniśmy używać zamiast tej instrukcji poleceń AAA lub AAS . Liczby w spakowanym formacie BCD kodowane są cyfra na 4 bity, w rozpakowanym cyfra na 8 bitów. Nigdy poza UTK (zajęciami z układów techniki cyfrowej) i tym podobnych nie zajmowałem się liczbami w formacie BCD. Podobno łatwo liczby te tłumaczyć do formatu ASCII i z powrotem.
    Jeżeli cztery mniej znaczące bity AL są większe od 9 lub AF jest równe 1, to do %al jest dodawane 6, cztery bardziej znaczące bity AL są zerowane, AH jest zwiększane o 1, a AF i CF przyjmują wartość 1.
    Patrz też: AAD , AAS , AAM AAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na liczbach całkowitych

    DAS

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia: das
    Opis: Powinna być używana po użyciu komendy SUB , której wynik był umieszczony w %al. Jej celem jest sprawdzenie, czy nie nastąpił niedomiar przy odejmowaniu. Używana jest przy operacjach na liczbach w spakowanym formacie BCD (gdzie binarnie kodujemy liczby dziesiętnie, tzn : 1000 1000 zwykle to 128+8=136, ale w kodowaniu BCD byłoby to 88). Gdy dokonujemy operacji na liczbach w rozpakowanym formacie BCD, powinniśmy używać zamiast tej instrukcji poleceń AAA lub AAS . Nigdy poza UTK (zajęciami z układów techniki cyfrowej) i tym podobnych nie zajmowałem się liczbami w formacie BCD. Podobno łatwo liczby te tłumaczyć do formatu ASCII i z powrotem.
    Liczby w sformatowanym formacie BCD posiadają 4 bity na cyfrę, podczas gdy w rozpakowanym 8 bitów na cyfrę. Jeżeli cztery mniej znaczące bity AL są większe od 9 lub AF jest równe 1, to do %al jest dodawane 6, cztery bardziej znaczące bity AL są zerowane, AH jest zmniejszane o 1, a AF i CF przyjmują wartość 1.
    Patrz też: AAD , AAM , AAA DAA , DAS
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na liczbach całkowitych

    DEC

    Dostępna: od 386
    Liczba Mikrokodów: 4 ( gdy argument jest m8/16/32) 1 gdy argumentem jest r /rm 8/16/32)
    komenda niesprawdzona
    Składnia:
    dec m8/16/32 : 4
    dec r8/16/32 : 1
    dec rm 8/16/32

    Opis: Zmniejsza argument o jeden, czyli równoważny jest operatorowi -- w C. Nie wywiera efektu na flagę CF. Żeby wywrzeć taki efekt, użyj polecenia sub 1,coś .
    Przykład : movl $4,%eax \n decl %eax %eax równe jest 3
    Patrz też : INC
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na liczbach całkowitych

    DIV

    Dostępna: od 386
    Liczba Mikrokodów: 4 ( gdy 1 argument jest 16/32) 3 (gdy oba argumenty są 8 bitowe)
    komenda niesprawdzona
    Składnia:
    div r/m8 : 3
    div r/m16 : 4
    div r/m32 : 4

    Opis: Instrukcja dokonuje dzielenia całkowitego bez znaku, czyli 1/2 równa się 0 , reszta 1 . Jeżeli argument jest 8- bitowy, instrukcja ta dzieli %ax przez dany operand. Wynik dzielenia zostawia w %al, a reszta z dzielenia w %ah. Jeżeli argument jest 16 bitowy, to instrukcja dzieli %dx:%ax przez argument, wynik zostawiając w %ax, a resztę w %dx. Jeśli argument jest 32 bitowy, instrukcja dzieli %edx:%eax przez argument, wynik zostawiając w %eax, a resztę w %edx.
    Patrz też : IDIV (dzielenie ze znakiem) MUL , IMUL , FDIV
    Przykład : movw $4,%ax \n movw $2,%bx \n div %bl wynik : 2 w %al, 0 w %ah
    Kategoria: Instrukcje Arytmetyczne
    Instrukcje operujące na liczbach całkowitych

    EMMS

    Dostępna: od MMX
    Liczba Mikrokodów: -
    komenda niesprawdzona
    Składnia:
    emms

    Opis: Instrukcja ta ustawia słowo zawartości stosu (ang. FPU tag word) oznaczające które rejestry są wolne na same jedynki, co oznacza że wszystkie rejestry są wolne. Instrukcja ta powinna być użyta zaraz po wykonaniu instrukcji MMX i przed wykonaniem instrukcji zmiennoprzecinkowych.
    Patrz też :
    Kategoria: Instrukcje MMX
    Inne instrukcje

    ENTER

    Dostępna: ?
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    enter nat16/nat8

    Opis : Robi ramke na stosie, tj. zapisuje na stos ciag bajtow, zawierajacy wskazniki na ram na nizszym poziomie i rezerwuje miejsce na ilosc bajtow potrzebna na zmienne lokalne podana w argumencie pierwszym. Instrukcja jest uzywana przez jezyki wysokiego poziomu podczas wywolan funkcji (wowczas poziom ramy okresla ilosc zaglebien w wywolywaniu funkcji). W drugim argumencie jest ten numer kolejnego zaglebienia (i jednoczesnie ilosc poczatkowych wskaznikow do ram na wyzszych poziomach). Ta instrukcja jest dziwna, dlugo trwa i rzadko jej sie uzywa (kompilatory wola same organizowac sobie stos niz zeby robil to za nich procesor) Patrz też : LEAVE
    Kategoria: Inne instrukcje

    FABS

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia:
    fabs

    Opis: Oblicza wartość bezwględną liczby w rejestrze %st0 i umieszcza ją w %st0.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FADD

    Dostępna: od 386
    Liczba Mikrokodów: 1/2
    komenda niesprawdzona
    Składnia:
    fadd m32real : 2
    fadd m64real : 2
    fadd st0,st(i) : 1
    fadd st(i),st0 : 1

    Opis: Dodaje do siebie operandy i wynik zostawia w drugim (jeśli były dwa operandy). Lub też dodaje operand do ST0 i wynik zostawia w ST0.
    Patrz też : ADD , FADDP , FIADD , FSUB
    Kategoria: Instrukcje koprocesora

    FADDP

    Dostępna: od 386
    Liczba Mikrokodów: 1/2
    komenda niesprawdzona
    Składnia:
    faddp st0,st(i) : 1
    faddp st(i),st0 : 1

    Opis: Dodaje do siebie operandy i wynik zostawia w drugim (jeśli były dwa operandy). Następnie zdejmuje wartość z stosu koprocesora. Nie wiem po co, nie wiem gdzie.
    Patrz też : ADD , FADD
    Kategoria: Instrukcje koprocesora

    FBLD

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fbld m80

    Opis: Powoduje załadowanie liczby w upakowanym formacie BCD z podanego adresu na stos koprocesora przekształcając ją na liczbę rzeczywistą. ładuje 10 bajtów. (Czyli liczba zajmuje 80 bitów)
    Patrz też : FBSTP Kategoria: Instrukcje koprocesora

    FBSTP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fbstp m80

    Opis : Powoduje przekształcenie liczby znajdującej sie na wierzchołku ST0 na format upakowanej liczby dziesiętnej BCD, przesłanie wyniku do adresu podanego operandem oraz uaktualnienie wskaźnika stosu (obniża wskaźnik).
    Patrz też : FBLD Kategoria: Instrukcje koprocesora

    FCHS

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fchs

    Opis : Zmienia znak liczby przechowywanej na wierzchołki stosu zmiennoprzecinkowego.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FCLEX

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fclex

    Opis : Znaczniki PE,UE,OE,ZE,DE,IE,IR, i B w slowie stanu koprocesora przyjmują wartość zero.
    Patrz też : FNCLEX
    Kategoria: Instrukcje koprocesora

    FCMOVcc

    Dostępna: od P6
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcmovcc reg
    gdzie cc oznacza : B, BE, NBE, E, U, NU, NE, NB. U i NU oznacza : dwie ostatnie liczby były nieporównywalne (NU) tzn były rózne ale nie dało się stwierdzić która z nich była większa, lub porównywalne (U). Znacznie pozostałych przyrostków jest identyczne jak opisano w Dodatku na temat przyrostków .
    Opis : Instrukcja powoduje przeniesienie zawartości rejestru na szczyt stosu jeśli jest spełniony jej warunek.
    Patrz też : CMOV
    Kategoria: Instrukcje koprocesora
    Instrukcje specyficzne dla Pentium/Pentium Pro/Pentium II

    FCOM

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcom mem32/64
    fcom fpureg
    fcom fpureg,ST0

    Opis : Porównuje dwie liczby rzeczywiste : na wierzcholku st0 z podanym operandem, a jesli nie jest on podany, z st1. Bity C0 i C3 w slowie statusu koprocesora
    przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności)


    Patrz też : FCOMP , FCOMPP , FCOMI , FCOMIP , FICOM , FUCOM, CMP
    Kategoria: Instrukcje koprocesora

    FCOMI

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcomi fpureg
    fcomi fpureg,ST0

    Opis : Porównuje dwie liczby rzeczywiste : na wierzcholku st0 z podanym operandem, a jesli nie jest on podany, z st1. Efekt jest zapisywany do rejestru EFLAGS procesora i bezpośrednio po nim można więc wykonać instrukcje skoku warunkowego i podobne.
    Patrz też : FCOMP , FCOMPP FCOM , FCOMIP , Kategoria: Instrukcje koprocesora
    Instrukcje specyficzne dla Pentium/Pentium Pro/Pentium II

    FCOMIP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcomip fpureg
    fcomip fpureg,ST0

    Opis : Porównuje dwie liczby rzeczywiste : na wierzcholku st0 z podanym operandem, a jesli nie jest on podany, z st1. Efekt jest zapisywany do rejestru EFLAGS procesora i bezpośrednio po nim można więc wykonać instrukcje skoku warunkowego i podobne. Po zakończeniu obniża wierzchołek stosu zmiennoprzecinkowego.
    Patrz też : FCOMP , FCOMPP , FCOMI , FCOM
    Kategoria: Instrukcje koprocesora
    Instrukcje specyficzne dla Pentium/Pentium Pro/Pentium II

    FCOMP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcomp mem32/64
    fcomp fpureg
    fcomp fpureg,ST0

    Opis : Porównuje dwie liczby rzeczywiste : na wierzcholku st0 z podanym operandem, a jesli nie jest on podany, z st1. Bity C0 i C3 w slowie statusU koprocesora przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności).
    Po zakończeniu obniża wierzchołek stosu zmiennoprzecinkowego.
    Patrz też : FCOM , FCOMPP , FCOMI , FCOMIP
    Kategoria: Instrukcje koprocesora

    FCOMPP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcompp

    Opis : Porównuje dwie liczby rzeczywiste : na wierzcholku st0 z podanym operandem, a jesli nie jest on podany, z st1. Bity C0 i C3 w slowie kontrolnym koprocesora przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności)
    Po zakończeniu obniża wierzchołek stosu zmiennoprzecinkowego dwa razy .
    Patrz też : FCOMP , FCOMPP , FCOMI , FCOMIP
    Kategoria: Instrukcje koprocesora

    FCOS

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fcos

    Opis : Oblicza cosinus kata, ktorego wartosc w radianach jest przechowywana w st0 i wynik rowniez przechowuje w st0.
    Patrz też : FSIN , FSINCOS
    Kategoria: Instrukcje koprocesora

    FDECSTP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdecstp

    Opis : Powoduje "rotację" stosu. tzn. st7 przesuwa się na st0, st0 na st1 itd. Obniża wartość stosu.
    Patrz też : FINCSTP
    Kategoria: Instrukcje koprocesora

    FDISI

    Dostępna: od 386 do 486
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdisi

    Opis : Powoduje że znacznik IM w słowie kontrolnym koprocesora przyjmuje wartość jeden. (WYłączenie zezwolenia na przerwania). Jak się wydaje, traktowana jest przez nowsze procesory jako równoważnik instrukcji fnop.
    Patrz też : FENI , CLI FNDISI
    Kategoria: Instrukcje przerwań
    Instrukcje koprocesora

    FDIV

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdiv mem32/64
    fdiv fpureg
    fdiv st0,fpureg

    Opis : Dzieli stos przez operand i wynik składuje na stosie (zmiennoprzecinkowym), za wyjątkiem fdiv st0,fpureg, gdzie operand dzieli przez stos i wynik zostawia w operandzie.
    Patrz też : DIV , FDIVRP , FDIVR , FDIVP , FIDIV

    Kategoria: Instrukcje koprocesora

    FDIVP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdivp mem32/64
    fdivp fpureg
    fdivp st0,fpureg

    Opis : Dzieli stos przez operand i wynik składuje na stosie (zmiennoprzecinkowym), za wyjątkiem fdiv st0,fpureg, gdzie operand dzieli przez stos i wynik zostawia w operandzie. Po zakonczeniu operacji obniza stos zmiennoprzecinkowy.
    Patrz też : DIV , FDIVRP , FDIVR , FDIV , FIDIVP
    Kategoria: Instrukcje koprocesora

    FDIVR

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdivr mem32/64
    fdivr fpureg
    fdivr st0,fpureg

    Opis : Dzieli operand przez stos i wynik składuje na stosie (zmiennoprzecinkowym), za wyjątkiem fdiv st0,fpureg, gdzie stos dzieli przez operand i wynik zostawia w operandzie.
    Patrz też : DIV , FDIVRP , FDIVP , FDIV , FIDIVR

    Kategoria: Instrukcje koprocesora

    FDIVRP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fdivrp mem32/64
    fdivrp fpureg
    fdivrp st0,fpureg

    Opis : Dzieli operand przez stos i wynik składuje na stosie (zmiennoprzecinkowym), za wyjątkiem fdiv st0,fpureg, gdzie stos dzieli przez operand i wynik zostawia w operandzie. Po zakonczeniu zmniejsza stos zmiennoprzecinkowy.
    Patrz też : DIV , FDIVP , FDIVR , FDIV

    Kategoria: Instrukcje koprocesora

    FENI ,FNENI

    Dostępna: od 386 do 486
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    feni

    Opis : Powoduje że znacznik IM w słowie kontrolnym koprocesora przyjmuje wartość zero. (Włączenie zezwolenia na przerwania). FNENI robi to samo bez czekania aż koprocesor skończy bieżącą operację.
    Patrz też : FDISI , CLI
    Kategoria: Instrukcje przerwań
    Instrukcje koprocesora

    FFREE

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    ffree stn, gdzie n 0-7

    Opis : Powoduje zmianę zawartości słowa TAGn na 11, co oznacza że rejestr STn jest bez zawartości (pusty) bez faktycznego usunięcia zawartości tego rejestru.
    Patrz też : FSAVE

    Kategoria: Instrukcje koprocesora

    FIADD

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fiadd mem16
    fiadd mem32

    Opis : Dodaje operand do wierzchołku stosu i zapamiętuje wynik na wierzchołku stosu. Operand traktowany jest jako liczba całkowita.
    Patrz też : ADD , FADD , FISUB

    Kategoria: Instrukcje przerwań
    Instrukcje koprocesora

    FICOM

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    ficom mem16/32

    Opis : Porównuje wierzcholek stosu z podanym operandem traktowanym jako liczba całkowitai. Bity C0 i C3 w slowie kontrolnym koprocesora przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności)

    Patrz też : FCOMP , FCOMPP , FCOMI , FCOMIP , FICOMP , CMP
    Kategoria: Instrukcje koprocesora

    FICOMP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    ficomp mem16/32

    Opis : Porównuje wierzcholek stosu z podanym operandem traktowanym jako liczba całkowitai. Bity C0 i C3 w slowie kontrolnym koprocesora
    przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności)

    Po zakończeniu operacji obniża wierzchołek stosu.
    Patrz też : FCOMP , FCOMPP , FCOMI , FCOMIP , FICOM
    Kategoria: Instrukcje koprocesora

    FIDIV

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fidiv mem32/16

    Opis : Dzieli stos przez operand i wynik składuje na stosie (zmiennoprzecinkowym), Operand traktorując jako liczbę całkowitą
    Patrz też : DIV , FDIVRP , FDIVR , FDIVP , FDIV , FIDIVR

    Kategoria: Instrukcje operujące na liczbach całkowitych
    Instrukcje koprocesora

    FIDIVR

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fidivr mem32/16

    Opis : Dzieli operand przez stos zmiennoprzecinkowy i wynik składuje na stosie (zmiennoprzecinkowym).
    Patrz też : DIV , FDIVRP , FDIVR , FDIVP , FDIV , FIDIV

    Kategoria: Instrukcje operujące na liczbach całkowitych
    Instrukcje koprocesora

    FILD

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fild mem16/32/64

    Opis : Ładuje liczbę całkowitą z wskazanego miejsca pamięci , przekształca ją na rzeczywistą i wstawia na wierzchołek stosu zmiennoprzecinkowego.
    Patrz też : FIST

    Kategoria: Instrukcje koprocesora

    FIMUL

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fimul mem16/32

    Opis : Mnoży wierzchołek stosu zmiennoprzecinkowego przez podany operand traktowany jako liczba całkowita i wynik zachowuje na wierzchołku stosu. (w rejestrze st0).
    Patrz też : IMUL , FMUL

    Kategoria: Intrukcje operujące na liczbach całkowitych ,
    Instrukcje koprocesora

    FINCSTP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fincstp

    Opis : Wskaźnik stosu zmiennoprzecinkowego zwiększa się o jeden.
    Patrz też : FDECSTP

    Kategoria: Instrukcje koprocesora

    FINIT

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    finit

    Opis : Powoduje zainicjowanie pracy koprocesora. Zaznacza wszystkie rejestry koprocesora jako puste, mimo że nie zmienia ich zawartości (ustawia stan na 3 - 11 binarnie), słowo kontrolne koprocesora przyjmuje wartość 037F, słowo stanu przyjmuje wartość zero. Wyslanie tej instrukcji powoduje wykonanie kolejno dwóch FWAIT i FNINIT . Powoduje to efektywnie wykonanie i odczekanie na zakonczenie przerwan dotyczacych FPU (FWAIT) a nastepnie inicjalizacja kolejki rozkazow i danych, tak zeby byly gotowe do pracy (FNINIT)
    Patrz też : FNINIT FWAIT

    Kategoria: Instrukcje koprocesora

    FIST

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fist mem16/32/64

    Opis : Łachowuje liczbę całkowitą z szczytu wierzchołka stosu do podanego miejsca w pamięci. Liczba rzeczywista z szytu stosu zmiennoprzecinkowego zaokrąglana jest zgodnie z zawartością pola RC w słowie kontrolnym koprocesora. Liczba rzeczywista pozostaje na stosie i wskaźnik stosu nie ulega zmianie.
    Patrz też : FILD , FISTP

    Kategoria: Instrukcje koprocesora

    FISTP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fist mem16/32/64

    Opis : Łachowuje liczbę całkowitą z szczytu wierzchołka stosu do podanego miejsca w pamięci. Liczba rzeczywista z szytu stosu zmiennoprzecinkowego zaokrąglana jest zgodnie z zawartością pola RC w słowie kontrolnym koprocesora. Następnie obniża wskażnik stosu (czyli postępuje tak jakby wartość została z stosu zdjęta).
    Patrz też : FILD , FIST

    Kategoria: Instrukcje koprocesora

    FISUB, FISUBR

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fisub mem16/32

    Opis : Instrukcja powoduje odjęcie podanego operandu od zawartości weirzchołka stosu zmiennoprzecinkowego. Wynik umieszczany jest na wierzchołku stosu. Instrukcja FISUBR jest identyczna, z tym że odejmuje zawartość stosu %st0 od podanego operandu i wynik zostawia w %st0.
    Patrz też : SUB , FADD

    Kategoria: Intrukcje operujące na liczbach całkowitych ,
    Instrukcje koprocesora

    FLD

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fld mem32/64/80
    fld fpureg

    Opis : Powoduje załadowanie liczby rzeczywistej z adresu podanego argumentem do wierzchołka stosu zmiennoprzecinkowego. Wskaźnik stosu jest najpierw zwiększany o jeden, tak więc nie ma się co martwić o nadpisanie poprzedniej wartości.
    Patrz też : FLDxx , FST , FSTP , FLDCW

    Kategoria: Instrukcje koprocesora

    FLDCW

    Dostępna: od 386
    Liczba Mikrokodów: 3
    komenda sprawdzona
    Składnia:
    fldcw m16: 3

    Opis: Powoduje załadowanie liczby z podanego adresu do słowa kontrolnego koprocesora.
    Przykład: asm(//zaokrąglanie w górę
    "fstcw %0\n\t"
    "andw $0xf3ff,%0\n\t"
    "orw $0x0800,%0\n\t"
    "fldcw %0\n\t"
    : : "m" (i)
    );

    Najpierw ładujemy słowo kontrolne procesora do zmiennej i typu int, następnie zerujemy bity 10 i 11 i ustawiamy bit 11, po czym i ładujemy do słowa kontrolnego koprocesora. (Bity 10 i 11 określają sposób, w jaki koprocesor zaokrągla liczby. Tutaj efektem jest, że koprocesor zaokrągla operacje na liczbach rzeczywistych w górę (ustawiony bit 11)).
    Patrz też : FSTSW , FSTCW
    Kategoria: Instrukcje koprocesora

    FLDENV

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fldenv mem
    Opis : Powoduje załadowanie środowiska koprocesora (w którego sklad wchodzą : słowo stanu , słowo kontrolne , wskaźnik na dane , wskaźnik na ostatnią instrukcję , tag word ) z podanego obszaru pamięci.
    Patrz też : FSTENV

    Kategoria: Instrukcje koprocesora

    FLDxx

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fldxx

    gdzie xx oznacza 1, l2e, l2t, lg2, ln2, pi, z
    Opis : Powoduje załadowanie stałej do wierzchołka stosu zmiennoprzecinkowego. Wskaźnik stosu jest najpierw zwiększany o jeden, tak więc nie ma się co martwić o nadpisanie poprzedniej wartości. Stałe te to : jeden, logarytm z e o podstawie 2, logarytm z 10 o podstawie 2, logarytm z 2 o podstawie 10, ln 2, pi, zero.
    Patrz też : FLD , FLDCW

    Kategoria: Instrukcje koprocesora

    FMUL

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fmul mem16/32

    Opis : Mnoży wierzchołek stosu zmiennoprzecinkowego przez podany operand traktowany jako liczba rzeczywista i wynik zachowuje na wierzchołku stosu. (w rejestrze st0).
    Patrz też : MUL , FMULP , FIMUL

    Kategoria: Instrukcje koprocesora

    FMULP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fmul mem16/32

    Opis : Mnoży wierzchołek stosu zmiennoprzecinkowego przez podany operand traktowany jako liczba rzeczywista i wynik zachowuje w adresie podanym przez operand.
    Patrz też : MUL , FMUL , FIMUL

    Kategoria: Instrukcje koprocesora

    FNDISI

    Dostępna: od 386 do 486
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fndisi

    Opis : Powoduje że znacznik IM w słowie kontrolnym koprocesora przyjmuje wartość jeden. (Włączenie zezwolenia na przerwania). W odróżnieniu od fdisi czeka na zakończenie wyjątków które mogły się w międzyczasie pojawić. Jak się wydaje, przez starsze od 286 komputery instrukcja traktowana jest jako "no operations" czyli jako pusta.
    Patrz też : FENI , CLI FDISI
    Kategoria: Instrukcje przerwań
    Instrukcje koprocesora

    FNCLEX

    Dostępna: od 386 do 486
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fnclex

    Opis : Znaczniki PE,UE,OE,ZE,DE,IE,IR, i B w slowie stanu koprocesora przyjmują wartość zero. Czeka przy tym aż poprzednie operacje koprocesora zakończą się ( i tym różni się od operacji fclex). FCLEX
    Kategoria: Instrukcje przerwań
    Instrukcje koprocesora

    FNINIT

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    finit

    Opis : Powoduje zainicjowanie pracy koprocesora. Zaznacza wszystkie rejestry koprocesora jako puste, mimo że nie zmienia ich zawartości, słowo kontrolne koprocesora przyjmuje wartość 03FF, słowo stanu przyjmuje wartość zero. Nie czeka przy tym, w odróżnieniu od instrukcji finit, na wyniki wykonywania wyjątków które mogły się w międzyczasie pojawić.
    Patrz też : FINIT

    Kategoria: Instrukcje koprocesora

    FNOP

    Dostępna: od 386
    Liczba Mikrokodów: 1
    komenda niesprawdzona
    Składnia:
    fnop

    Opis:instrukcja jest odpowiednikiem instrukcji pustej z C. Nic nie robi. Może więc być wykorzystana w pętlach opóźniających.
    Patrz też : NOP
    Kategoria: Instrukcje koprocesora

    FPATAN

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fpatan

    Opis: Wylicza arc tg (arcus tangens) kąta w radianach powstałego przez podzielenie st1 przez st0 i wynik umieszcza w st0. Działa podobnie jak funkcja C atan2, zmiana znaków st1 i st0 powoduje modyfikację wyniku o pi.
    Patrz też : FPTAN
    Kategoria: Instrukcje koprocesora

    FPREM

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fprem

    Opis: Oblicza resztę z dzielenia st0 przez st1. Robi to w następujący sposób: dzieli normalnie st0 przez st1, wynik zaokrągla do liczby całkowitej, liczbę tą mnoży przez st1 i odejmuje ją od st0. Zaokrąglanie wyniku do liczby całkowitej odbywa się w kierunku zera, tak więc wynik ma identyczny znak jak st0.
    Patrz też : FPREM1
    Kategoria: Instrukcje koprocesora

    FPREM1

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fprem

    Opis: Oblicza resztę z dzielenia st0 przez st1. Robi to w następujący sposób: dzieli normalnie st0 przez st1, wynik zaokrągla do liczby całkowitej, liczbę tą mnoży przez st1 i odejmuje ją od st0. Zaokrąglanie wyniku do liczby całkowitej odbywa się w kierunku najbliższej liczby całkowitej.
    Patrz też : FPREM
    Kategoria: Instrukcje koprocesora

    FRNDINT

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    frdint

    Opis: Zamienia zawartość st0 na liczbę całkowitą zgodnie z regułami zaokrąglania w polu rc w słowie kontrolnym koprocesora.
    Patrz też : Kategoria: Instrukcje koprocesora

    FRSTOR

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    frstor mem

    Opis: Wczytuje 98 lub 105 bajtów z adresu wskazanego operandem (ilość wczytanych bajtów zależy od trybu pracy procesora; w linuksie podejrzewam że będzie to zawsze 105) określających stan koprocesora. Stan ten powinien być zapamiętany jedną z instrukcji FSAVE lub FNSAVE.
    Patrz też : FSAVE FNSAVE , FSTENV
    Kategoria: Instrukcje koprocesora

    FPTAN

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fpatan

    Opis: Wylicza tg (tangens) kąta w radianach którego wartość umieszczona jest w st0 i wynik umieszcza w st0.
    Patrz też : FPATAN
    Kategoria: Instrukcje koprocesora

    FSAVE

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda sprawdzona
    Składnia:
    fsave mem: ?

    Opis: Powoduje zapisanie całego środowiska pracy koprocesora, a mianowicie zawartość wszystkich rejestrów, słowa kontrolnego koprocesora , słowa statusu koprocesora , "tag word" , instruction pointer , data pointer , last opcode (ostatni mikrokod/instrukcja?).
    Patrz też : FRSTOR , FNSAVE , FSTENV
    Kategoria: Instrukcje koprocesora

    FSCALE

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fscale

    Opis : Zaokrągla st1 w kierunku zera by otrzymać liczbę całkowitą, następnie podnosi dwójkę do potęgi określonej tą liczbą całkowitą, wynik mnoży przez st0. Wynik zapamiętywany jest w st0.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FSETPM

    Dostępna: 287
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsetpm

    Opis : Instrukcja przestarzała i traktowana przez procesory nowsze od 286 jako "no operation" czyli instrukcja pusta. Dawniej oznaczała zainicjowanie trybu chronionego koprocesora.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FSIN

    Dostępna: 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsin

    Opis : Oblicza sinus kąta o wartości podanej w radianach w st0 i wynik zapamiętuje w st0.
    Patrz też : FSINCOS , FCOS
    Kategoria: Instrukcje koprocesora

    FSINCOS

    Dostępna: 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsincos

    Opis : Oblicza sinus kąta o wartości podanej w radianach w st0, następnie oblicza cosinus tego samego kąta. Sinus zapamiętywany jest w st1, a cosinus w st0. Operacja ta jest szybsza niż wykonanie po sobie operacji fsin i fcos.
    Patrz też : FSIN , FCOS
    Kategoria: Instrukcje koprocesora

    FSQRT

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsqrt

    Opis : Powoduje obliczenie pierwiastka kwadratowego z st0 i wynik zachowuje w st0.
    Patrz też : FSCALE ,
    Kategoria: Instrukcje koprocesora

    FST

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fst mem32/64
    fst fpureg

    Opis : Powoduje zapisanie liczby rzeczywistej do adresu podanego argumentem z wierzchołka stosu zmiennoprzecinkowego.
    Patrz też : FLDxx , FLD , FSTP , FSTCW

    Kategoria: Instrukcje koprocesora

    FSTCW

    Dostępna: od 386
    Liczba Mikrokodów: 3
    komenda sprawdzona
    Składnia:
    fstcw m16: 3

    Opis: Powoduje załadowanie stanu słowa kontrolnego koprocesora do miejsca w pamięci.
    Przykład: asm(//zaokrąglanie w dółę
    "fstcw %0\n\t"
    "andw $0xf3ff,%0\n\t"
    "orw $0x0400,%0\n\t"
    "fldcw %0\n\t"
    : : "m" (i)
    );

    Najpierw ładujemy słowo kontrolne procesora do zmiennej i typu int, następnie zerujemy bity 10 i 11 i ustawiamy bit 10, po czym i ładujemy do słowa kontrolnego koprocesora. (Bity 10 i 11 określają sposób, w jaki koprocesor zaokrągla liczby. Tutaj efektem jest, że koprocesor zaokrągla operacje na liczbach rzeczywistych w dółę (ustawiony bit 10)).
    Patrz też : FLDCW
    Kategoria: Instrukcje koprocesora

    FSTENV

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fldenv mem
    Opis : Powoduje zapisanie środowiska koprocesora (w którego sklad wchodzą : słowo stanu , słowo kontrolne , wskaźnik na dane , wskaźnik na ostatnią instrukcję , tag word ) do podanego obszaru pamięci. Jest to operacja odwrotna do tej, którą przeprowadza fldenv.
    Patrz też : FLDENV

    Kategoria: Instrukcje koprocesora

    FSTSW

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fstsw m16: ?
    fstsw ax :?

    Opis: Powoduje załadowanie stanu słowa statusu koprocesora do miejsca w pamięci lub rejestru ax.
    Patrz też : FSTCW , FLDCW
    Kategoria: Instrukcje koprocesora

    FSTP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fstp mem32/64/80
    fstp fpureg

    Opis : Powoduje zapisanie liczby rzeczywistej do adresu podanego argumentem z wierzchołka stosu zmiennoprzecinkowego. Wskaźnik stosu następnie jest zwiększanY o jeden.
    Patrz też : FLDxx , FLD , FST , FSTCW

    Kategoria: Instrukcje koprocesora

    FSUB

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsub m32real : ?
    fsub m64real : ?
    fsub st(i): ?
    fsub st0,st(i) : ?
    fsub st(i),st0 : ?

    Opis: Odejmuje od siebie operandy (od st0 operand) i wynik zostawia w st0 lub w drugim (jeśli były dwa operandy). Lub też odejmuje operand do ST0 i wynik zostawia w ST0.
    Patrz też : SUB , FSUBP , FADD , FSUBRP , FSUBR
    Kategoria: Instrukcje koprocesora

    FSUBP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsubr m32real : ?
    fsubr m64real : ?
    fsubr st(i): ?
    fsubr st0,st(i) : ?
    fsubr st(i),st0 : ?

    Opis: Odejmuje od siebie operandy i wynik zostawia w drugim (jeśli były dwa operandy). Lub też odejmuje operand od ST0 i wynik zostawia w ST0. Po zakończeniu operacji zwiększa stos rejestrów koprocesora.
    Patrz też : SUB , FSUB , FADD , FSUBRP , FSUBR
    Kategoria: Instrukcje koprocesora

    FSUBR

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsubr st(i): ?
    fsubr st(i),st0: ?

    Opis: Działa tak samo jak fsub, tyle że odejmuje st0 od operandu i wynik zostawia w st0, lyb jeśli są dwa operandy, odejmuje operand od st0 i wynik zostawia w operandzie (Czyli dokładnie na odwrót jak fsub).
    Patrz też : SUB , FSUB , FADD , FSUBRP , FSUBP
    Kategoria: Instrukcje koprocesora

    FSUBRP

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fsubrp st(i): ?
    fsubrp st(i),st0: ?

    Opis: Działa tak samo jak fsub, tyle że odejmuje st0 od operandu i wynik zostawia w st0, lyb jeśli są dwa operandy, odejmuje operand od st0 i wynik zostawia w operandzie (Czyli dokładnie na odwrót jak fsub). Po zakończeniu operacji zwiększa wskaźnik stosu rejestrów koprocesora.
    Patrz też : SUB , FSUB , FADD , FSUBR , FSUBP
    Kategoria: Instrukcje koprocesora

    FTST

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    ftst

    Opis: Porównuje st0 z zerem i odpowiednio ustawia flagi. St0 traktowane jest jako lewy operand tej operacji, więc wynik ,,mniejszy niż'' jest ustawiany gdy st0 jest mniejsze od zera.
    Patrz też : TEST
    Kategoria: Instrukcje koprocesora

    FUCOMxx

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fucomxx st(i)
    fucomxx st0,st(i)
    fucompp
    gdzie xx to jeden z przyrostków : ip, i, p.

    Opis: Porównuje st0 z operandem i odpowiednio ustawia flagi. St0 traktowane jest jako lewy operand tej operacji, więc wynik ,,mniejszy niż'' jest ustawiany gdy st0 jest mniejsze od operanda. Przyrostek p oznacza obniżenie stosu rejestrów koprocesora, przyrostek i oznacza zapisywanie wyników bezpośrednio do flag procesora a nie flag koprocesora . FUCOMPP porównuje st0 i st1 i dwa razy obniża stos rejestrów procesora. Od instrukcji FCOM FUCOM różni się sposobem traktowania NaNów (not a number) : FCOM generuje wyjątek a FUCOM tylko ustawia flagę w słowie statusu koprocesora . Bity C0 i C3 w slowie statusu koprocesora
    przyjmują następujące wartości:
    C0=0 i C3 =0 gdy ST0 > operand
    C0 =1 C3 -0 gdy ST0 < operand
    C0=0 i C3=1 gdy ST0 == operand
    C0=1 i C3 =1 gdy St0 != operand (czyli, jak się domyślam, gdy zachodzi sytuacja nieporównywalności oprandu i st0 np. dwie nieskończoności)


    Patrz też : TEST , FCOM
    Kategoria: Instrukcje koprocesora

    FXAM

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fxam

    Opis: Ustawia flagi statusu koprocesora w zależności od liczby w rejestrze st0 w następujący sposób : C1 otrzymuje znak liczby (1- ujemna 0 -dodatnia jak sądzę) oraz
    C3,C2 i C0 następująco :
    000 - niewspierany format
    001 - NaN (not a number)
    010 - zwykła skończona liczba
    011 nieskończoność
    100 zero
    101 pusty rejestr
    110 zdenormalizowana liczba

    Patrz też :
    Kategoria: Instrukcje koprocesora

    FXCH

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fxch : ?
    fxch st(i): ?
    fxch st0,st(i): ?
    fxch st(i),st0: ?

    Opis: Zamienia zawartość st0 z podanym operandem. FXCH bez operandów zamienia zawartość st1 z st0.
    Patrz też : XCHG
    Kategoria: Instrukcje koprocesora

    FXDISI

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fxdisi: ?
    x oznacza n lub nic

    Opis: Flaga IM w słowie kontrolnym koprocesora przyjmuje wartość 0 (wyłączenie zezwolenia na przerwania). FNDISI robi to samo ale bez czekania aż koprocesor zakończy operacje.
    Patrz też : FENI , CLI
    , FDISI Kategoria: Instrukcje koprocesora

    F2XM1

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    f2xm1: ?

    Opis: Podnosi 2 do potęgi w st0, odejmuje jeden i wynik zachowuje w st0. W st0 musi początkowo być liczba z zakresu -1 do 1.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FXTRACT

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fxtract: ?

    Opis: Dzieli liczbę w st0 na cechę i mantysę, cechę zachowuje na st0, a następnie odkłada na stos mantysę. W efekcie cecha kończy na st1 a mantysa na st0.
    Patrz też :
    Kategoria: Instrukcje koprocesora

    FYL2X

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fyl2x: ?

    Opis: Instrukcja pobiera wartość x z wierzchołka stosu (st0), wartość y z st1, oblicza y log x przy podstawie logarytmu 2, wynik wrzuca do st1 i zwiększawskaźnik stosu. Wynik ląduje więc w st0. St0 początkowo musi zawierać liczbę dodatnią większą od zera.
    Patrz też : FYL2XP1
    Kategoria: Instrukcje koprocesora

    FYL2XP1

    Dostępna: od 386
    Liczba Mikrokodów: ?
    komenda niesprawdzona
    Składnia:
    fyl2xp1: ?

    Opis: Instrukcja pobiera wartość x z wierzchołka stosu (st0), wartość y z st1, oblicza y log (x+1) przy podstawie logarytmu 2, wynik wrzuca do st1 i zwiększawskaźnik stosu. Wynik ląduje więc w st0. St0 musi zawierać nie więcej niż jeden minus połowa z pierwiastka z dwóch.
    Patrz też : FYL2X
    Kategoria: Instrukcje koprocesora

    HLT

    Dostępna: od 386
    Liczba Mikrokodów: complex
    komenda niesprawdzona
    Instrukcja uprzywilejowana
    Składnia:
    hlt

    Opis: Instrukcja powoduje przejście procesora w stan zatrzymania. W tym stanie procesor będzie pozostawał aż do nadejścia przerwania lub resetu
    Patrz też :
    Kategoria: Inne instrukcje