Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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. |