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