Aracılığıyla paylaş


x86 Mimarisi

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şlemcisini32 bit düz modda kullanır. Bu belge yalnızca düz moda odaklanacaktır.

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, kullanmanız gerekir? yerine ? ax. Bu, hata ayıklayıcının ax bir simge yerine bir kayıt olarak tanımasını sağlar.

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 kodlarbayraklardır. Bunlar tek bit yazmaçlardır ve çeşitli kullanımlara sahiptir.

Aşağıdaki tabloda x86 bayrakları listelenir:

Bayrak Kodu Bayrak Adı Değer Bayrak Durumu Açıklama
'in 'i 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, r (Yazmaçlar) komutunu kullanarak bir bayrağı değiştirmek istiyorsanız,bayrak koduyla buna başvurmanız gerekir.

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]biçimindedir; burada T bazı veri türleridir (önceki Veri Türleri bölümüne bakın) ve ifade sabitleri ve kayıtları içeren bazı ifadelerdir.

Çoğu modun gösterimi kolayca çıkarılabilir. Örneğin, BYTE PTR [esi+edx*8+3] "esi yazmacı değerini alın, edx yazmacı nın değerinin sekiz katı ekleyin, üç ekleyin ve ardından sonuçta elde edilen adreste bayta erişin" anlamına gelir.

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:

  1. 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.

  2. 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.

Ayrıca bkz.

x64 Mimarisi

X86-64 Vikipedi