Programowanie w języku Assembler

Instrukcje procesorów rodziny 80x86 (M)


MOVMove Byte or Word
UżycieMOV dest, src
Modyfikowane flagiBrak
Kopiuje zawartość src do dest. Jeżeli dest=SS przerwania są wyłączane (za wyjątkiem wczesnych błędnych procesorów 808x). Niektóre procesory wyłączają przerwania, jeżeli dest jest którymkolwiek z rejestrów segmentowych.

Przykład:
mov ax, @data ;ładujemy segment danych do ax
mov ds, ax ;i ustawiamy go

 Liczba cykli zegaraRozmiar
Parametry808x286386486PentiumBajtów
reg, reg22211 UV2
mem, reg13+EA3211 UV2
reg, mem12+EA5411 UV2
mem, imm14+EA13311 UV*2
reg, imm42211 UV2
acc, mem145411 UV3
mem, acc143211 UV3
seg, r1622232-11 NP2
seg, m1612+EA5533-12 NP2
reg16, seg22231 NP2
mem16, seg13+EA3231 NP2

- jeżeli specjalne rejestry 386 są użwane to wszystkie operandy są 32-bitowe
- zestawienie nie uwzględnia operacji w trybie Protected oraz operacji na rejestrach specjalnych 386+ (control, debug, trap). Jeżeli brakuje Ci tego, to daj znać, a uzupełnię.
  • - nieparowalne, jeżeli jest przesunięcie i natychmiastowe adresowanie na raz

MOVSMove String (Byte or Word)
UżycieMOVS dest, src
MOVSB
MOVSW
MOVSD (386+)
Modyfikowane flagiBrak

Kopiuje dane spod adresu DS:SI (nawet, jeżeli podano operand) do ES:DI i zmienia SI i DI zależnie od rozmiaru operandu lub instrukcji. SI i DI są zwiększane, jeżeli DF=0 i zmniejszane gdy DF=. Używaj z prefiksem REP.

Przykład:
Lancuch db "Ala ma kota$"
Kopia db 15 dup(?)
....
push ds
pop es ;zmienna docelowa w tym samym segmencie danych
lea di, Kopia ;ładujemy indeks do łańcucha doktórego kopiujemy
lea si, Lancuch ;ładujemy indeks do łańcucha z którego kopiujemy
mov cx, 12 ;kopiujemy 12 znaków
cld ;będziemy zwiększać indeksy
rep movsb ;i kopiujemy po bajcie

 Liczba cykli zegaraRozmiar
Parametry808x286386486PentiumBajtów
movsb185774 NP1
movsw265774 NP1
movsd--774 NP1
rep movsb9+17n5+4n7+4n12+3n*3+n NP2
rep movsw9+25n5+4n7+4n12+3n*3+n NP

2

rep movsd--7 +4n12+3n*3+n NP2

  • = 5 jeżeli n=0, 13 jeżeli n=1
    (n = liczba bajtów, słów lub podwójnych słów)

MOVSXMove with Sign Extend (386+)
UżycieMOVSX dest,src
Modyfikowane flagiBrak

Kopije src do dest, rozszerzając znak.Rozmiar dest jest zawsze większy niż src.

Przykład:
mov al, FEh ;al = 1111 1110 b = -2 d
movsx dx, al ; dx = 1111 1111 1111 1110 b = -2 d
mov al, 0Eh ;al = 0000 1110 b = 15 d
movsx dx, al ; dx = 0000 0000 0000 1110 b = 15 d

 Liczba cykli zegaraRozmiar
Parametry808x286386486PentiumBajtów
reg, reg--333 NP3
reg, mem--633 NP3


MOVZXMove with Zero Extend (386+)
UżycieMOVZX dest,src
Modyfikowane flagiBrak

Kopiuje src do dest rozszerzając o 0. Rozmiar dest jest zawsze większy niż src.

Przykład:
mov al, FEh ;al = 1111 1110 b = -2 d
movzx dx, al ; dx = 0000 0000 1111 1110 b = 254 d
mov al, 0Eh ;al = 0000 1110 b = 15 d
movzx dx, al ; dx = 0000 0000 0000 1110 b = 15 d

 Liczba cykli zegaraRozmiar
Parametry808x286386486PentiumBajtów
reg, reg--333 NP3
reg, mem--633 NP3


MULUnsigned Multiply
UżycieMUL src
Modyfikowane flagiCF OF (AF,PF,SF,ZF nieokreślone)

Mnoży zawartość akumulatora (AL, AX lub EAX) przez src nie biorąc pod uwagę znaku (liczby w natrualnym kodzie binarnym NKB).

Czynnik1Czynnik2 (rozmiar)Iloczyn
ALByteAX
AXWordDX:AX
EAXDWordEDX:EAX

Procesory 386+ używają algorytmu, który mnoży dowolną wartość z EAX tak samo szybko jak w rejestrach 8 czy 16 bitowych.

Przykład:
mov ax, 2F3h ; ax = 755 d
mov cx, 0Eh ; cx = 15 d
mul cx ;edx:eax = 11375 d = 2c3dh

 Liczba cykli zegaraRozmiar
Parametry808x286386486Bajtów
reg870-77139-1413-182
reg16118-113219-2213-262
reg32--9-3813-422-4
mem8(76-83)+EA1612-1713-182-4
mem16(124-139)+EA2412-2513-262-4
mem32--12-2113-412-4


Autorzy:
Dryobates
LKS
Vogel
Wirek

3 komentarze

intercooler 2012-01-16 20:03

Weźmy jako przykład podaną w tabeli instrukcję 'MUL' ... wynika z tego, że na procesorze 386
wykonuje się szybciej niż na 486 ???? - byłem przekonany, że powinno być odwrotnie ....

Assa 2011-11-13 17:13

brakuje mi jedynie obok opcod'ów :)

shua 2003-04-10 11:24

ale macie leb :-)