Murat ERDEM - Personal Research Blog




Assembly Programing - 0x01: Register

August 24, 2020

Bu yazımızda Assembly programlamaya küçük bir giriş yapacak ve assemblyde kullanılan registerler hakkında biraz bilgi edineceğiz.

Assemblyde unutulmaması gereken en önemli nokta her şeyin 1 ve 0 lardan oluştuğu ve programlama yaparken her şeyi binary sisteme göre düşünmek gerektiğidir.

Asemmbly de temel olarak EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, EIP, CS, DS, SS, ES, FS, GS ve EFLAGS olmak üzre toplam 16 register vardır. Bu registerlerin görevi içerisinde çeşitli bilgileri tutmaktır. Gerektiğinde işlemci buradaki değerleri kullanarak istenilen görevleri yerine getirir.

Farklı büyüklüklerde veriler tutmak için registerler 8, 16, 32 ve 64 bit uzunluğunda olabilirler.


32 Bit EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, EIP, EFLAGS
16 Bit AX, BX, CX, DX, BP, SP, SI, DI, CS, DS, SS, ES, FS, GS
8 Bit AH, AL, BH, BL, CH, CL, DH, DL

Bu registerler ihtiyaca göre kullanılmaktadır ancak burada dikkat etmemiz gereken yer bazı registerlerin aslında aynı adres alanını gösterdiğidir.

Örnek olarak yukarıdaki resimde 32 bitlik eax registerinin sağ taraftan ilk 16 biti ax registeri ile gösterilmektedir. Aynı şekilde ax registeri ah ve al olmak üzre iki parçaya bölünmektedir. Bu yapıda dikkat etmemiz gereken kısım biz ax registerinde bir veri tutuyorsak ve daha sonra eax registerine farklı bir veri yazarsak ax registerinde tutulan veriyi kaybederiz.

Registerlerin Kullanım Amacı

AX : Genel amaçlı registerlerdendir, akümülatör registeri olarak bilinir, dört işlemlerde ve veri taşımada kullanılır.

BX : Genel amaçlı registerlerdendir, base register olarak bilinir, bellek üzerinde bir adresi göstermek için kullanılır.

CX : Genel amaçlı registerlerdendir, counter registeri olarak bilinir, döngülerde sayaç olarak kullanılır.

DX : Genel amaçlı registerlerdendir, data register olarak bilinir, donanım ile yapılan giriş çıkışlarda kullanılır.

CS : Segment registerlerindendir, code segment olarak bilinir, yazılan kodlar burada tutulur.

DS : Segment registerleridir, data segment olarak bilinir, değişkenler ve stringler burada tutulur.

SS : Segment registeridir, stack segment olarak bilinir. bir fonksiyona gönderilen parametreler, kaybedilmek istenmeyen veriler burada tutulur, LİFO mantığı ile çalışır, son verinin adresi SP registerinde tutulur.

ES : Segment registerlerindendir, ekstra segment registeri olarak bilinir, DS ile aynıdır ancak fazladan bazı komutlar işlenmesi sırasında burayı kullanır.

FS/GS : Segmet registerleridir, ihityaç duyulması halinde DS yerine kullanılır.

BP : Pointer registerlerindendir, base pointer olarak bilinir, SS’in başlangıç noktasını belirtir.

SP : Pointer registeridir, stack pointer olarak bilinir, SS de bulunan son verinin adresini tutar.

SI : Pointer registerlerindendir, source index olarak bilinir, verileri göstermek için kullanılır.

DI : Pointer registerlerindendir, destination index olarak bilinir SI ile aynı işlemleri yapar tek farkı birisi kaynağı birisi hedefi gösterir, örnek olarak bazı komutlar SI da gösterilen veriyi DI da gösterilen adrese taşır.

IP : Pointer registeridir, instruction pointer olarak bilinir, CS içerisinde işlenecek olan bir sonraki komutun adresini tutar

EFLAGS : Bu register 32 bitliktir ve bazı komutların işlenmesi sonucunda içerisindeki flag değerleri set edilerek yapılan işlemin sonucu hakkında bilgi verir. Bu bilgiler doğrultusunda programın karar yapıları çalışır. Genel olarak aritmetik işlemler sonucunda set edilirler.

Aşağıda hangi registerlerin birlikte kullanılacağı gösterilmiştir.

  1. CS -> IP
  2. DS -> SI
  3. DS -> DI
  4. SS -> BP
  5. SS -> SP