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.
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 + *
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
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: