Aracılığıyla paylaş


x86 Instructions

Bu bölümdeki listelerde, yıldız (*) ile işaretlenmiş yönergeler özellikle önemlidir. Bu kadar işaretlenmemiş yönergeler kritik değildir.

x86 işlemcide yönergeler değişken boyutlu olduğundan geriye doğru ayrıştırma, desen eşleştirmede bir alıştırmadır. Bir adresten geriye doğru sökmek için, gerçekten gitmek istediğinizden daha geri bir noktada ayırmaya başlamanız ve ardından yönergeler anlamlı olana kadar ileriye bakmanız gerekir. Bir yönergenin ortasında ayırmaya başlamış olabileceğiniz için ilk birkaç yönerge anlamlı olmayabilir. Ne yazık ki, sökme işleminin hiçbir zaman yönerge akışıyla eşitlenmeyeceğini ve çalışan bir başlangıç noktası bulana kadar farklı bir başlangıç noktasında ayırmayı denemeniz gerekecektir.

For well-packed switch statements, the compiler emits data directly into the code stream, so disassembling through a switch statement will usually stumble across instructions that make no sense (because they are really data). Verilerin sonunu bulun ve orada parçalara ayırmaya devam edin.

Yönerge Gösterimi

Yönergeler için genel gösterim, hedef kaydı sola ve kaynağı sağa yerleştirmektir. Ancak, bu kuralda bazı özel durumlar olabilir.

Aritmetik yönergeler genellikle kaynak ve hedef yazmaçları birleştiren iki kayıttır. Sonuç hedefe depolanır.

