BAYRAKLAR kaydı - FLAGS register

BAYRAKLAR kayıt olan durum yazmacı bir mevcut durumunu içeren CPU . Bayrak bitlerinin boyutu ve anlamları mimariye bağlıdır. Genellikle aritmetik işlemlerin sonucunu ve mevcut zamanda CPU işlemine getirilen kısıtlamalar hakkındaki bilgileri yansıtır. Bu kısıtlamalardan bazıları, bazı kesintilerin tetiklenmesini önlemeyi, bir "ayrıcalıklı" komutlar sınıfının yürütülmesini yasaklamayı içerebilir. Ek durum bayrakları, bellek eşlemesini atlayabilir ve CPU'nun aritmetik taşma durumunda hangi eylemi gerçekleştirmesi gerektiğini tanımlayabilir.

Taşıma, eşlik, ayarlama, sıfır ve işaret bayrakları birçok mimariye dahil edilmiştir. Ayar bayrağı, 8080'de yardımcı taşıma biti ve Zilog Z80 mimarisinde yarım taşıma biti olarak adlandırılırdı .

Gelen i386 mimarisi kayıt olan 16 bit genişliğinde. Ardılları olan EFLAGS ve RFLAGS kayıtları sırasıyla 32 bit ve 64 bit genişliğindedir. Daha geniş kayıtlar, daha küçük öncülleriyle uyumluluğu korur.


BAYRAKLAR

Intel x86 BAYRAKLARI kaydı
Biraz # maske Kısaltma Açıklama Kategori =1 =0
BAYRAKLAR
0 0x0001 CF Bayrak taşımak Durum CY(Taşıma) NC (Taşıma Yok)
1 0x0002 Ayrılmış, her zaman EFLAGS'ta 1  
2 0x0004 PF parite bayrağı Durum PE(Eşit Parite) PO (Parite Tek)
3 0x0008 Rezerve  
4 0x0010 AF Bayrağı ayarla Durum AC (Yardımcı Taşıma) NA(Yardımcı Taşıma Yok)
5 0x0020 Rezerve  
6 0x0040 ZF sıfır bayrak Durum ZR(Sıfır) Yeni Zelanda (Sıfır Değil)
7 0x0080 bilimkurgu İşaret bayrağı Durum NG(Negatif) PL(Pozitif)
8 0x0100 TF Tuzak bayrağı (tek adım) Kontrol
9 0x0200 EĞER Etkinleştirme bayrağını kes Kontrol EI (Kesmeyi Etkinleştir) DI (Kesmeyi Devre Dışı Bırak)
10 0x0400 DF yön bayrağı Kontrol DN(Aşağı) Yukarı yukarı)
11 0x0800 İLE İLGİLİ taşma bayrağı Durum OV(Taşma) NV (Taşma Değil)
12-13 0x3000 IOPL G/Ç ayrıcalık düzeyi (yalnızca 286+),
8086 ve 186'da her zaman 1
sistem
14 0x4000 NT İç içe görev bayrağı (yalnızca 286+),
8086 ve 186'da her zaman 1
sistem
15 0x8000 Ayrılmış,
her zaman 8086 ve 186'da
1, sonraki modellerde her zaman 0
 
EFLALER
16 0x0001 0000 RF Devam bayrağı (yalnızca 386+) sistem
17 0x0002 0000 sanal makine Sanal 8086 mod bayrağı (yalnızca 386+) sistem
18 0x0004 0000 AC Hizalama kontrolü (yalnızca 486SX+) sistem
19 0x0008 0000 VIF Sanal kesme bayrağı (Pentium+) sistem
20 0x0010 0000 vip Sanal kesme beklemede (Pentium+) sistem
21 0x0020 0000 İD CPUID talimatını kullanabilme (Pentium+) sistem
22‑31 0xFFC0 0000 Rezerve sistem
RFLA'LAR
32‑63 0xFFFF FFFF…
…0000 0000
Rezerve  

Not: Tablodaki maske sütunu, FLAGS kayıt değeri içindeki bayrakları sorgulamak için AND bit maskesidir ( onaltılık değer olarak).

kullanım

Tüm FLAGS kayıtları , bir makine dili talimatının sonuçlarının başka bir talimatı etkilemesine izin veren durum kodlarını , bayrak bitlerini içerir . Aritmetik ve mantıksal komutlar, bayrakların bir kısmını veya tamamını ayarlar ve koşullu atlama komutları, belirli bayrakların değerine göre değişken eylemler gerçekleştirir. Örneğin, (Sıfırsa Atla), (Taşıırsa Atla) ve (Taşma Varsa Atla) belirli bayraklara bağlıdır. Diğer koşullu atlamalar, birkaç bayrağın kombinasyonlarını test eder. jzjcjo

FLAGS kayıtları yığından veya yığına taşınabilir. Bu, kayıtlardaki değişiklikleri çağıran kod tarafından görülmemesi gereken bir kesme hizmeti rutini gibi bir rutine karşı CPU bağlamını kaydetme ve geri yükleme işinin bir parçasıdır. İşte ilgili talimatlar:

  • PUSHF ve POPF komutları, 16 bitlik FLAGS kaydını aktarır.
  • PUSHFD/POPFD ( i386 mimarisiyle tanıtıldı ) 32 bitlik çift kayıt EFLAGS'ı aktarır.
  • PUSHFQ/POPFQ ( x64 mimarisiyle tanıtıldı ) 64 bitlik dört kelimelik kayıt RFLAGS'ını aktarır.

64 bit modunda, PUSHF/POPF ve PUSHFQ/POPFQ mevcuttur, ancak PUSHFD/POPFD yoktur.

FLAGS kaydının alt 8 biti de SAHF ve LAHF tarafından doğrudan yükleme/depolama manipülasyonuna açıktır (AH'yi bayraklara yükleyin/depolayın).

Örnek

FLAGS kayıtlarını itme ve patlatma yeteneği, bir programın BAYRAKLARdaki bilgileri makine dili talimatlarının olmadığı şekillerde manipüle etmesine izin verir. Örneğin, cldve stdyönergeleri sırasıyla yön bayrağını (DF) temizler ve ayarlar; ancak DF'yi tamamlayacak bir talimat yoktur. Bu, aşağıdaki montaj kodu ile başarılabilir :

pushf          ; Use the stack to transfer the FLAGS
pop   ax       ; ...into the AX register
push  ax       ; and copy them back onto the stack for storage
xor   ax, 400h ; Toggle (complement) DF only; other bits are unchanged
push  ax       ; Use the stack again to move the modified value
popf           ; ...into the FLAGS register
; Insert here the code that required the DF flag to be complemented
popf          ; Restore the original value of the FLAGS

Bir program, FLAGS kaydını manipüle ederek kurulu işlemcinin modelini belirleyebilir. Örneğin, hizalama bayrağı yalnızca 486 ve üzerinde değiştirilebilir. Program bu bayrağı değiştirmeye çalışırsa ve değişikliğin devam etmediğini algılarsa, işlemci 486'dan daha eskidir.

Intel Pentium'dan başlayarak , CPUID talimatı işlemci modelini bildirir. Bununla birlikte, yukarıdaki yöntem, önceki modeller arasında ayrım yapmak için faydalı olmaya devam etmektedir.

Ayrıca bakınız

Referanslar