Meclis - Kayıtlar
İşlemci işlemleri çoğunlukla verilerin işlenmesini içerir. Bu veriler hafızada saklanabilir ve buradan erişilebilir. Bununla birlikte, verilerin bellekten okunması ve belleğe depolanması, veri talebinin kontrol veriyolu üzerinden ve bellek depolama birimine gönderilmesi ve verilerin aynı kanaldan alınması gibi karmaşık süreçleri içerdiğinden işlemciyi yavaşlatır.
İşlemci işlemlerini hızlandırmak için işlemci, adı verilen bazı dahili bellek depolama konumları içerir. registers.
Kayıtlar, belleğe erişmek zorunda kalmadan işlenmek üzere veri öğelerini depolar. İşlemci yongasında sınırlı sayıda yazmaç bulunur.
İşlemci Kayıtları
IA-32 mimarisinde on adet 32-bit ve altı adet 16-bit işlemci kaydı vardır. Kayıtlar üç kategoriye ayrılmıştır -
- Genel kayıtlar,
- Kontrol kayıtları ve
- Segment kayıtları.
Genel kayıtlar ayrıca aşağıdaki gruplara ayrılmıştır -
- Veri kayıtları,
- İşaretçi kayıtları ve
- Dizin kayıtları.
Veri Kayıtları
Aritmetik, mantıksal ve diğer işlemler için dört adet 32 bit veri kaydı kullanılır. Bu 32 bitlik yazmaçlar üç şekilde kullanılabilir -
Tam 32 bit veri kayıtları olarak: EAX, EBX, ECX, EDX.
32 bitlik kayıtların alt yarısı, dört 16 bitlik veri kaydı olarak kullanılabilir: AX, BX, CX ve DX.
Yukarıda bahsedilen dört 16-bitlik yazmaçların alt ve üst yarıları sekiz 8-bit veri yazmaçları olarak kullanılabilir: AH, AL, BH, BL, CH, CL, DH ve DL.
Bu veri kayıtlarından bazıları aritmetik işlemlerde özel kullanıma sahiptir.
AX is the primary accumulator; giriş / çıkışta ve çoğu aritmetik komutta kullanılır. Örneğin, çarpma işleminde, bir işlenen, işlenenin boyutuna göre EAX veya AX veya AL yazmacında saklanır.
BX is known as the base register, endeksli adreslemede kullanılabileceği için.
CX is known as the count registerECX olarak, CX kayıtları döngü sayısını yinelemeli işlemlerde depolar.
DX is known as the data register. Ayrıca giriş / çıkış işlemlerinde de kullanılır. Ayrıca, büyük değerler içeren çarpma ve bölme işlemleri için DX ile birlikte AX yazmacıyla birlikte kullanılır.
İşaretçi Kayıtları
İşaretçi kayıtları, 32 bitlik EIP, ESP ve EBP kayıtları ve bunlara karşılık gelen 16 bitlik sağ kısımlar IP, SP ve BP'dir. İşaretçi kayıtlarının üç kategorisi vardır -
Instruction Pointer (IP)- 16 bitlik IP kaydı, yürütülecek sonraki komutun ofset adresini saklar. CS kaydı ile ilişkili IP (CS: IP olarak), kod segmentindeki mevcut talimatın tam adresini verir.
Stack Pointer (SP)- 16 bitlik SP kaydı, program yığını içinde ofset değerini sağlar. SS yazmacı (SS: SP) ile ilişkili SP, program yığını içindeki verilerin veya adresin mevcut konumunu ifade eder.
Base Pointer (BP)- 16 bitlik BP kaydı, esas olarak bir alt yordama geçirilen parametre değişkenlerinin referans alınmasına yardımcı olur. SS yazmacındaki adres, parametrenin konumunu elde etmek için BP'deki ofset ile birleştirilir. BP ayrıca özel adresleme için temel kayıt olarak DI ve SI ile birleştirilebilir.
Dizin Kayıtları
32 bitlik dizin kayıtları, ESI ve EDI ve bunların 16 bitlik en sağdaki bölümleri. SI ve DI, indeksli adresleme için kullanılır ve bazen toplama ve çıkarma işlemlerinde kullanılır. İki dizi dizin işaretçisi vardır -
Source Index (SI) - String işlemleri için kaynak indeks olarak kullanılır.
Destination Index (DI) - String işlemleri için hedef indeks olarak kullanılır.
Kontrol Kayıtları
32-bitlik talimat işaretçisi yazmacı ve 32-bit bayrak yazmacı birleştirilen kontrol kayıtları olarak kabul edilir.
Çoğu talimat, karşılaştırmaları ve matematiksel hesaplamaları içerir ve bayrakların durumunu değiştirir ve diğer bazı koşullu talimatlar, kontrol akışını başka bir konuma götürmek için bu durum bayraklarının değerini test eder.
Ortak bayrak bitleri şunlardır:
Overflow Flag (OF) - İmzalı bir aritmetik işlemden sonra yüksek dereceli bir veri bitinin (en soldaki bit) taşmasını gösterir.
Direction Flag (DF)- Dizi verilerini taşımak veya karşılaştırmak için sol veya sağ yönü belirler. DF değeri 0 olduğunda, dizi işlemi soldan sağa ve değer 1 olarak ayarlandığında, dizi işlemi sağdan sola doğru olur.
Interrupt Flag (IF)- Klavye girişi vb. Gibi harici kesintilerin yok sayılacağını veya işleneceğini belirler. Değer 0 olduğunda harici kesmeyi devre dışı bırakır ve 1'e ayarlandığında kesmeleri etkinleştirir.
Trap Flag (TF)- İşlemcinin çalışmasını tek adım modunda ayarlamaya izin verir. Kullandığımız DEBUG programı, tuzak bayrağını ayarlar, böylece her seferinde bir komut yürütme aşamasına geçebiliriz.
Sign Flag (SF)- Bir aritmetik işlemin sonucunun işaretini gösterir. Bu bayrak, aritmetik işlemin ardından bir veri öğesinin işaretine göre ayarlanır. İşaret, en soldaki bitin yüksek sırasıyla gösterilir. Pozitif bir sonuç, SF'nin değerini 0'a temizler ve negatif sonuç onu 1'e ayarlar.
Zero Flag (ZF)- Bir aritmetik veya karşılaştırma işleminin sonucunu gösterir. Sıfır olmayan bir sonuç, sıfır bayrağını 0 olarak temizler ve sıfır sonuç onu 1 olarak ayarlar.
Auxiliary Carry Flag (AF)- Bir aritmetik işlemin ardından bit 3'ten bit 4'e taşımayı içerir; özel aritmetik için kullanılır. AF, 1 baytlık bir aritmetik işlem, bit 3'ten bit 4'e taşınmaya neden olduğunda ayarlanır.
Parity Flag (PF)- Bir aritmetik işlemden elde edilen sonuçtaki toplam 1 bit sayısını gösterir. 1 bitlik çift sayı, eşlik bayrağını 0'a, tek sayıdaki 1 bitlik eşlik bayrağını 1'e ayarlar.
Carry Flag (CF)- Bir aritmetik işlemden sonra yüksek dereceli bir bitten (en soldaki) 0 veya 1'in taşınmasını içerir. Ayrıca, bir kaydırma veya döndürme işleminin son bitinin içeriğini de depolar .
Aşağıdaki tablo, 16 bitlik Flags kaydındaki bayrak bitlerinin konumunu gösterir:
Bayrak: | Ö | D | ben | T | S | Z | Bir | P | C | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit hayır: | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Segment Kayıtları
Segmentler, veri, kod ve yığını içermek için bir programda tanımlanan belirli alanlardır. Üç ana bölüm vardır -
Code Segment- Yürütülecek tüm talimatları içerir. 16 bitlik bir Kod Segment kaydı veya CS kaydı, kod segmentinin başlangıç adresini depolar.
Data Segment- Veri, sabitler ve çalışma alanlarını içerir. 16 bitlik Veri Segment kaydı veya DS kaydı, veri segmentinin başlangıç adresini depolar.
Stack Segment- Prosedürlerin veya alt rutinlerin verilerini ve dönüş adreslerini içerir. Bir 'yığın' veri yapısı olarak uygulanır. Yığın Segment kaydı veya SS kaydı, yığının başlangıç adresini saklar.
DS, CS ve SS yazmaçlarının yanı sıra, verilerin depolanması için ek bölümler sağlayan ES (ekstra bölüm), FS ve GS gibi başka ekstra bölüm kayıtları da vardır.
Montaj programlamasında, bir programın bellek konumlarına erişmesi gerekir. Bir segment içindeki tüm hafıza konumları, segmentin başlangıç adresine göredir. Bir bölüm, 16 ya da onaltılık 10 ile eşit olarak bölünebilen bir adreste başlar. Dolayısıyla, bu tür tüm bellek adreslerinde en sağdaki onaltılık basamak O'dır ve bu genellikle bölüm kayıtlarında depolanmaz.
Segment kayıtları, bir segmentin başlangıç adreslerini saklar. Bir segment içindeki verilerin veya talimatın tam konumunu elde etmek için bir ofset değeri (veya yer değiştirme) gereklidir. Bir bölümdeki herhangi bir bellek konumuna referans vermek için, işlemci bölüm yazmacındaki bölüm adresini konumun ofset değeri ile birleştirir.
Misal
Montaj programlamasında yazmaçların kullanımını anlamak için aşağıdaki basit programa bakın. Bu program, basit bir mesajla birlikte ekranda 9 yıldız görüntüler -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Displaying 9 stars
*********