Yönergelerin bazıları hem 16 bit hem de 32 bit sürümlere sahiptir, ancak burada yalnızca 32 bit sürümler listelenmiştir. Burada listelenmemiş olan kayan nokta yönergeleri, ayrıcalıklı yönergeler ve yalnızca kesimli modellerde kullanılan yönergeler (Microsoft Win32'nin kullanmadığı).

Alandan tasarruf etmek için, yönergelerin çoğu aşağıdaki örnekte gösterildiği gibi birleşik biçimde ifade edilir.

*

MOV

r1, r/m/#n

r1 = r/m/#n

, ilk parametrenin bir yazmaç olması gerektiği, ancak ikincisi bir yazmaç, bellek başvurusu veya anlık bir değer olabileceği anlamına gelir.

Daha da fazla alan kazanmak için, yönergeler aşağıdaki gibi de ifade edilebilir.

*

MOV

r1/m, r/m/#n

r1/m = r/m/#n

bu, ilk parametrenin bir yazmaç veya bellek başvurusu olabileceği, ikinci parametrenin ise yazmaç, bellek başvurusu veya anlık değer olabileceği anlamına gelir.

Aksi belirtilmedikçe, bu kısaltma kullanıldığında hem kaynak hem de hedef için bellek seçemezsiniz.

Ayrıca, parametrenin bu boyutta olması gerektiğini belirtmek için kaynak veya hedefe bit boyutu son eki (8, 16, 32) eklenebilir. Örneğin r8, 8 bit yazmaç anlamına gelir.

Bellek, Veri Aktarımı ve Veri Dönüştürme

Bellek ve veri aktarımı yönergeleri bayrakları etkilemez.

Geçerli Adres

*

LEA

r, m

Etkin adresi yükle.

(r = m adresi)

Örneğin, LEA eax, [esi+4]eax = esi + 4 anlamına gelir. Bu yönerge genellikle aritmetik gerçekleştirmek için kullanılır.

Veri Aktarımı

MOV

r1/m, r2/m/#n

r1/m = r/m/#n

MOVSX

r1, r/m

İmza uzantısıyla hareket etme.

*

MOVZX

r1, r/m

Sıfır uzantıyla hareket etme.

MOVSX and MOVZX are special versions of the mov instruction that perform sign extension or zero extension from the source to the destination. Bu, kaynağın ve hedefin farklı boyutlarda olmasını sağlayan tek yönergedir. (Ve aslında, bunlar farklı boyutlarda olmalıdır.

Yığın Düzenleme

The stack is pointed to by the esp register. The value at esp is the top of the stack (most recently pushed, first to be popped); older stack elements reside at higher addresses.

PUSH

r/m/#n

Değeri yığına gönderme.

POP

r/m

Yığından pop değeri.

PUSHFD

Yığına bayraklar gönderme.

POPFD

Yığından bayrakları pop.

PUSHAD

Tüm tamsayı yazmaçlarını gönder.

POPAD

Tüm tamsayı yazmaçlarını açar.

ENTER

#n, #n

Yapı yığını çerçevesi.

*

LEAVE

Yığın çerçevesini yırtın

The C/C++ compiler does not use the enter instruction. (The enter instruction is used to implement nested procedures in languages like Algol or Pascal.)

The leave instruction is equivalent to:

mov esp, ebp
pop ebp

Veri Dönüştürme

CBW

Convert byte (al) to word (ax).

CWD

Convert word (ax) to dword (dx:ax).

CWDE

Convert word (ax) to dword (eax).

CDQ

convert dword (eax) to qword (edx:eax).

Tüm dönüştürmeler işaret uzantısı gerçekleştirir.

Aritmetik ve Bit İşleme

Tüm aritmetik ve bit işleme yönergeleri bayrakları değiştirir.

Aritmetik

ADD

r1/m, r2/m/#n

r1/m += r2/m/#n

ADC

r1/m, r2/m/#n

r1/m += r2/m/#n + carry

SUB

r1/m, r2/m/#n

r1/m -= r2/m/#n

SBB

r1/m, r2/m/#n

r1/m -= r2/m/#n + carry

NEG

r1/m

r1/m = -r1/m

INC

r/m

r/m += 1

DEC

r/m

r/m -= 1

CMP

r1/m, r2/m/#n

Compute r1/m - r2/m/#n

The cmp instruction computes the subtraction and sets flags according to the result, but throws the result away. It is typically followed by a conditional jump instruction that tests the result of the subtraction.

MUL

r/m8

ax = al * r/m8

MUL

r/m16

dx:ax = ax * r/m16

MUL

r/m32

edx:eax = eax * r/m32

IMUL

r/m8

ax = al * r/m8

IMUL

r/m16

dx:ax = ax * r/m16

IMUL

r/m32

edx:eax = eax * r/m32

IMUL

r1, r2/m

r1 *= r2/m

IMUL

r1, r2/m, #n

r1 = r2/m * #n

İmzasız ve imzalı çarpma. Çarpmadan sonraki bayrakların durumu tanımsız.

DIV

r/m8

(ah, al) = (ax % r/m8, ax / r/m8)

DIV

r/m16

(dx, ax) = dx:ax / r/m16

DIV

r/m32

(edx, eax) = edx:eax / r/m32

IDIV

r/m8

(ah, al) = ax / r/m8

IDIV

r/m16

(dx, ax) = dx:ax / r/m16

IDIV

r/m32

(edx, eax) = edx:eax / r/m32

İmzasız ve imzalı bölüm. Sahte kod açıklamasındaki ilk yazmaç kalan kısmı, ikincisi ise bölüm alır. Sonuç hedefin taşması durumunda bir bölme taşması özel durumu oluşturulur.

Bölmeden sonraki bayrakların durumu tanımlanmamıştır.

*

SETcc

r/m8

Set r/m8 to 0 or 1

If the condition cc is true, then the 8-bit value is set to 1. Aksi takdirde, 8 bit değer sıfır olarak ayarlanır.

İkili kodlu Ondalık

COBOL ile yazılmış kodda hata ayıklamadığınız sürece bu yönergeleri görmezsiniz.

DAA

Toplamadan sonra ondalık ayarlama.

DAS

Çıkarmadan sonra ondalık ayarlama.

These instructions adjust the al register after performing a packed binary-coded decimal operation.

AAA

ASCII, eklemeden sonra ayarlanır.

AAS

Çıkarmadan sonra ASCII ayarı.

These instructions adjust the al register after performing an unpacked binary-coded decimal operation.

AAM

Çarpmadan sonra ASCII ayarı.

AAD

Bölmeden sonra ASCII ayarı.

These instructions adjust the al and ah registers after performing an unpacked binary-coded decimal operation.

Bit

AND

r1/m, r2/m/#n

r1/m = r1/m and r2/m/#n

OR

r1/m, r2/m/#n

r1/m = r1/m or r2/m/#n

XOR

r1/m, r2/m/#n

r1/m = r1/m xor r2/m/#n

NOT

r1/m

r1/m = bitwise not r1/m

*

TEST

r1/m, r2/m/#n

Compute r1/m and r2/m/#n

The test instruction computes the logical AND operator and sets flags according to the result, but throws the result away. Genellikle mantıksal AND sonucunu test eden bir koşullu atlama yönergesi izler.

SHL

r1/m, cl/#n

r1/m <<= cl/#n

SHR

r1/m, cl/#n

r1/m >>= cl/#n zero-fill

*

SAR

r1/m, cl/#n

r1/m >>= cl/#n sign-fill

Dışarı kaydırılan son bit taşımaya yerleştirilir.

SHLD

r1, r2/m, cl/#n

Sola çift kaydır.

Shift r1 left by cl/#n, filling with the top bits of r2/m. Dışarı kaydırılan son bit taşımaya yerleştirilir.

SHRD

r1, r2/m, cl/#n

Sağa çift kaydırma.

Shift r1 right by cl/#n, filling with the bottom bits of r2/m. Dışarı kaydırılan son bit taşımaya yerleştirilir.

ROL

r1, cl/#n

Rotate r1 left by cl/#n.

ROR

r1, cl/#n

Rotate r1 right by cl/#n.

RCL

r1, cl/#n

Rotate r1/C left by cl/#n.

RCR

r1, cl/#n

Rotate r1/C right by cl/#n.

Döndürme, kaydırmaya benzer, ancak dışarı kaydırılan bitler gelen doldurma bitleri olarak yeniden görünür. Döndürme yönergelerinin C dili sürümü taşıma bitini döndürmeye ekler.

BT

r1, r2/#n

Copy bit r2/#n of r1 into carry.

BTS

r1, r2/#n

Set bit r2/#n of r1, copy previous value into carry.

BTC

r1, r2/#n

Clear bit r2/#n of r1, copy previous value into carry.

Denetim Akışı

Jcc

dest

Branch conditional.

JMP

dest

Jump direct.

JMP

r/m

Jump indirect.

CALL

dest

Call direct.

*

CALL

r/m

Call indirect.

The call instruction pushes the return address onto the stack then jumps to the destination.

*

RET

#n

Return

The ret instruction pops and jumps to the return address on the stack. A nonzero #n in the RET instruction indicates that after popping the return address, the value #n should be added to the stack pointer.

LOOP

Decrement ecx and jump if result is nonzero.

LOOPZ

Decrement ecx and jump if result is nonzero and zr was set.

LOOPNZ

Decrement ecx and jump if result is nonzero and zr was clear.

JECXZ

Jump if ecx is zero.

Bu yönergeler x86'nın CISC mirasının kalıntılarıdır ve son işlemcilerde aslında uzun yol boyunca yazılan eşdeğer yönergelerden daha yavaştır.

Dize Düzenleme

MOVST

Move T from esi to edi.

CMPST

Compare T from esi with edi.

SCAST

Scan T from edi for accT.

LODST

Load T from esi into accT.

STOST

Store T to edi from accT.

After performing the operation, the source and destination register are incremented or decremented by sizeof(T), according to the setting of the direction flag (up or down).

The instruction can be prefixed by REP to repeat the operation the number of times specified by the ecx register.

The rep mov instruction is used to copy blocks of memory.

The rep stos instruction is used to fill a block of memory with accT.

Bayrak

LAHF

Load ah from flags.

SAHF

Store ah to flags.

STC

Set carry.

CLC

Clear carry.

CMC

Complement carry.

STD

Set direction to down.

CLD

Set direction to up.

STI

Enable interrupts.

CLI

Disable interrupts.

Kilitlenmiş Yönergeler

XCHG

r1, r/m

Swap r1 and r/m.

XADD

r1, r/m

Add r1 to r/m, put original value in r1.

CMPXCHG

r1, r/m

Koşullu karşılaştırma ve değiştirme.

The cmpxchg instruction is the atomic version of the following:

   cmp     accT, r/m
   jz      match
   mov     accT, r/m
   jmp     done
match:
   mov     r/m, r1
done:

Çeşitli

INT

#n

Çekerek çekerek yakalama.

BOUND

r, m

Trap if r not in range.

*

NOP

No operation.

XLATB

al = [ebx + al]

BSWAP

r

Kayıtta bayt sırasını değiştirin.

Here is a special case of the int instruction.

INT

3

Hata ayıklayıcısı kesme noktası yakalaması.

The opcode for INT 3 is 0xCC. The opcode for NOP is 0x90.

Kodda hata ayıklarken bazı kodlara düzeltme eki uygulamanız gerekebilir. Bunu, sorunlu baytları 0x90 ile değiştirerek yapabilirsiniz.

Deyim

XOR

r, r

r = 0

TEST

r, r

Check if r = 0.

*

ADD

r, r

Shift r left by 1.