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.
jz
jc
jo
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, cld
ve std
yö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
- bit alanı
- Kontrol kaydı
- CPU bayrağı (x86)
- Program durum kelimesi
- Durum kaydı
- x86 derleme dili
- x86 talimat listeleri