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
IBTS
Dostępna: od P6 (Pentium Pro)
Liczba Mikrokodów: -
komenda niesprawdzona
Składnia: - ibts r/m16/32,reg16/32
Opis: Instrukcja występująca tylko w wczesnych 386. Gcc nie przyjmuje takiej
instrukcji. Raczej więc jej nie ma; W nasmie pisze: ,, nie znalazłem żadnej
klarownej dokumentacji na jej temat. Najlepsze co udało mi się znaleźć to -
bierze łańcuch bitów z drugiego operandu i kładzie je do pierwszego operandu''
Patrz też :
XBTS
Kategoria: ?
ICEBP
Dostępna: od P6 (Pentium Pro)
Liczba Mikrokodów: -
komenda niesprawdzona
Składnia: - icebp
Opis: Synonim dla INT01 i INT1 .
"instrukcja używana przez in-circuit emulators (ICE's)". Jeżeli ktoś rozumie,
o co chodzi, proszę o kontakt.
Patrz też : INT01 , INT3 ,
INT1 , INT
Kategoria:
Instrukcje charakterystyczne dla Pantium/Pentium Pro/Pentium II
Instrukcje przerwań
IDIV
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: - idiv r/m8 : 3
idiv r/m16 : 4
idiv r/m32 : 4
Opis: Instrukcja dokonuje dzielenia całkowitego z znakiem, 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 %ax. 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ż : DIV (dzielenie bez znaku) MUL
, IMUL ,
Kategoria:
Instrukcje Arytmetyczne
Instrukcje operujące na liczbach całkowitych
IMUL
Dostępna: od 386
Liczba Mikrokodów: 1 % 4 (patrz niżej, składnia)
komenda niesprawdzona
Składnia: -
imul r/m8 : 1/2
imul r/m16 : 3/4
imul r/m32 : 3/4
imul reg16,r/m16 :2
imul reg32,r/m32 :2
imul reg16,imm8 : 1
imul reg16,imm16 : 1
imul reg32,imm8 : 1
imul reg32,imm32 : 1
imul reg16,r/m16,imm8 :2-1?
imul reg16,r/m16,imm16 :2-1?
imul reg32,r/m32,imm8 :2-1?
imul reg32,r/m32,imm32 :2-1?
Opis: Instrukcja dokonuje mnożenia dwóch liczb całkowitych ze znakiem.
Jeżeli dany jest tylko jeden argument, który jest :
8- bitowy, instrukcja ta mnoży %al przez dany operand.
Wynik mnożenia zostawia w %ax.
16 bitowy, to instrukcja mnoży %ax przez argument, wynik zostawiając
w %dx:%ax.
32 bitowy, instrukcja mnoży
%eax przez argument, wynik zostawiając w %edx:%eax
Jeżeli mamy podane dwa argumenty, to mnożone są one przez siebie i wynik
jest zostawiany w drugim operandzie (przeznaczenie). Jeżeli mamy podane
trzy operandy, to mnoży się pierwsze dwa operandy, wynik wysyłając do trzeciego
Przykład : movl $4,%eax imull $2 wynik : w %eax jest 8,%edx=0.
movl $2,%ebx \n movl $-4,%eax \n imull %eax,%ebx : wynik : - w %ebx -8
movl $2, %ebx \n imull $4,%ebx,%edx : wynik : w %edx 8.
Patrz też : DIV (dzielenie ze znakiem) MUL
, IDIV ,
Instrukcje Arytmetyczne
Instrukcje operujące na liczbach całkowitych
IN
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
in imm8,%al/%ax/%eax
in %dx,%al/%ax/%eax
Opis: Instrukcja ta powoduje przepisanie zawartości
portu o podanym numerze (bezpośrednio, jako liczba
0-255 lub za pośrednictwem rejestru %dx ) do rejestru %al,%ax lub %eax.
Patrz też : INSB , OUT ,
INSL , INSW
Kategoria:
Instrukcje wejścia-wyjścia
INC
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: - inc m8/16/32 : 4
inc r8/16/32 : 1
inc rm 8/16/32
Opis: Zwiększa argument o jeden, czyli równoważny jest operatorowi ++ w C. Nie
wywiera efektu na flagę CF. Żeby wywrzeć taki efekt, użyj polecenia
add 1,coś .
Przykład : movl $4,%eax \n incl %eax %eax równe jest 5
Patrz też : DEC
Kategoria:
Instrukcje Arytmetyczne
Instrukcje operujące na liczbach całkowitych
INSB
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsb
Opis: Instrukcja ta ładuje bajt z portu o adresie
podanym w rejestrze %dx do %es:%edi bądź %es:%di. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 1. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , IN ,
INSW
, INSL
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe
INSL
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsb
Opis: Instrukcja ta ładuje podwójne słowo z portu o adresie
podanym w rejestrze %dx do %es:%edi bądź %es:%di. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 4. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , IN ,
INSW
, INSB
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe
INSW
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsb
Opis: Instrukcja ta ładuje słowo z portu o adresie
podanym w rejestrze %dx do %es:%edi bądź %es:%di. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 2. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , IN ,
INSL
, INSB
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe
INT
Dostępna: od 386
Liczba Mikrokodów: complex?
komenda niesprawdzona
Składnia: - int imm8
Opis: Powoduje wywołanie przerwania programowego z zakresu od 0 do 255. Wywoływana
jest odpowiednia instrukcja obsługi przerwania. Można wywołać tą instrukcję
niezależnie od stanu flagi IF. Jeżeli wywołamy przerwanie NMI, to zostanie
wykonana procedura obsługi tego przerwania, ale nie zostaną wykorzystane żadne
specjalne mechanizmy normalnie wykorzystywane przy jego obsłudze.
Zasadniczo rzecz biorąc, wydaje mi się że instrukcja ta nie powinna być wykorzystywana
w assemblerowym kodzie w Linuxie. Wykorzystywać możesz ją jeśli
piszesz sterowniki urządzeń albo/i bezpośrednio chcesz się kontaktować z jądrem.
Jeżeli chcesz się odwołać do jednej z ok. 116 funkcji
systemowych, powinieneś skorzystać z odpowiednich makr. Po więcej szczegółów sięgnij
do Kernel Hacker's Guide, rozdział poświęcony wywoływaniem funkcji systemowych.
Spis przerwań znajduje się w /usr/src/linux/include/asm-i386/unistd.h. Tam też
znajdziesz odpowiednie makra. Najogólniej rzecz biorąc, po mojemu wygląda na to,
że aby wywołać funkcję systemową Linuxa , do %eax ładujemy numer funkcji
(np 12 dla chdir) i następnie wykonujemy instrukcję int $0x80. Argumenty dla funkcji
systemowych lądują (kolejno: dla funkcji 1, 2, 3, 4, 5 -argumentowych ) w %ebx,
%ecx, %edx, %esi, %edi, zaś wynik wywołania jest zostawiany w %eax.
Przykład wykorzystania znajdziesz w tym HOWTO w rozdziale
poświęconym pisaniu w czystym asmie oraz np. na stronie Konstantina
Boldysheva tutaj lub stronie
B.Reitera tutaj
.
Patrz też : INT01 , INT3 ,
INT1 , ICEBP ,
IRET
Kategoria:
Instrukcje przerwań
INT01
Dostępna: od P6
Liczba Mikrokodów: complex?
komenda niesprawdzona
Składnia: - int01
Opis: Ekwiwalent dla int 1. Synonim dla INT1 i ICEBP .
"instrukcja używana przez in-circuit emulators (ICE's)". Jeżeli ktoś rozumie,
o co chodzi, proszę o kontakt.
Patrz też : INT1 , INT3 ,
INT , ICEBP
Kategoria:
Instrukcje charakterystyczne dla Pantium/Pentium Pro/Pentium II
Instrukcje przerwań
INT1
Dostępna: od P6
Liczba Mikrokodów: complex?
komenda niesprawdzona
Składnia: - int
Opis: Ekwiwalent dla int 1. Synonim dla INT01 i ICEBP .
"instrukcja używana przez in-circuit emulators (ICE's)". Jeżeli ktoś rozumie,
o co chodzi, proszę o kontakt.
Patrz też : INT01 , INT3 ,
INT , ICEBP
Kategoria:
Instrukcje charakterystyczne dla Pantium/Pentium Pro/Pentium II
Instrukcje przerwań
INT3
Dostępna: od P6
Liczba Mikrokodów: complex?
komenda niesprawdzona
Składnia: - int3
Opis: To samo co int 3.
Patrz też : INT01 , INT ,
INT1 , ICEBP
Kategoria:
Instrukcje przerwań
INTO
Dostępna: od 386
Liczba Mikrokodów: complex?
komenda niesprawdzona
Składnia: - into
Opis: Jeżeli OF (wskaźnik nadmiaru) jest równy jeden, to isntrukcja
ta jest równoważna int 4.
Patrz też : INT01 , INT3 ,
INT1 , ICEBP
Kategoria:
Instrukcje przerwań
INVD
Dostępna: od 486
Liczba Mikrokodów: complex
komenda niesprawdzona
Składnia: - invd
Opis: Instrukcja ta unieważnia i opróżnia cache (pamięć podręczną)
wewnętrzny procesora oraz
poleca zrobić to samo z zewnętrznym cache. Zawartość cache nie jest zapisaywana
do pamięci, więc wszystkie zmodyfikowane dane trzymane w cache są stracone.
Jeżeli chcesz zapisać najpierw cache przed jego wyczyszczeniem, użyj komendy
WBINVD .
Patrz też : INVLPG , WBINVD
Kategoria:
Inne instrukcje
INVLPG
Dostępna: od 486
Liczba Mikrokodów: complex
komenda niesprawdzona
Składnia: - invlpg
Instrukcja ta (dostepna dopiero od 80486) usuwa z pamieci asocjacyjnej opis
strony do ktorej nalezy adres podany jako argument. W pamieci tej
przechowywane sa opisy najczesciej uzywanych stron przy wlaczonym
stronicowaniu (jest to taki cache dla tablic i katalogow tablic stron, ktore
normalnie umieszczone sa w zwyklej pamieci RAM, a do ktorych czas dostepu moze
byc stosunkowo dlugi). Instrukcja moze byc uzywana w przypadku gdy zmieniane
sa parametry stron (wielkosc, polozenie, atrybuty) i nalezy odswiezyc te
zmiany w pamieci asocjacyjnej.
Patrz też : INVD , WBINVD
Kategoria:
Inne instrukcje
IRET
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Składnia: - int imm8
Opis: Powoduje powrót z przerwania, tzn ściągnięcie wartości EIP,CS i
rejestru znaczników ze stosu i uaktualnienie SP, i kontynuowania wykonywania
od nowego CS:IP
Patrz też : INT , IRETD ,
IRETW , RET (powrót z podprogramu)
Kategoria:
Instrukcje przerwań
IRETD
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Składnia: - int imm8
Opis: Powoduje powrót z przerwania, tzn ściągnięcie wartości EIP,CS i
rejestru znaczników ze stosu i uaktualnienie SP, i kontynuowania wykonywania
od nowego CS:IP. Razem zdejmuje : cztery bajty do eip, dwa którymi się nie zajmuje
, dwa do CS, i 4 bajty na flagi, razem zdejmując 12 bajtów.
Patrz też : IRET ,
IRETW
Kategoria:
Instrukcje przerwań
IRETW
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Składnia: - int imm8
Opis: Powoduje powrót z przerwania, tzn ściągnięcie wartości EIP,CS i
rejestru znaczników ze stosu i uaktualnienie SP, i kontynuowania wykonywania
od nowego CS:IP. Zdejmuje po dwa bajty na IP, CS, flagi, razem 6 bajtów ze stosu.
Patrz też : INT , IRETD ,
IRET
Kategoria:
Instrukcje przerwań
Jcc
Dostępna: od 386 (P6)
Liczba Mikrokodów: 1
komenda niesprawdzona
Składnia: - jcc nazwa/adres
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 : Skok warunkowy. Przenosi sterowanie do etykiety określonej nazwą bądź
adresem. Warunek przeniesienia
zależy od użytego przerostka, np JZ et znaczy skocz do etykiety
et
jeśli ZF == 1.
Przykład : - 1) movb $255,%bl
addb $1,%bl
jc koniec
movb $32,%bl
koniec:
%bl równa się 0. Gdyby
początkowo do %bl załadowano 254, to %bl równałoby się 32. Patrz też przykład
przy omawianiu polecenia CMP
Patrz też : JMP , etykiety ,
CMOV (przeniesienie warunkowe danych),
PRZYROSTKI
Kategoria:
Instrukcje skoków, pętli i porównań
JCXZ
Dostępna: od 386
Liczba Mikrokodów: 2
komenda niesprawdzona
Składnia: - jcxz nazwa/adres
Opis: Wykonuje skok do etykiety o podanej nazwie, wówczas gdy %cx równe jest
zero.
Przykład : - movw $2,%cx
et:
decw %cx
jcxz koniec
jmp et
koniec:
Wykonuje pętlę opóźniającą dwa razy.
Patrz też : JMP , JECXZ ,
etykiety ,
Jcc
Kategoria:
Instrukcje skoków, pętli i porównań
JECXZ
Dostępna: od 386
Liczba Mikrokodów: 2
komenda niesprawdzona
Składnia: - jecxz nazwa/adres
Opis: Wykonuje skok do etykiety o podanej nazwie, wówczas gdy %ecx równe jest
zero.
Przykład : - movl $2,%ecx
et:
decl %ecx
jecxz koniec
jmp et
koniec:
Wykonuje pętlę opóźniającą dwa razy.
Patrz też : JMP , JCXZ ,
etykiety ,
Jcc
Kategoria:
Instrukcje skoków, pętli i porównań
JMP
Dostępna: od 386
Liczba Mikrokodów: 1 (skok bliski, gdy adres w r16/32)
2 (skok bliski, adres m16/32) complex (skok daleki)
komenda sprawdzona
Składnia: - jmp nazwa/adres
Opis: Wykonuje bezwarunkowy skok do etykiety o podanej nazwie lub adresie
Przykład: et: \n jmp et \n : pętla nieskończona.
Patrz też : JCXZ , JECXZ ,
etykiety ,
Jcc
Kategoria:
Instrukcje skoków, pętli i porównań
LAHF
Dostępna: od 386
Liczba Mikrokodów: 1
komenda niesprawdzona
Składnia: - lahf
Opis: Ładuje dolny bajt rejestru znaczników do rejestru %ah.
Patrz też : FLAGI ,
SAHF
Kategoria:
Inne instrukcje
LAR
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Składnia: - lar reg,reg / lar reg,mem
Opis: (ang. Load Access Rights) - laduje do rejestru podanego jako pierwszy
argument atrybuty segmentu ktorego selektor (numer) podany jest jako drugi
argument. Atrybutami sa m.in. rodzaj segmentu (kod, dane czy stos), prawa
dostepu (odczyt, zapis, wykonywanie) itd.
Patrz też : LTR
Kategoria:
Inne instrukcje
LDS
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lds m,r16/32
Opis:
Ładuje daleki wskaźnik z miejsca w pamięci do rejestru (16 lub 32 bity na offset
plus 16 bitów na segment). W danym rejestrze znajduje się offset załądowanego
wskaźnika załadowany z podanego miejsca w pamięci, a segment, czyli następne 16 bitów
znajduje się w %ds.
Patrz też :
LES,
LFS,
LGS,
LSS,
Kategoria:
Inne instrukcje
LEA
Dostępna: od 386
Liczba Mikrokodów: 1
komenda sprawdzona
Składnia: - lea m,r16/32
Opis: Oblicza efektywny adres pierwszego operandu i ładuje go do drugiego
operandu. Zastosowanie : patrz Przykład ósmy w niniejszym
dokumencie, gdzie obliczaliśmy adres zmiennych. Drugie zastosowanie, to wykonywanie
bardzo szybkich obliczeń :
Przykład : Obliczanie adresu : leal b,%eax adres zmiennej b został
umieszczony w %eax. Obliczenia arytmetyczne: movl $5,%eax \n movl $7,%ebx \n
leal (%eax,%ebx,2),%eax %eax zawiera %eax+%ebx*2 = 19. I to podobno
w jednym cyklu zegara, tak przynajmniej twierdzą wszystkie dokumentacje znalezione
na ten temat!!
Patrz też :
Kategoria:
Inne instrukcje
LEAVE
Dostępna: ?
Liczba Mikrokodów: ?
komenda sprawdzona
Składnia: - leave
Opis: usuwa ostatnio zalozona rame na stosie instrukcja ENTER
Patrz też : ENTER
Kategoria:
Inne instrukcje
Lxx
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lxx r16/32 gdzie xx =es,ds,fs,gs,ss
Opis:
ogolnie Lxx, gdzie xx jest rejestrem segmentowym (DS, ES,
FS, GS, SS) (ang. Load xx) - laduje pelny wskaznik spod adresu
pamieci podanego jako argument 2 do wskazanego w mnemoniku
rejestru segmentowego i ogolnego podanego jako pierszy
parametr. Zobacz też opisy poszczególnych poleceń.
Patrz też :
LES,
LDS,
LFS,
LGS,
LSS,
Kategoria:
Inne instrukcje
LES
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
les m,r16/32
Opis:
Ładuje daleki wskaźnik z miejsca w pamięci do rejestru (16 lub 32 bity na offset
plus 16 bitów na segment). W danym rejestrze znajduje się offset załądowanego
wskaźnika załadowany z podanego miejsca w pamięci, a segment, czyli następne 16 bitów
znajduje się w %es.
Patrz też :
LDS,
LFS,
LGS,
LSS,
Kategoria:
Inne instrukcje
LFS
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lfs m,r16/32
Opis:
Ładuje daleki wskaźnik z miejsca w pamięci do rejestru (16 lub 32 bity na offset
plus 16 bitów na segment). W danym rejestrze znajduje się offset załądowanego
wskaźnika załadowany z podanego miejsca w pamięci, a segment, czyli następne 16 bitów
znajduje się w %fs.
Patrz też :
LDS,
LES,
LGS,
LSS,
Kategoria:
Inne instrukcje
LGS
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lgs m,r16/32
Opis:
Ładuje daleki wskaźnik z miejsca w pamięci do rejestru (16 lub 32 bity na offset
plus 16 bitów na segment). W danym rejestrze znajduje się offset załądowanego
wskaźnika załadowany z podanego miejsca w pamięci, a segment, czyli następne 16 bitów
znajduje się w %gs.
Patrz też :
LDS,
LES,
LFS,
LSS,
Kategoria:
Inne instrukcje
LGDT
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Instrukcja uprzywilejowana
Skł
adnia: - lgdt rej16
lgdt pam16
Opis: (ang. Load Global Descriptor Table) - ładuje z adresu do rejestru GDTR
Argument wskazuje obszar 6 bajtow pamięci : 32 bity na adres liniowy
i 16 bitów na ogranicznik rozmiaru obszaru wskazywanego tym adresem.
Patrz też :
STR , SMSW
LTR , LMSW
LIDT
Kategoria:
Inne instrukcje
LIDT
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Instrukcja uprzywilejowana
Skł
adnia: - lidt rej16
lidt pam16
Opis: (ang. Load Interupt Descriptor Table) - ładuje z adresu do rejestru IDTR
Argument wskazuje obszar 6 bajtow pamięci : 32 bity na adres liniowy
i 16 bitów na ogranicznik rozmiaru obszaru wskazywanego tym adresem.
(rejestr ten zawiera wskaznik w globalnej tablicy
deskryptorow na segment z tablica deskryptorow przerwan.)
Patrz też :
STR , SMSW
LTR , LMSW
SLDT ,
LGDT ,
LLDT
Kategoria:
Inne instrukcje
LLDT
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Instrukcja uprzywilejowana
Skł
adnia: - lldt rej16
lldt pam16
Opis: (ang. Load Local Descriptor Table) - ładuje z adresu do rejestru LDTR
(rejestr ten zawiera wskaznik w globalnej tablicy
deskryptorow na segment z lokalna tablica deskryptorow procesu)
Patrz też :
STR , SMSW
LTR , LMSW
SLDT
Kategoria:
Inne instrukcje
LMSW
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: - lmsw rej16
lmsw pam16
Opis: (ang. Load Machine Status Word) - Laduje do rejestru MSW (dolna polowka
rejsetru CR0) z podanego jako argument adresu (w tym rejestrze sa zapisane
w postaci bitow najwazniejsze informacje o stanie procesora, np. czy jest
wlaczony tryb wirtualny czy rzeczywisty)
Patrz też :
STR , SLDT
LTR , LMSW
LLDT
Kategoria:
Inne instrukcje
LOADALL
Dostępna: od 386?
Liczba Mikrokodów: ?
komenda niesprawdzona
Składnia: - loadall
Opis: Gcc nie uznaje tej instrukcji. Podobnoż występuje tylko na 386 i
niektórych 486. Ładuje wszelkie informacje na temat procesora do
es:edi
Patrz też :
Kategoria: ?
LOCK
Dostępna: od 386?
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: - lock polecenie
gdzie polecenie jest jednym z :
ADD , ADC ,
AND , BTC ,
BTR , BTS ,
CMPXCHG , DEC ,
INC , NEG ,
NOT , OR ,
SBB , SUB ,
XADD , XCHG ,
XOR
Opis: Powoduje, że instrukcja traktowana jest jako atomowa. W środowisku
wieloprocesorowym instrukcja będzie miała wyłączny dostęp do pamięci
dzielonej z której korzysta (?). W info do as-a pisze że podczas wykonywania
instrukcji nie będą obsługiwane przerwania.
Patrz też :
Kategoria:
Inne instrukcje
LODSB
Dostępna: od 386
Liczba Mikrokodów: 2
komenda niesprawdzona
Składnia: - lodsb [seg]
Opis: Ładuje bajt o adresie %ds:%esi do %al i następnie zmniejsza
lub zwiększa ( w zależności od znacznika DF : jeśli DF=1, to zmniejsza)
%esi o 1. Zamiast %ds można użyć innego
segmentu. Nie jestem pewien co trzeba zrobić w gcc : es lodsb, %es lodsb kończy się
błędem. Udało mi się coś takiego :
push %esi \n movb $34,%es:(%esi) \n lodsb %es \n
ale nie jestem pewien czy to przypadek czy nie.. Brakuje
mi w takich przypadkach jakiegoś podręcznika do assemblera z wykorzystaniem
składni AT&T. W kodzie jądra w kilku miejscach znalazłem coś takiego:
fs ; lodsb. Nie jestem pewien czy o to chodzi i jak to się ma do tego
co wymyśliłem ja :-(.
Podręcznik Intela dodaje : można używać razem z intrukcjami
REP ale zazwyczaj używa się LOOP , gdyż dane ładowane
za pomocą tej instrukcji są zazwyczaj przetwarzane. Przepyszne no nie?
Patrz też : STOSB ,
LODSW , LODSD
Kategoria:
Instrukcje łańcuchowe
LODSD
Dostępna: od 386
Liczba Mikrokodów: 2
komenda niesprawdzona
Składnia: - lodsd [seg]
Opis: Ładuje podwójne słowo o adresie %ds:%esi do %ax, i następnie zmniejsza
lub zwiększa ( w zależności od znacznika DF : jeśli DF=1, to zmniejsza)
%esi o 4. Zamiast %ds można użyć innego
segmentu. Patrz opis LODSB .
Patrz też :
LODSB , LODSW
Kategoria:
Instrukcje łańcuchowe
LODSW
Dostępna: od 386
Liczba Mikrokodów: 2
komenda niesprawdzona
Składnia: - lodsw [seg]
Opis: Ładuje słowo o adresie %ds:%esi do %ax, i następnie zmniejsza
lub zwiększa ( w zależności od znacznika DF : jeśli DF=1, to zmniejsza)
%esi o 2. Zamiast %ds można użyć innego
segmentu. Patrz opis LODSB .
Patrz też :
LODSB , LODSD
Kategoria:
Instrukcje łańcuchowe
LOOP
Dostępna: od 386
Liczba Mikrokodów: 4
komenda sprawdzona
Składnia: - loop nazwa
Opis: Jeżeli %ecx jest różne od zera, zmniejsza %ecx o 1 i wykonuje
skok do etykiety .
Przykład:
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n loope
%eax jest równy 32.
Patrz też :
LOOPE , LOOPZ ,
LOOPNE , LOOPNZ ,
JCXZ , etykiety
Kategoria:
Instrukcje pętli, skoków i porównań
LOOPE
Dostępna: od 386
Liczba Mikrokodów: 4
komenda sprawdzona
Składnia: - loope nazwa
Opis: Jeżeli %ecx jest różne od zera i ZF równy jest jeden, zmniejsza %ecx o 1 i wykonuje
skok do etykiety.
Przykład:
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n loope
%eax jest równy 1. (Gdyż ZF równe było 0, ostatnia operacja, czyli dodawanie,
zwróciło niezerowy wynik) .
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n cmpl %ecx,%ecx \n
loope
%eax jest równy 32. (Gdyż ZF równe było 1, ostatnia operacja, czyli porównanie,
zwróciło zerowy wynik) .
Patrz też :
LOOP , LOOPZ ,
LOOPNE , LOOPNZ
Kategoria:
Instrukcje pętli, skoków i porównań
LOOPNE
Dostępna: od 386
Liczba Mikrokodów: 4
komenda sprawdzona
Składnia: - loopne nazwa
Opis: Jeżeli %ecx jest różne od zera i ZF równy jest zero, zmniejsza %ecx o 1 i wykonuje
skok do etykiety .
Przykład:
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n loope
%eax jest równy 32. (Gdyż ZF równe było 0, ostatnia operacja, czyli dodawanie,
zwróciło niezerowy wynik) .
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n cmpl %ecx,%ecx \n
loope
%eax jest równy 1. (Gdyż ZF równe było 1, ostatnia operacja, czyli porównanie,
zwróciło zerowy wynik) .
Patrz też :
LOOP , LOOPZ ,
LOOPE , LOOPNZ ,
etykiety
Kategoria:
Instrukcje pętli, skoków i porównań
LOOPNZ
Dostępna: od 386
Liczba Mikrokodów: 4
komenda sprawdzona
Składnia: - loopnz nazwa
Opis: Jeżeli %ecx jest różne od zera i ZF równy jest zero, zmniejsza %ecx o 1 i wykonuje
skok do etykiety .
Przykład:
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n loope
%eax jest równy 32. (Gdyż ZF równe było 0, ostatnia operacja, czyli dodawanie,
zwróciło niezerowy wynik) .
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n cmpl %ecx,%ecx \n
loope
%eax jest równy 1. (Gdyż ZF równe było 1, ostatnia operacja, czyli porównanie,
zwróciło zerowy wynik) .
Patrz też :
LOOP , LOOPZ ,
LOOPE , LOOPNE ,
etykiety
Kategoria:
Instrukcje pętli, skoków i porównań
LOOPZ
Dostępna: od 386
Liczba Mikrokodów: 4
komenda sprawdzona
Składnia: - loopz nazwa
Opis: Jeżeli %ecx jest różne od zera i ZF równy jest jeden, zmniejsza %ecx o 1 i wykonuje
skok do etykiety .
Przykład:
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n loope
%eax jest równy 1. (Gdyż ZF równe było 0, ostatnia operacja, czyli dodawanie,
zwróciło niezerowy wynik) .
movl $32,%ecx \n movl $0,%eax \n et: \n incl %eax \n cmpl %ecx,%ecx \n
loope
%eax jest równy 32. (Gdyż ZF równe było 1, ostatnia operacja, czyli porównanie,
zwróciło zerowy wynik) .
Patrz też :
LOOP , LOOPE ,
LOOPNE , LOOPNZ ,
etykiety
Kategoria:
Instrukcje pętli, skoków i porównań
LSL
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lsl reg16,r/m16
lsl reg32,r/m32
Opis: Drugi operand powinien zawierać selektor segmentu. Instrukcja powoduje
powbranie z selektora (znajdującego się w rejestrze lub pamięci) deskryptora
określającego długość segmentu i wprowadzenie go do rejestru określonego pierwszym operandem.
Jeśli operacja jest pomyślna, ZF w rejestrze flag
przyjmuje wartość zero.
Patrz też :
LDS,
LFS,
LGS,
LSS,
Kategoria:
Inne instrukcje
LSS
Dostępna: od 386
Liczba Mikrokodów: complex
komenda sprawdzona
Składnia: -
lss m,r16/32
Opis:
Ładuje daleki wskaźnik z miejsca w pamięci do rejestru (16 lub 32 bity na offset
plus 16 bitów na segment). W danym rejestrze znajduje się offset załądowanego
wskaźnika załadowany z podanego miejsca w pamięci, a segment, czyli następne 16 bitów
znajduje się w %ss.
Patrz też :
LDS,
LES,
LFS,
LGS,
Kategoria:
Inne instrukcje
LTR
Dostępna: od 286
Liczba Mikrokodów: ?
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia : ltr rej16/mem16
Opis: (ang. Load TR) - ładuje rejestr TR (rejestr okreslajacy numer
aktualneg zadania) pod adres podany jako argument.
Patrz też :
SMSW , STR .
SLDT
Kategoria:
Inne instrukcje
MOV
Dostępna: od 386
Liczba Mikrokodów: różnie (patrz składnia)
komenda sprawdzona
Przy dostępie do rejestrów TR, CR i DR
Instrukcja uprzywilejowana
Składnia: - mov r8/16/32,m8/16/32 (2)
mov m8/16/32,r8/16/32 (1)
mov cs/ds/es/fs/gs,m (3)
mov m,cs/ds/es/ef/gs (4)
mov (cokolwiek),rm (1)
mov (cr/dr),(cokolwiek) i odwrotnie (complex)
Opis:
Przesyła dane (bajt, słowo lub podwójne słowo, co można wyspecyfikować
przyrostkiem b, w lub l. Inaczej gcc samo zadecyduje o rozmiarze operandu
na podstawie kontekstu - jeśli kontekst będzie niejednoznaczny,
skończy się to komunikatem o błędzie, jak zawsze). Drugim operandem (celem) nie
może być %cs. Oba operandy muszą byc tego samego rozmiaru. Ciekawostka : tej
instrukcji poświęconych jest chyba z sześć stron w instrukcji Intela.
Przykład:
movl $32,%ecx
%eax jest równy 32.
Patrz też :
MOVD , MOVQ ,
MOVSB , MOVZX
Kategoria:
Instrukcje manipulujące danymi
MOVD
Dostępna: od MMX
Liczba Mikrokodów: ?
komenda sprawdzona
Składnia: -
movd mmxreg,r/m32
movd r/m32,mmxreg
Opis:
Przesyła podwójne słowo czyli 32 bity z pierwszego operandu do drugiego .
Ścislej : przesyła dolne 32 bity z rejestru MMX (%mm0-%mm7) do
rejestru 32-bitowego (jednego z %eax,%ecx,%edx,%ebx) lub miejsca w
pamięci, lub też wypełnia dolne 32 bity rejestur MMX zawartością rejestru
32 bitowego lub 32 bitami z pamięci, górne 32 bity rejestru MMX wypełniając
zerami.
Przykład:
movl $32,%ecx \n movd %ecx,%mm0
%mm0 jest równy 32. Uwaga! Nie można ładować tą instrukcją stałych,
tzn niepoprawne jest movd $32,%mm0
Patrz też :
MOV , MOVQ ,
MOVSB , MOVZX
Kategoria:
Instrukcje manipulujące danymi
,
Instrukcje MMX
MOVQ
Dostępna: od MMX
Liczba Mikrokodów: ?
komenda sprawdzona
Składnia: -
movq mmxreg,m64
movq m64,mmxreg
movq mmxreg,mmxreg
Opis:
Przesyła podczwórne słowo (quadword) czyli 64 bity z pierwszego operandu do
drugiego .
Przykład:
movl $b,%ecx \n movl $32,%eax \n movd %eax,%mm0 \n movq %mm0,(%ecx)
Zmienna typu " long long "b jest równa 64. Uwaga! Nie można ładować tą instrukcją stałych,
tzn niepoprawne jest movd $32,%mm0
Patrz też :
MOV , MOVQ ,
MOVSB , MOVZX
Kategoria:
Instrukcje manipulujące danymi
,
Instrukcje MMX
MOVSB
Dostępna: od 386
Liczba Mikrokodów: complex
komenda nie sprawdzona
Składnia: - movsb
Opis: Instrukcja kopiuje bajt o adresie %es:%edi do %ds:%esi .
Następnie, w zależności od stanu
znacznika DF zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0)
%esi o 1. Patrz LODSB . Wszystkie zawarte tam
uwagi tyczą się również tej instrukcji.
Patrz też :
MOV , MOVQ ,
MOVSW , MOVZX
MOVSL , LODSB
Kategoria:
Instrukcje manipulujące danymi
MOVSL
Dostępna: od 386
Liczba Mikrokodów: complex
komenda nie sprawdzona
Składnia: - movsd
Opis: Instrukcja kopiuje podwójne słowo o adresie %es:%edi do %ds:%esi .
Następnie, w zależności od stanu
znacznika DF zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0) %edi i
%esi o 4. Patrz LODSB . Wszystkie zawarte tam
uwagi tyczą się również tej instrukcji.
Patrz też :
MOV , MOVQ ,
MOVSW , MOVZX
MOVSB , LODSB
Kategoria:
Instrukcje manipulujące danymi
MOVSW
Dostępna: od 386
Liczba Mikrokodów: complex
komenda nie sprawdzona
Składnia: - movsw
Opis: Instrukcja kopiuje słowo o adresie %es:%edi do %ds:%esi .
Następnie, w zależności od stanu
znacznika DF zmniejsza (gdy DF=1) lub zwiększa (gdy DF=0)
%esi o 2. Patrz LODSB . Wszystkie zawarte tam
uwagi tyczą się również tej instrukcji.
Patrz też :
MOV , MOVQ ,
MOVSB , MOVZX
MOVSL , LODSB
Kategoria:
Instrukcje manipulujące danymi
MOVSX
Dostępna: od 386
Liczba Mikrokodów: 1
komenda nie sprawdzona
Składnia: - movsx r/m8,r16/32
movsx r/m16, r32
x oznacza bl,bw,wl
Opis:
Robi to samo co instrukcja MOV , z tym że działa
między operandami o różnej wielkości. Pozostałe bity operandu docelowego
dopełnia znakami znaku.
W gcc instrukcja ta ma postać movs.. (przyrostek, : bl,bw,wl (from byte to
long, from byte to word, from word to long)).
Patrz też :
MOV , MOVQ ,
MOVSB , MOVZX
MOVSB , LODSB
Kategoria:
Instrukcje manipulujące danymi
MOVZX
Dostępna: od 386
Liczba Mikrokodów: 1
komenda nie sprawdzona
Składnia: - movzx r/m8,r16/32
movzx r/m16, r32
gdzie x oznacza bl,bw lub wl
Opis:
Robi to samo co instrukcja MOV , z tym że działa
między operandami o różnej wielkości. Pozostałe bity operandu docelowego
dopełnia znakami znaku.
W gcc instrukcja ta ma postać movz.. (przyrostek, : bl,bw,wl (from byte to
long, from byte to word, from word to long)).
Patrz też :
MOV , MOVQ ,
MOVSB , MOVSX
MOVSB , LODSB
Kategoria:
Instrukcje manipulujące danymi
MUL
Dostępna: od 386
Liczba Mikrokodów: 1 % 4 (patrz niżej, składnia)
komenda niesprawdzona
Składnia: -
mul r/m8 : 1/2
mul r/m16 : 3/4
mul r/m32 : 3/4
Opis: Instrukcja dokonuje mnożenia dwóch liczb całkowitych bez znaku.
Jeżeli dany jest tylko jeden argument, który jest :
8- bitowy, instrukcja ta mnoży %al przez dany operand.
Wynik mnożenia zostawia w %ax.
16 bitowy, to instrukcja mnoży %ax przez argument, wynik zostawiając
w %dx:%ax.
32 bitowy, instrukcja mnoży
%eax przez argument, wynik zostawiając w %edx:%eax
Przykład : movl $4,%eax \n movl $2,%ecx \n mull %ecx
wynik : w %eax jest 8,%edx=0.
Patrz też : DIV (dzielenie ze znakiem) IMUL
, IDIV
Kategoria:
Instrukcje Arytmetyczne
Instrukcje operujące na liczbach całkowitych
NEG
Dostępna: od 386
Liczba Mikrokodów: 1 % 4 (patrz niżej, składnia)
komenda niesprawdzona
Składnia: -
neg r8/16/32 : 1
neg m8/16/32 : 4
Opis:
Instrukcja powoduje, że w operandzie odwracane są wszystkie bity (z zera na jeden
i z jednego na zero) i dodaje do wyniku jeden. W efekcie otrzymujemy dla liczb
ze znakiem tą samą liczbę, tylko ujemną.
Przykład : movl $5,%eax \n neg %eax wynik : w %eax jest
4294967291 (bez znaku) czyli -5 (ze znakiem).
Patrz też : NOT
Kategoria:
Instrukcje logiczne
Instrukcje operujące na liczbach całkowitych
NOP
Dostępna: od 386
Liczba Mikrokodów: 1
komenda niesprawdzona
Składnia: -
nop
Opis:instrukcja jest odpowiednikiem instrukcji pustej z C. Nic nie robi. Może
więc być wykorzystana w pętlach opóźniających.
Przykład : movl $255,%ecx \n et: \n nop \n loop et
W efekcie wykonujemy 255 razy pętlę która nic nie robi.
Patrz też :
FNOP
Kategoria:
Inne instrukcje
NOT
Dostępna: od 386
Liczba Mikrokodów: 1 % 4 (patrz niżej, składnia)
komenda niesprawdzona
Składnia: -
not r8/16/32 : 1
not m8/16/32 : 4
Opis:
Instrukcja powoduje, że w operandzie odwracane są wszystkie bity (z zera na jeden
i z jednego na zero) . W efekcie otrzymujemy dla liczb
ze znakiem tą samą liczbę, tylko ujemną i mniejszą o jeden .
Przykład : movl $5,%eax \n neg %eax wynik : w %eax jest
4294967290 (bez znaku) czyli -6 (ze znakiem).
Patrz też : NEG
Kategoria:
Instrukcje logiczne
Instrukcje operujące na liczbach całkowitych
OR
Dostępna: od 386
Liczba Mikrokodów: 1 % 4 (patrz niżej, składnia)
komenda niesprawdzona
Składnia: -
or imm8,%al : 1
or imm16/32,%eax : 1
or imm16/32,m16/32 : 4
or r16/32, m16/32 : 4
or imm8,m8 : 4
or r8,m8 : 4
or imm16/32,r16/32 : 1
or imm8,r16/32 : 1
or m16/32,r16/32 : 2
or rm16/32,r16/32 : 1
or imm8,r8 : 1
or m8,r8 : 2
or rm8,r8 : 1
or r16/32,rm16/32 : 1
or r8,rm8 : 1
Opis: Dokonuje boolowskiej sumy operandów, wynik umieszczając w drugim
operandzie. Boolowska suma oznacza : 1 | 1 == 1, 1 | 0 == 1,
0 | 0 == 0, 0 | 1 == 1.
Przykład : movl $2,%eax \n movl $4,%ecx \n or %eax,%ecx
wynik : w %ecx jest 6.
Patrz też : XOR ,
POR
Kategoria:
Instrukcje logiczne
Instrukcje operujące na liczbach całkowitych
OUT
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
out imm8,%al/%ax/%eax
out %dx:%al/%ax/%eax : 4
Opis: Instrukcja ta powoduje przepisanie zawartości jednego z rejestrów
%al, %ax lub %eax do portu o podanym numerze (bezpośrednio, jako liczba
0-255 lub za pośrednictwem rejestru %dx ).
Patrz też : OUTSB , IN
Kategoria:
Instrukcje wejścia-wyjścia
OUTSB
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsb
Opis: Instrukcja ta ładuje bajt o adresie %ds:%esi do portu o adresie
podanym w rejestrze %dx. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 1. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , OUT ,
OUTSL , OUTSW
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe
OUTSL
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsl
Opis: Instrukcja ta ładuje podwójne słowo o adresie %ds:%esi do portu o adresie
podanym w rejestrze %dx. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 4. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , OUT ,
OUTSB , OUTSW
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe
OUTSW
Dostępna: od 386
Liczba Mikrokodów: complex
komenda niesprawdzona
Instrukcja uprzywilejowana
Składnia: -
outsw
Opis: Instrukcja ta ładuje słowo o adresie %ds:%esi do portu o adresie
podanym w rejestrze %dx. Następnie, w zależności od
znacznika DF zmniejsza (gdy DF =1 ) lub zwiększa (gdy DF =0)
%esi o 2. Zamiast rejestru %ds można użyć innego, patrz
LODSB . Można użyć przedrostka
REP by powtórzyc tą operację %ecx razy.
Patrz też : INSB , OUT ,
OUTSB , OUTSW
Kategoria:
Instrukcje wejścia-wyjścia ,
Instrukcje łańcuchowe