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.
Intel x86 işlemci karmaşık yönerge kümesi bilgisayar (CISC) mimarisini kullanır, yani büyük miktarlarda genel amaçlı yazmaçlar yerine mütevazı sayıda özel amaçlı yazmaç vardır. Ayrıca karmaşık özel amaçlı yönergelerin baskın olacağı anlamına gelir.
x86 işlemcisinin kökeni, en az 8-bit Intel 8080 işlemcisine kadar uzanır. x86 yönerge kümesindeki birçok özellik, bu işlemciyle (ve Zilog Z-80 değişkeniyle) geriye dönük uyumluluk nedeniyledir.
Microsoft Win32, x86 işlemcisini
Kayıtlar
x86 mimarisi aşağıdaki ayrıcalıksız tamsayı kayıtlarından oluşur.
eax |
Akümülatör |
ebx |
Taban yazmaç |
ecx |
Sayaç yazmaç |
edx |
Veri kaydı - G/Ç bağlantı noktası erişimi ve aritmetik işlevler için kullanılabilir |
esi |
Kaynak dizin kaydı |
edi |
Hedef dizin kaydedici |
ebp |
Temel işaretçi yazmaç |
esp |
Yığın işaretçisi |
Tüm tamsayı yazmaçları 32 bittir. Ancak, bunların çoğunun 16 bit veya 8 bit alt kayıt kümeleri vardır.
ax |
Düşük 16 bit eax |
bx |
Düşük 16 bit ebx |
cx |
Düşük 16 bit ecx |
dx |
Düşük 16 bit edx |
si |
Düşük 16 bit esi |
di |
Düşük 16 bit edi |
bp |
Düşük 16 bit ebp |
sp |
Düşük 16 bit esp |
al |
Düşük 8 bit eax |
ah |
Yüksek 8 bit ax |
bl |
Düşük 8 bit ebx |
bh |
'ın yüksek 8 biti bx |
cl |
Düşük 8 bit ecx |
ch |
Yüksek 8 bit cx |
dl |
Düşük 8 bit edx |
dh |
Yüksek 8 bit dx |
Bir alt kayıt üzerinde çalışma yalnızca alt kaydı etkiler ve alt kayıt dışındaki bölümlerin hiçbirini etkilemez. Örneğin, ax yazmaçta depolamak, eax yazmaçlarının yüksek 16 bitini değişmeden bırakır.
kullanırken (İfadeyi Değerlendir) komutu, kaydedicilere başlangıçta "at" işareti (@) eklenmelidir. Örneğin,
Ancak, r (Yazmaçlar) komutunda (@) gerekli değildir. Örneğin, r ax=5 her zaman doğru yorumlanır.
İşlemcinin mevcut durumu için diğer iki yazmaç önemlidir.
eip |
yönerge işaretçisi |
bayrakları |
Bayrak |
Yönerge işaretçisi yürütülmekte olan yönergenin adresidir.
Flags register, tek bit bayraklardan oluşan bir koleksiyondur. Birçok yönerge, yönergenin sonucunu açıklamak için bayrakları değiştirir. Bu bayraklar daha sonra koşullu atlama yönergeleriyle test edilebilir. Ayrıntılar için bkz. x86 Bayraklar.
Çağırma Kuralları
x86 mimarisinin birkaç farklı çağrı kuralı vardır. Neyse ki hepsi aynı kayıt koruma ve işlev iade kurallarına uyar:
İşlevler, işlev çağrısı sırasında değiştirilebilen eax, ecxve edxyazmaçları hariç, tüm yazmaçları korumalıdır. Ayrıca, esp, çağrı kuralına göre mutlaka güncellenmelidir.
eax yazmaç, sonuç 32 bit veya daha küçükse işlev dönüş değerlerini alır. Sonuç 64 bit ise, sonuç edx:eax çiftinde depolanır.
x86 mimarisinde kullanılan çağrı kurallarının listesi aşağıdadır:
Win32 (__stdcall)
İşlev parametreleri yığına sağdan sola olacak şekilde gönderilir ve çağrılan yığını temizler.
Yerel C++ yöntem çağrısı (thiscall olarak da bilinir)
İşlev parametreleri yığına geçirilir, sağdan sola gönderilir, "bu" işaretçisi ecx yazmaçta geçirilir ve çağıran yığını temizler.
COM ( C++ yöntem çağrıları için__stdcall)
İşlev parametreleri yığına geçirilir, sağdan sola gönderilir, ardından "bu" işaretçisi yığına gönderilir ve işlev çağrılır. Çağıran, yığını temizler.
__fastcall
İlk iki DWORD veya daha küçük bağımsız değişken, ecx ve edx yazmaçlarında geçirilir. Kalan parametreler yığında yerleştirilir ve sağdan sola itilir. Çağıran, yığını temizler.
__cdecl
İşlev parametreleri yığına geçirilir, sağdan sola gönderilir ve çağıran yığını temizler. __cdecl çağırma kuralı, değişken uzunluklu parametreleri olan tüm işlevler için kullanılır.
Yazmaçların ve Bayrakların Hata Ayıklayıcıda Gösterimi
Örnek bir hata ayıklayıcısı kayıt görüntüsü aşağıda verilmiştir:
eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000
eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0 nv up ei ng nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000286
Kullanıcı modunda hata ayıklama sürecinde, iopl ve hata ayıklayıcı ekran çıktısının son satırının tamamını yoksayabilirsiniz.
x86 Bayrakları
Yukarıdaki örnekte, ikinci satırın sonundaki iki harfli kodlar
Aşağıdaki tabloda x86 bayrakları listelenir:
| Bayrak Kodu | Bayrak Adı | Değer | Bayrak Durumu | Açıklama |
|---|---|---|---|---|
| 'in |
Taşma Bayrağı | 0 1 | nvov | Taşma Yok - Taşma Var |
| df | Yön Bayrağı | 0 1 | updn | Yukarı yön - Aşağı yön |
| ise |
Kesme Bayrağı | 0 1 | diei | Kesintiler devre dışı - Kesintiler etkin |
| sf | İşaret Bayrağı | 0 1 | plng | Pozitif (veya sıfır) - Negatif |
| zf | Sıfır Bayrağı | 0 1 | nzzr | Sıfır Olmayan - Sıfır |
| af | Yardımcı Taşıma Bayrağı | 0 1 | naac | Yardımcı taşıma yok - Yardımcı taşıma |
| pf | Eşlik Bayrağı | 0 1 | pepo | Parite tek - Parite çift |
| cf | Taşıma Bayrağı | 0 1 | nccy | Taşımadan - Taşıma |
| tf | Yakalama Bayrağı | tf 1'e eşitse, işlemci bir yönergenin yürütülmesinden sonra STATUS_SINGLE_STEP bir özel durum oluşturur. Bu bayrak bir hata ayıklayıcı tarafından tek adımlı izleme uygulamak için kullanılır. Diğer uygulamalar tarafından kullanılmamalıdır. | ||
| iopl | Girdi/Çıktı Ayrıcalık Düzeyi | G/Ç Ayrıcalık Düzeyi Bu, sıfır ile 3 arasında değerler içeren iki bitlik bir tamsayıdır. İşletim sistemi tarafından donanıma erişimi denetlemek için kullanılır. Uygulamalar tarafından kullanılmamalıdır. |
Hata Ayıklayıcı Komut penceresinde bazı komutların sonucu olarak yazmaçlar görüntülendiğinde, görüntülenen bayrak durumu'dir. Ancak,
WinDbg'nin Yazmaçlar penceresinde bayrak kodu bayrakları görüntülemek veya değiştirmek için kullanılır. Bayrak durumu desteklenmiyor.
Aşağıda bir örnek verilmiştir. Önceki kayıt ekranında ng bayrak durumu görünür. Bu, işaret bayrağının şu anda 1 olarak ayarlandığı anlamına gelir. Bunu değiştirmek için aşağıdaki komutu kullanın:
r sf=0
Bu, işaret bayrağını sıfır olarak ayarlar. Başka bir kayıt görüntüleme yaparsanız, ng durum kodu görünmez. Bunun yerine, pl durum kodu görüntülenir.
İşaret Bayrağı, Sıfır Bayrağı ve Taşıma Bayrağı en yaygın kullanılan bayraklardır.
Koşul -ları
koşulu bir veya daha fazla bayrağın durumunu açıklar. x86 üzerindeki tüm koşullu işlemler koşullar açısından ifade edilir.
Derleyici, bir koşulu temsil etmek için bir veya iki harfli kısaltma kullanır. Bir koşul birden çok kısaltmayla temsil edilebilir. Örneğin, AE ("yukarıdaki veya eşit") NB ile aynı koşuldur ("aşağıda değildir"). Aşağıdaki tabloda bazı yaygın koşullar ve bunların anlamı listelenmiştir.
| Koşul Adı | Bayrak | Anlam |
|---|---|---|
Z |
ZF=1 |
Son işlemin sonucu sıfırdı. |
NZ |
ZF=0 |
Son işlemin sonucu sıfır değildi. |
C |
CF=1 |
Son işlem için taşıma veya ödünç alma gerekiyordu. (İşaretsiz tamsayılar için bu, taşma durumunu gösterir.) |
NC |
CF=0 |
Son işlem taşıma veya ödünç alma gerektirmezdi. (İşaretsiz tamsayılar için bu, taşma durumunu gösterir.) |
S |
SF=1 |
Son işlemin sonucu yüksek bit kümesine sahip. |
NS |
SF=0 |
Son işlemin sonucu yüksek bit netliğindedir. |
O |
OF=1 |
İmzalı bir tamsayı işlem olarak değerlendirildiğinde, son işlem taşma veya eksilmeye neden oldu. |
HAYIR |
OF=0 |
İmzalı tamsayı işlemi olarak işlendiğinde, son işlem taşmaya ya da eksilmeye neden olmadı. |
Koşullar, iki değeri karşılaştırmak için de kullanılabilir. cmp yönergesi iki işleneni karşılaştırır ve bir işleneni diğerinden çıkarmış gibi bayrakları ayarlar. Aşağıdaki koşullar, cmpdeğeri1, değeri2 nin sonucunukontrol etmek için kullanılabilir.
| Koşul Adı | Bayrak | CMP işlemi sonrasındaki anlam. |
|---|---|---|
E |
ZF=1 |
değer1 == değer2. |
NE |
ZF=0 |
değer1 != değer2. |
| GE NL | SF=OF |
değer1>= değer2. Değerler, imzalı tamsayılar olarak değerlendirilir. |
| LE NG | ZF=1 veya SF!=OF |
değer1<= değer2. Değerler, imzalı tamsayılar olarak değerlendirilir. |
| G NLE | ZF=0 ve SF=OF |
değer1>değer2. Değerler, imzalı tamsayılar olarak değerlendirilir. |
| L NGE | SF!=OF |
değer1<değer2. Değerler, imzalı tamsayılar olarak değerlendirilir. |
| AE NB | CF=0 |
değer1>= değer2. Değerler işaretsiz tamsayılar olarak kabul edilir. |
| BE NA | CF=1 veya ZF=1 |
değer1<= değer2. Değerler işaretsiz tamsayılar olarak kabul edilir. |
| A NBE | CF=0 ve ZF=0 |
değer1>değer2. Değerler işaretsiz tamsayılar olarak kabul edilir. |
| B NAE | CF=1 |
değer1<değer2. Değerler işaretsiz tamsayılar olarak kabul edilir. |
Koşullar genellikle cmp veya test yönergesinin sonucu üzerinde işlem yapmak için kullanılır. Mesela
cmp eax, 5
jz equal
eax kaydını 5 sayısıyla karşılaştırır; bu, ifadesi (eax - 5) hesaplanarak yapılır ve sonuca göre bayraklar ayarlanır. Çıkarmanın sonucu sıfırsa, zr bayrağı ayarlanır ve jz koşulu doğru olur, böylece atlama gerçekleşir.
Veri Türleri
bayt: 8 bit
word: 16 bit
dword: 32 bit
qword: 64 bit (kayan nokta çiftlerini içerir)
tword: 80 bit (kayan nokta genişletilmiş çiftleri içerir)
oword: 128 bit
Notasyon
Aşağıdaki tablo, derleme dili yönergelerini açıklamak için kullanılan gösterimi gösterir.
| Notasyon | Anlam |
|---|---|
r, r1, r2... |
Kayıtlar |
m |
Bellek adresi (Daha fazla bilgi için sonraki Adresleme Modları bölümüne bakın.) |
#n |
Anında sabit |
r/m |
Kaydetme veya bellek |
r/#n |
Kaydetme veya hemen sabit |
r/m/#n |
Kaydetme, bellek veya anında sabit |
cc |
Önceki Koşullar bölümünde listelenen bir koşul kodu. |
T |
"B", "W" veya "D" (bayt, kelime veya çift kelime) |
accT |
Boyut T biriktirici: al, T = "B" ise; ax, T = "W" ise; veya eax, T = "D" ise |
Adresleme Modları
Birkaç farklı adresleme modu vardır, ancak tümü T ptr [expr]
Çoğu modun gösterimi kolayca çıkarılabilir. Örneğin, BYTE PTR [esi+edx*8+3]
Boru hattı işleme
Pentium, çift iş gerçekleştirme kapasitesine sahiptir, yani tek bir saat vuruşunda en fazla iki eylem gerçekleştirebilir. Ancak, aynı anda iki eylem gerçekleştirebilme özelliğine sahip olduğunda (eşleştirmeolarak bilinir) kurallar çok karmaşıktır.
x86 bir CISC işlemcisi olduğundan atlama gecikme yuvaları konusunda endişelenmeniz gerekmez.
Eşitlenmiş Bellek Erişimi
Yükleme, değiştirme ve depolama yönergeleri, yönergeyi aşağıdaki gibi değiştiren bir kilit ön eki alabilir:
Yönergeyi vermeden önce CPU, tutarlılığı sağlamak için bekleyen tüm bellek işlemlerini temizler. Tüm veri önyüklemeleri iptal edilir.
Yönergeyi verirken CPU, veri yolu için özel erişime sahip olur. Bu, yükleme/değiştirme/depolama işleminin bölünmezliğini sağlar.
xchg yönergesi, bellekle bir değer değişiminde önceki kurallara otomatik olarak uyar.
Diğer tüm talimatlar varsayılan olarak kilitleme içermez.
Atlama Tahmini
Koşulsuz atlamaların gerçekleşmesi bekleniyor.
Koşullu atlamaların, son defa yürütüldüklerinde alınıp alınmadığına bağlı olarak alınıp alınmadığı tahmin edilir. Atlama geçmişini kaydetme önbelleğinin boyutu sınırlıdır.
CPU'nun, koşullu atlamanın son kez yürütüldüğünde alınıp alınmadığına ilişkin bir kaydı yoksa, geriye doğru koşullu atlamaları alınmış ve ileriye doğru koşullu atlamaları alınmamış olarak tahmin eder.
Hizalama
x86 işlemci, hizalanmamış bellek erişimini performans kaybı pahasına otomatik olarak düzeltecektir. Hiçbir özel durum oluşmadı.
Adres nesne boyutunun tamsayı katıysa bellek erişimi hizalanmış olarak kabul edilir. Örneğin, tüm BYTE erişimleri hizalanır (her şey 1'in tamsayı katıdır), çift adreslere WORD erişimleri hizalanır ve DWORD adreslerinin hizalanması için 4'ün katı olması gerekir.
kilit ön eki hizalanmamış bellek erişimleri için kullanılmamalıdır.