Assembly İle İlgili Herşey

Sayı Sistemleri

Nümerik büyüklükler çeşitli metotlar ya da çeşitli notasyonlarla gösterilebilir. İnsanlar tarafından benimsenen notasyona decimal sistem adı verilir. Sayısal değerin ifade edilebilmesi amacıyla 10 ayrı dijitin kullanıldığı decimal sistem 10 tabanlı sayı sistemidir.

Elektronik aygıt olan bilgisayarlar için gerçekte sadece 2 ayrı büyüklüğün önemi vardır. Bunlar elektrik akınımın olması durumu veya olmaması durumudur. Bilgisayar sisteminin içyapısını oluşturan elektriksel ve birimsel kapılar sadece bu iki farklı durumu ya da değeri yorumlayabilirler. Bu değerler 0 ve 1 ile sembolize edilir. Decimal sistemde kullanılan tüm sayısal değerler bu 0 ve 1’lerin çeşitli kombinasyonlarıyla gösterilebilir ve bu değerlerin her birine binary dijit yani bit adı verilir.

Tüm sayılar her türlü sayı sisteminde ifade edilebilir. Fakat sayı sisteminin tabanı küçüldükçe ifade için kullanılan notasyon genişliği artar. Bu yüzden sayıların daha az dijitle ifade edilebilmesi için büyük tabanlı sayı sistemlerine ihtiyaç duyulur. Hexadecimal sayı sistemi bu ihtiyaca cevap vermektedir. Hexadecimal sayı sisteminin taban değeri 16’dır. Gerisinde kullanılan dijitlerden ilk 10 tanesi 0 ile 9 arasında dijitlerdir. 10,11,12,13,14,15 değerlerini gösterebilmek için sırasıyla A,B,C,D,E,F harfleri kullanılır.

Hexadecimal

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

Binary

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

Decimal

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Bit, Byte, Word, Double Word

Bilgisayarlar çeşitli değerleri 8 veya 16 bitlik gruplar halinde değerlendirirler. 8 bitten oluşan her bir kombinasyona Byte adı verilir. 2 byte’ın ya da 16 bitin bir araya gelmesiyle oluşan büyüklüğe 1 Word adı verilir. 2 ayrı Word’ün birleşmesiyle de 1 Double Word oluşturulur.

1 byte’ı oluşturan değerler 0 ile 255 arasında, 1 Word’ü oluşturan değerler ise 0 ile 65535 arasında değişir.

Negatif Sayılar

Bir bellek birimine negatif işaretli bir sayı aktarıldığında belleğe aktarılacak değer sayının kendisi değil 2’li tamamlayıcısı olacaktır. İşaretli sayının binary sistemdeki karşılığını oluşturan her bir bitin değili alınırsa 1’li tamamlayıcısı elde edilmiş olur. Bir sayının 1’li tamamlayıcısına 1 sayısı ilave edildiğinde bu sayının 2’li tamamlayıcısı elde edilmiş olur.

Örnek: (-32)

00100000 ==> 32 sayısı

11011111 ==> 1’li tamamlayıcısı (değili)

00000001 ==> 1 ekleniyor

11100000 ==> 2’li tamamlayıcısı

MİKROİŞLEMCİ (80x86)

Bir mikroişlemci mikro bilgisayarların temel yapısını oluşturan bir ciptir. Bu temel yapı bilgisayarın fonksiyonel gücünü belirler

Bir mikroişlemcinin temel bileşenleri; işlemci(CPU), Bellek, I/O(giriş, çıkış) aygıtları ve buslardır. Merkezi işlem ünitesi(CPU) mikroişlemcinin kendisidir. Bellek ve giriş çıkış aygıtları bus adı verilen elektronik hatlar ile CPU ya bağlanmaktadır. İşlemci tüm çevre aygıtları ile iletişim kurarak bunlar arasındaki bilgi alışverişinin gerçekleştirilmesini sağlar.

Mikroişlemci bilgisayar sistemlerinde şu işlemleri yapar.

·  Sistemdeki tüm elemanları ve birimleri zamanlar ve kontrol sinyali sağlar.

·  Bellekten komut getirir.

·  Komutun kodunu çözer

·  Komutun operandına göre veriyi kendisine veya giriş çıkış birimlerine aktarır.

·  Aritmetiksel ve mantıksal işlemleri yürütür.

·  Program işlenirken diğer donanım birimlerinden gelen kesme taleplerine cevap verir.

REGİSTERLAR

İşlemci içerisinde bir program yürütülürken işlemcinin yanı başındaki kaydedicilere ihtiyaç duyulur. Register kullanmaktaki avantaj register’in işlemcinin içerisinde yer almasından dolayı bu alanlardan veriyi okumak ve veri yazmak bellek üzerindeki bellek bölgelerinde deri okumak ve yazmaya göre daha hızlı çalışmaktadır.

Kaydediciler mikroişlemci mimarisinde önemli bir yer tutar ve doğrudan işlemcinin mimarisini belirler. Registerlar verinin manevrasında ve geçici olarak tutulması da 1. derece görevidir.

Aritmetik Mantık Birimi (ALU)

Aritmetik ve mantık birimi mikroişlemcide aritmetiksel ve mantıksal işlemlerin yapıldığı en önemli birimdir. Bu birime giriş işlemleri akümülatör kaydedicisiyle, bellekten alınan beri arasında veya akümülatör ile diğer kaydediciler arasında olabilir.

Aritmetik işlemler denilince toplama, çıkarma, çarpma, bölme mantıksal işlemler denilince and, or, not, xor gibi işlemler akla gelir. Komutlarla birlikte bu işlemleri mantık kapılarının oluşturduğu toplayıcılar çıkarıcılar ve kaydırıcılar gerçekleştirirler.

ALU’ da basit matematiksel komutlar zorlanmadan işlenebilir. Fakat karmaşık aritmetiksel işlemleri (karekök alma, üs alma vs.) gerçekleştirebilmek için ek elektronik devrelere ihtiyaç duyulur. Bu dereceler işlemcinin içerisinde yer almıyorsa bu tür karmaşık işlemleri gerçekleştirebilmek için birbiri ardına aynı komutlar defalarca işlenir. Gelişmiş işlemcilerde FPU (floating point unit-kayan noktalı birim) denilen bir işlemci sayesinde bu tür karmaşık işlemler FPU tarafından çözümlenir böylelikle işlemci bütün karmaşık işlemleri FPU’ ya yönlendirerek kendisi diğer işlemlerle meşgul olur ve böylelikle sistemde yavaşlama minimuma indirgenir.

Zamanlama ve Kontrol Birimi

Zamanlama ve kontrol birimi bellekte program bölümünde bulunan komut kodunun alınıp getirilmesi bu kodun çözülmesi ALU tarafından işlenmesi ve sonucun alınıp belleğe geri konulması için gerekli olan kontrol sinyallerini üretir. Bilgisayar sistemlerinde bulunan dahili ve harici bütün elemanlar bu kontrol sinyalleriyle denetlenir.

Zamanlama ve kontrol birimi 3 değişik işlemi yerine getirir.

1-) Zamanlama Kontrolü: İşlemci harici saat sinyali üreten bir birimden giriş alan iç saat devresine sahiptir. Bu sinyal alınacak talebe göre zamanlama sinyallerine dönüştürülerek sisteme dağıtılır.

2-) Komut Kod Çözücüsü: Komut kaydedicisinde tutulan komutlar bu devrede yorumlanır ve ALU’ ya kaydedicilere ulaşması için uygun sinyaller gönderilir.

3-) Kesme Mantık Birimi: Bu birim gerekli durumlarda kesme sinyallerini alarak işlemciyi uyarır.

Bir Komut Döngüsünün İşlenişi

1)  Al getir(Fetch): işlenecek komutun ana bellekten ya da önbellekten alınıp getirilmesi aşamasıdır.

2)  Kod Çöz(Decode–1): getirilen komutun makinenin anladığı dile dönüştürülmesi aşamasıdır.

3)  Adres Üret(Decode–2) burada komutun kodunun çözülmesi ile birlikte eğer komut bir adresle irtibatlıysa yeni bir adresi referans olarak gösteriyorsa bu adresin hesaplandığı aşamadır.

4)  Çalıştırma(Execute): komutun icra edilmesi aşamasıdır.

5)  Geriye Yazma(Write back): komutun çalıştırılması ile birlikte elde edilen sonucun belleğe ya da kaydedicilere yazılma (saklama) aşamasıdır.

Günümüz işlemcilerinde bir komut döngüsün işlenişi U ve V İshakları olmak üzere 2 kanallı ve 5 aşamada gerçekleşir.

CPU REGİSTER’LARI

 Mikroişlemci (80x86) register adı verilen 14 adet özel location içerir bu registerlar çeşitli verilerin geçici süreler için saklanması ve bu verilerin üzerinde işlem yapabilmesini sağlar registerlar işlemci cipinin içerisinde yer aldıklarında bu alanlarda yapılan işlemler bellek bölgelerinde yapılan işlemlere göre çok daha hızlıdır.

Data Registerları

AX, BX, CX, DX ‘ten oluşan data registerları genellikle aritmetiksel işlemler için kullanılır her bir data registerı diğer registerlardan farklı olarak bir bütün halinde veya 2 parça halinde kullanılabilmektedir. Örn. AX registerını 16 bitlik işlemler için AX i oluşturan AH ve AL ise 8 bitlik işlemler için kullanabiliriz. 16 bit uzunluğundaki data registerlarının yüksek seviyeli kısmı register isminin ve High kelimesinin baş harfleriyle, düşük seviyeli kısım ise yine register isminin ve Low kelimesinin baş harfleri kullanılarak elde edilmiştir. Böylece; AX için AH ve AL, BX için BH ve BL, CX için CH ve CL, DX için DH ve DL olarak isimlendirerek 8 bitlik register elde edilir.

Data registerlarından herhangi biri program amaçları için kullanılabilir. Fakat belirli data registerları belirli işlemler sırasında Operand olarak kullanılması zorunludur. Bu durumda programcının bir seçim yapması mümkün değildir.

AX: Bu register genellikle toplama, çıkarma, çarpma, bölme, giriş, çıkış ve bazı string operasyonlarında Word uzunluklu olarak kullanılır.

BX: Genellikle aritmetiksel işlemlerde AX registerına yardımcı olarak ve bellek içindeki verilerin adreslenmesinde kullanılır.

CX: Sayaç registerıdır. Genellikle döngülerde ve kaydırma işlerinde kullanılır.

DX: Word uzunluklu çarpma ve bölme operasyonlarında ayrıca giriş çıkış operasyonları için port numarasını göstermede kullanılır.

Segment Registerları

CS (Code Segment): Çalışan programın Segment adresini tutar, makine dili komutlarının yer aldığı adresi gösterir.

DS (Data Segment): Bilgi işlem operasyonlarına tabi tutulan bilgiler data Segment içindeki özel bölgelerde yer almaktadır. DS registerı geçerli data segmentin başlangıç adresini gösterir.

SS (Stack Segment): Verilerin geçici olarak saklandığı bellek bloğuna Segment adı verilir. Stack Segment geçerli Stack Segment’in başlangıç adresini gösterir.

ES (Extra Segment): Bu Segment genel olarak string operasyonlar için kullanılır. Extra Segment geçerli Extra Segment’in başlangıç adresini gösterir.

Pointer İndex Registerları

Bu registerlar data registerları gibi aritmetiksel işlemler için kullanılabilir. Bu registerların kullanımındaki asıl amaç çeşitli bellek bölgelerindeki verilere ulaşabilmek için ele alınmaları bellek içindeki bir lokasyonun adresini gösterebilmek için 2 ayrı adres değeri kullanılır. İlk değer işaret edilen lokasyonu içinde barındıran segmentin adresidir. Lokasyonun segment içindeki yeri gösteren 2. adres ise ofset adresidir. Bu adresler Pointer İndex Registerları içerisinde tutulur.

Komut Göstergeci (Instruction Pointer)

Komut göstergeci işlemcinin icra ünitesi tarafından çalıştırılacak olan bir sonraki komutun ofset adresini içerir. Ofset adresi IP ile gösterilen bellek bölgesi Code Segmentin içindedir. IP registera özel bir register olması nedeniyle programcılar tarafından kullanılmaz.

Flag Register (Program Status Word)

Bu register diğer registerlardan oldukça farklıdır. Bu registerın içerisindeki değeri bir bütün olarak değerlendirmek söz konusu değildir. Çünkü bu registerın sayısal değeri değil kendisini oluşturan bitlerin tek tek değeri önemlidir. Flag registerının içerisindeki bitlerden sadece 9 tanesi kullanılabilmektedir. Bu 9 bitin mevcut değeri çeşitli kontrol komutlarının çalıştırılmasına etki etmekte veya aritmetiksel ya da mantıksal işlemin sonucu hakkında bilgi vermektedir.

BELLEK, SEGMENT, OFFSET

 Bellek: programları oluşturan komutları ve program tarafından üzerinde bilgi işlem yapılacak verileri içeren ya da saklayan üniteye bellek adı verilir. 8086 mikroişlemcisi ile kullanılabilecek maksimum bellek büyüklüğü 1 MB’tır

 Segment: belleğin bütün noktalarının adreslenebilmesi ve ayrıca bellek üzerinde operasyonların daha kolay ve daha doğru gerçekleşmesini sağlamak üzere mevcut bellek bölümlerine ayrılır. Maksimum 64 KB uzunluğunda olan her bir bölüme segment adı verilir.

 Ofset: Bir segmentin maksimum genişliği 64 KB olduğuna göre segment içerisindeki her bir nokta 16 bit uzunluğundaki işaretsiz sayılar ile adreslenebilir durumda bir segment içerisinde yer alan bir segment bölgesinin adresini gösteren16 bitlik işaretsiz tamsayıya ofset adı verilir.

 

Flag Register

 80x86 mikroişlemcisine özel bir register olan flag registerı işlemcinin üzerinde yer alan diğer registerlardan daha farklı olarak kullanılan flag registerinin içerdiği değer bir bütün olarak değerlendirilemez. Flag registerında yer alan bitler tek tek ve kendi başlarına özel anlama sahiptir.

 Flag register içerisinde yer alan bitlerin her birine flag (bayrak) adı verilir. Bu flaglar set veya reset olmalarına göre programcıya veya işlemciye bilgi verirler. Bir flagın set olması durumu o flagın binary 1 değerine, reset olması durumu ise o flagın binary 0 değerine eşit olması anlamlarına gelir.

C: Carry flag (taşma bayrağı)

P: Parity flag (tek-çift bayrağı)

A: Auxilary Carry flag (Ara Elde Bayrağı)

Z: Zero flag (sıfır bayrağı)

S: Sign flag (işaret bayrağı)

T: Trace flag (Tek Adım işlem bayrağı)

I: Interrupt flag (kesme bayrağı)

D: Direction flag (yön bayrağı)

O: Overflow flag (işaretli sayılarda taşma bayrağı)

 Bir flag registerının içerisinde yer alan herhangi bir flag sahip olduğu her bir bit işlemcinin yaptığı bir operasyonun hemen artından 1 veya 0 değerine sahip olur.

Carry Flag (taşma bayrağı): işlemci için her bir pozisyondaki işlemin bir elde değeri vardır. Bu değer 1 veya 0 dır. Carry yok ise yapılan işlem ne olursa olsun elde değeri 0 olacaktır. İşlem sona erdiğinde işlemcinin o anki elde değeri Carry flagına aktarılır. Elde değer olarak tutulan bit Carry flagını 2 ayrı şekilde etkiler.

Þ  En anlamlı bit pozisyonunda bir Carry meydana gelmemişse işlemci tarafından tutulan son elde değeri 0 olacak ve Carry flagına 0 değeri aktarılacaktır. O halde Carry flagının değeri 0 ise sonuç alıcı alana sığmıştır.

Þ  En anlamlı bit pozisyonunda bir Carry ya da borrow(eksili taşma) meydana gelmişse işlemci tarafından tutulan son elde değeri 1 olacak ve Carry flagına 1 biti aktarılacaktır. O halde işlem sonrasında Carry flagının değeri 1 ise işlem sonucu alıcı alana sığmamıştır.

Sign Flagı (işaret flagı): 8 bit uzunluğundaki bir bellek bölgesi içinde işaretli bir sayı bulunuyorsa bu sayının sayısal büyüklüğü düşük seviyeli 7 bit tarafından oluşturulur. Soldaki yüksek seviyeli bit (en anlamlı bit) sayının işaretini gösterir.16 bitlik bir alanın işaretli sayı içermesi durumunda ise düşük seviyeli 15 bit ile sayının büyüklüğü; 15. bit ile de sayının işareti gösterilir. Bu nedenle işaretli sayılar için kullanılan 8 bit uzunluğundaki bellek bölgesinin 7. biti de 16 bit uzunluğundaki bellek bölgesinin 15. bitine sign biti adı verilir.

 Sign biti 0 değerine sahipse sayının işareti pozitif; sign biti 1 değerine sahip ise sayının işareti negatif kabul edilir.

Overflow flagı (işaretli sayılarda taşma):işaretli sayıların taşmasını kontrol etmek için Carry flagı yerine overflow flagı kullanılır. Operasyon sırasında alıcı olan byte’ının veya Word’ünün dışında bir taşma meydana gelmemişse fakat alıcı alanın yüksek seviyeli biti(sign biti) pozisyonuna bir önceki pozisyondan gelen bir taşma varsa overflow flagını 1 değerini; aksi takdirde 0 değeri aktarılır.

Auxilary Carry flagı (yardımcı elde bayrağı): Auxilary Carry flagı bir operasyon sırasında sonucun aktarılacağı alıcı alanın düşük seviyeli 4 bitini kontrol eder bu bitler üzerinde soldaki bit pozisyonunda bir taşma meydana gelirse auxilary Carry flagı 1 değerini alır.

Carry flagı ile yarım byte üzerinde meydana gelen bir taşma kontrol edilemez. Bu kontrol Auxilary Carry flagı ile gerçekleştirilir.

Zero Flagı (sıfır bayrağı):bir operasyon sonucunda alıcı alana aktarılan değer 0 (sıfır) ise Zero flagı set edilir. Aksi takdirde reset edilecektir. Böylelikle bir işlemin sonucunun 0’a eşit olup olmadığı ZF ile kontrol edilebilir.

Parity flagı(çift bayrağı): Bir operasyon sonucunda Word’ün düşük seviyeli byte kısmındaki 1 bitlerinin sayısı 2 ile bölünüyorsa parity flagı set edilir aksi takdirde reset durumundadır.

DİKKAT: Yukarıda açıklamaları verilen bu 6 adet flag sadece aritmetiksel ve mantıksal işlemler sonucunda tetiklenir..!

Direction Flagı(yön bayrağı): Direction Flagı stringlerin veya bir bellek bloğu içeriğinin bir noktadan başka bir noktaya transferini sağlayan yada string bilgiler üzerinde kıyaslama yapar. String komutlarında kullanılır.

Direction flagı reset durumunda iken işleme tabi tutulacak elemanların yerini gösteren İndex registerlarının değerleri birer birer artar, direction flagı 1 iken değerleri birer birer azalır.

İnterupt flagı(kesme bayrağı):işlemci bilgisayar sistemi içinde yer alan giriş çıkış aygıtlarını sürekli olarak kontrol eder. Herhangi bir komutu çalıştırırken çevre aygıtlardan kendisine gönderilen bir emir aldığında yapılan işlemi bırakıp çevre aygıtları ile ilgili işi yerine getirir. Çevre aygıtları ile ilgili işlem sona erdiğinde tekrar kaldığı yerden çalışmasına devam eder. İnterupt flagına 0 değeri aktarıldığında çevre aygıtlardan işleme gönderilen istekler dikkate alınmaz, interupt flagına 1 değeri aktarıldığında çevre aygıtlardan gönderilen emirler işlemci tarafından yerine getirilecektir.

Trace Flagı(adım adım işleme): işlemci bir program çalıştırırken programı oluşturan komutları tek tek ele alır ve bir komutun çalışması sona erdiğinde beklemek için bir sonraki komuta geçer. Trace flagı set edildiğinde işlemcinin bir sonraki komuta geçmesi engellenmiş olur böylelikle program içlemcinin üzerinde satır satır işlenebilir hale gelir.

Flagları Doğrudan Etkileyen Komutlar

 Yapılan aritmetiksel veya mantıksal bir işlem sonrasında mikroişlemci üzerinde bazı flaglar dolaylı yoldan tetiklenirler. Ancak bazı durumlarda flaglara programcının doğrudan müdahale etmesi gerekebilir. Programın böyle bir işlemi yapabilmesi için flagları doğrudan etkileyen komutları kullanması gerekir. Bunlar;

STC (Set Carry): Carry flagının mevcut değerini 1 yapar.

CLC (Clear Carry): Carry flagının mevcut değerini 0 yapar.

CMC (Complament Carry): Carry flagının mevcut değerinin değilini alır ve tekrar Carry flagına aktarır. Yani mevcut değer 1 ise 0; 0 ise 1 yapar.

STD (Set Direction): Direction flagının değerini 1 yapar.

CLD (Clear Direction): Direction flagının değerini 0 yapar.

STI (Set Interupt): Interupt flagının değerini 1 yapar.

CLI (Clear Interupt): Interupt flagının değerini 0 yapar.

ASSEMBLY’ DE KOMUTLAR.

1-) Genel Amaçlı Bilgi Transfer Komutları

MOV, XCHG, XLAT

2-) Adres Transfer Komutları

LEA, LDS, LES

3-) Giriş Çıkış Komutları

IN, OUT

4-) Flag Transfer Komutları

LAHF, SAHF

GENEL AMAÇLI TRANSFER KOMUTLARI

Mov Komutu

 Bir byte veya bir Word uzunluklu bilgilerin 2 register arasında yada bir bellek bölgesiyle bir register arasında transfer edilmesini sağlar

Genel Formu: MOV alıcı,gönderici

 

Alıcı Alan

Operand Tipi

Gönderici Alan Operand Tipi

Register

Bellek

Bölgesi

Sabit

Register

Bellek Bölgesi

 Bir register ile başka bir register arasında bilgi transferi yapılırken alıcı alan olarak kullanılan register gönderici alan olarak kullanılan registerdan mutlaka büyük yada eşit olmak zorundadır.

 Segment registerları arasında bilgi transferi doğrudan yapılamaz, arada geçici bir regisyer kullanmak gerekir. Yani 2 segment registeri arasında bilgi transferi dolaylı yoldan yapılır.

 Bir data registerlarına sabit bir değer aktarılmak istenildiğinde alıcı alan olarak kullanılan registerın sabit değerin büyüklüğünden büyük ya da eşit olması gerekir.

 Bir bellek bölgesine bir data registerdan veri aktarmak istenildiğinde bellek bölgesi üzerinde herhangi bir düzenleme işlemi yapılmaz.

 Bir bellek bölgesinden başka bir bellek bölgesine veri transfer yapılmak istenildiğinde bu işlem arada geçici bir register kullanarak (dolaylı yoldan) yapılır.

 Bir bellek bölgesine sabit bir değer aktarılmak istenildiğinde alıcı alan olarak kullanılan bellek bölgesinin düzenlenmesi gerekir. Bellek bölgesine aktarılacak sabit byte uzunluklu ise Byte PTR, aktarılacak değer Word uzunluklu ise Word PTR ön ekini kullanmak gerekir.

Xchg Komutu

 2 register arasında yada bir bellek bölgesi ile bir register arasında verilerin karşılıklı olarak değiştirilmesini sağlar

Genel Formu: XCHG opr1,opr2

Xlat Komutu

 Bir byte bloğunun (byte dizisinin) istenilen bir elemanına erişmek için xlat komutu kullanılır.

Genel Formu: XLAT

 XLAT komutu parametresiz yazılır, fakat bu komut bazı registerları gizlice kullanır. Bu komut çalıştırılmadan önce erişmek istenen byte dizisinin başlangıç adresi BX registerına, dizinin erişilmek istenen elemanının indexi de AL registerına aktarılır. Bu işlemden sonra XLAT komutu çalıştırıldığında BX içerisinde yer alan başlangıç adresinden AL içerisinde yer alan index’e erişilmiş olur ve sonuç yine AL registerına aktarılmış olur.

ADRES TRANSFER KOMUTLARI

LEA Komutu

 Bir değişkenin ofset adresini alıcı alan olarak kullanılan registera aktarır.

Genel Formu: LEA alıcı,değişken

LDS Komutu

 Lea komutundan farklı olarak değişkenin ofset adresini alıcı alan registerına aktardığı gibi aynı zamanda AX registerının içerisine de değişkenin bulunduğu segmentin adresini aktarır.

Genel Formu: LEA alıcı,değişken

NOT: LDS komutunun icrasından sonra AX registerına aktarılan DS’in başlangıç adresi DS registerına aktarılır.

LES Komutu

 LEA komutuna ek olarak değişkenlerin bulunduğu segmentin başlangıç adresini ekstra segment registerına aktarır.

LAHF Komutu

 Flag registerının ilk 8 bitini AH registerına aktarmak için kullanılır.

Genel Formu: LAHF

(Flag registerının 1 byte kısmını AH olarak alır)

SAHF Komutu

 AH registerının içerisinde bulunan 1 byte’lık değeri flag registerının düşük değerlikli 8 bitine aktarır.

Genel Formu: SAHF

IN / OUT Komutu

 İn komutu port no olarak belirtilen bir port’a 1 byte’lık veya 1 Word’lük bilgiyi alarak akümülatör registerına (AX) aktarır. OUT komutu ise AX registerında var olan bir byte’lık veya 1 Word’lük bilginin port no olarak belirtilen port’a gönderilmesini sağlar. İN ve OUT komutları ile gönderilecek bilgi 1 byte’lık ise AL registerını, gönderilecek bilgi 1 Word’lük ise AX registerını kullanılması gerekir.

Genel Formu: IN Akümülatör,Port no

 OUT port no,Akümülatör

 

ARİTMETİKSEL KOMUTLAR

 80x86 mikroişlemcisi işaretli yada işaretsiz binary sayılar üzeinde ada işaretsiz decimal sayılar üzerinde aritmetiksel işlemleri yapabilir. İşaretsiz decimal sayılar; paketlenmiş yada paketlenmemiş decimal sayılar olmalarına göre farklı aritmetiksel oparasyonlara tabi tutulurlar. Aritmetiksel komutlar 3 farklı alanda işlenir.

1)  Dört İşlem Komutlar

ADD, ADC, SUB, SBB, MUL, IMUL, DIV, IDIV

2)  Düzenleyici Komutlar

AAA, AAS, AAM, AAD, DAA, DAS

3)  Ek Aritmetiksel Komutlar

CMP, INC, DEC, NEG, CBW, CWD

ADD Komutu

 Kendisine Operand olarak verilen çeşitli verilerin toplanmasını sağlar

Genel Formu: ADD Alıcı,Gönderici

Yaptığı işlem: Alıcı=Alıcı+Gönderici

 ADD komutu alıcı alan operandının değerine gönderici olan operandının değerini ekler ve sonucu alıcı alan operandına aktarır. Operasyon sonrasında alıcı alandaki değer değişirken gönderici alandaki değer sabit kalır.

Alıcı Alan

Operand Tipi

Gönderici Alan Operand Tipi

Register

Bellek

Bölgesi

Sabit

Register

Bellek Bölgesi

 

Operandlar byte veya Word uzunluklu olabilir. Ancak her 2 operandın uzunluğunun birbirine eşit olması gerekir.

 Segment registerları üzerinde aritmetiksel işlemler yapılamaz.

Gönderici alan üzerinde byte ptr eki ile bir aktarım yapılmışsa bu bellek bölgesi byte veya Word ile tanımlanmış bir register ile aritmetiksel işleme tabi tutulabilir. Fakat gönderici alan olarak kullanılan bellek bölgesi Word  uzunluklu tanımlanmış ile alıcı alan olarak kullanılan registerın mutlaka Word uzunluklu seçilmesi gerekir.

Alıcı alan bellek bölgesi gönderici alan olarak kullanıldığında bellek bölgesi gönderici alan olarak kullanılan registera göre kendisini ayarlar.

Bellek bölgesiyle başka bir bellek bölgesi doğrudan aritmetiksel işleme tabi tutulamaz

ADC Komutu

ADD komutu gibi kendisine verilen 2 farklı değerin toplanması amacıyla kullanılır ADC komutu ADD komutundan farklı olarak işlemin sonrasında Carry flagının durumunu işlemin sonucuyla toplar. (üst üste yapılan toplama işlemini kontrol etmek için kullanılır.)

Genel Formu: ADC alıcı,gönderici

Yaptığı İşlem: Alıcı=alıcı+gönderici+Carry

 

 

SUB Komutu

Kendisine operand olarak verilen değerlerin farkını elde etmek için kullanılır. Operasyon sonrasında elde edilen değer alıcı alanın operandına aktarılır.

Genel Formu: SUB alıcı,gönderici

Yaptığı işlem:Alıcı=Alıcı-Gönderici

SBB Komutu

 Alıcı alan ile gönderici alan üzerinde yaptığı çıkarma işlemi sonrasında elde edilen Carry flagının durumunu alıcı alandan çıkarır. İşlem sonucu tekrar alıcı alana aktarılır. (üst üste yapılan çıkarma işlemini kontrol etmek için kullanılır)

Genel Formu: SBB alıcı,gönderici

Yaptığı işlem: Alıcı=alıcı-gönderici-Carry

 

MUL Komutu

 İşaretsiz sayıların çarpılmasında kullanılır.

Genel Formu: MUL çarpan

 Assambler çarpma işleminde çarpılan değer mul komutu icra görmeden önce Byte uzunluklu ise al ye Word uzunluklu ise AX’e Aktarılır. Bu düzenleme yapıldıktan sonra sonuç Word uzunluklu ise AX’te Double Word uzunluklu ise DX ve AX ikilisinde saklanır. (yuksek seviyeli kısım DX’te düşük seviyeli kısım AX’te saklanır.

-Byte x Byte Çarpımı

 Mov al,çarpılan (1 Byte)

 Mul çarpan (1 Byte)

 Sonuç AX’te saklanır.

-Byte x Word Çarpımı

 Mov al,çarpılan (1 Byte)

 Mov AH,0 (etkisiz olması için AH nin sıfırlanması)

 Mul çarpan (1 Word)

 Sonuç DX, AX ikilisinde saklanır

(yüksek seviyeli kısım DX’te Düşük seviyeli kısım AX’te saklanır.)

-Word x Byte Çarpımı

 Mov ax,çarpılan (1 word)

 Mov bl,çarpılan (1 byte)

 Mov bh,0 (etkisiz olması işin BH’nin sıfırlanması)

 Mul çarpan (1 Word)

 Sonuç DX, AX ikilisinde saklanır.

-Word x Word Çarpımı

 Mov AX,çarpılan (1 Word)

 Mov Çarpılan (1 Word)

 Sonuç DX, AX ikilisinde saklanır.

Çarpma işlemi sonucunda Carry set edilirse owerflow flagı da set edilir

IMUL Komutu

 İşaretli satılarda çarpma işlemi yapmak için kullanılır.

Genel Formu:IMUL çarpan

DIV Komutu

 İşaretsiz sayıların bölünmesinde kullanılır.

Genel Formu:DIV bolen

 Div operasyonlarında div komutu icra görmeden önce bölünen değer bytelık ise bölünen değer AL ye, Word uzunluklu ise AX e bölünen doubleword uzunluklu ise DX AX ikilisine aktarımının yapılması gerekir.

 

-Word/Byte

 Mov ax,bölünen (1Word)

 Dıv bolen (1 byte)

 Sonuç: bölüm AL, kalan AH

-Byte/Byte

 Mov al,bölünen (1 Byte)

 Dıv bölen (1 byte)

 Sonuç: Bölüm AL, kalan AH

-Word/Word

 Mov ax,bölünen (1 Word)

Mov DX,0 (bölme işleminde DX’in etkilememesi için sıfırlanması)

Dıv Bölen (1 Word)

 Sonuç:Bölüm AX, Kalan DX

-Dword/Word

 Mov dx,bölünen1 (bölünenin yüksek seviyeli kısmı)

 Mov ax,bölünen2 (bölünenin düşük seviyeli kısmı)

 Dıv bölen (1 Word)

 Sonuç: Bölüm AX, Kalan DX

IDIV Komutu

 İşaretli sayıların bölünmesi için kullanılır.

Genel Formu: IDIV Bölen

4 İŞLEM ÖRNEKLERİ

 

DÜZENLEYİCİ KOMUTLAR

Bir Byte ile ifade dilebilen Decimal dijite paketlenmemiş Decimal sayı adı verilir. Decimal dijit Byte’ı oluşturan bitlerin düşük seviyeli 4 biti ile temsil edilirken yüksek seviyeli 4 bit değeri 0 dır. Bir Byte’ın düşük ve yüksek seviyeli her 2 yarımı ile 2 ayrı Decimal dijit yer alıyorsa bu sayılara da paketlenmiş decimal sayı adı verilir. Paketlenmemiş Decimal sayılar 0 ile 9 arasında değişirken paketlenmiş Decimal sayılar 00 ile 99 arasında değişir.

AAA, AAS, AAM, AAD, DAA, DAS

AAA Komutu

 2 paketlenmemiş Decimal sayıların toplanması sonrasında elde edilen sonuç üzerinde düzenleme yaparak sonucun paketlenmiş Decimal sayı içermesini sağlar

AAA komutu paketlenmemiş Decimal sayılar üzerinde yapılan bir sonucunu ASCII karakterleriyle kurulacak basit ilişki düzeyine getirdiği için toplamanın ascii amaçlı düzenlenmesi şeklinde tanımlanır.

AAS Komutu

 Yapılan bir çıkarma işleminin ascii amaçlı düzenlenmesini sağlar.

AAM Komutu

 Paketlenmemiş sayılar üzerinde yapılan bir çarpma işleminin sonucunun ascii amaçlı düzenlenmesini sağlar.

AAD Komutu

 Yapılan bir bölme işleminin sonucunun ascii amaçlı düzenlenmesini sağlar. Diğer ascii amaçlı düzenleyici komutlar sonuç üzerinde düzenleme yaparken AAD komutu bölünen değer üzerinde düzenleme yapar. Dolayısıyla AAD komutu DIV komutundan önce kullanılır.

DAA komutu

 Bir toplama işlemi üzerinde 2 farklı düzenleme yapılabilir. Bunlardan birisi sonucun paketlenmemiş Decimal haline dönüştürülmesi diğeri ise sonucun paketlenmiş Decimal sayı haline dönüştürülmesini sağlar. Paketlenmemiş Decimal sayılar için AAA komutu kullanılırken paketlenmiş Decimal sayılar için toplama işlemi sonrasında DAA komutu kullanılır.

DAS Komutu

 Yapılan bir çıkarma işleminin sonucu üzerinde (sayılar paketlenmiş Decimal sayı olmak üzere) Decimal amaçlı düzenlenmesini sağlar.

EK ARİTMETİKSEL KOMUTLAR

 Çeşitli sayısal değerler üzerinde 4 işlem yapan ve işlem sonuçlarını ascii yada Decimal amaçlı düzenleyen aritmetiksel komutların yanı sıra bir grup komut daha  vardır. Bu komutlar;

CMP ==> kıyaslama

INC ==> 1 arttırma

DEC ==> 1 azaltma

NEG ==> ikili tamamlayıcısını üretme

CBW ==> Byte’ı Word’e dönüştürme

CWD ==> Word’ü DWord’e Dönüştürme

INC ve DEC Komutları

 INC komutu operandının mevcut değeri ile 1 sayısını toplar ve sonucu yine o operanda aktarır.

 DEC komutu ise operandının değerinden 1 sayısını çıkartır ve sonuç değerini yine o operanda aktarır. İşlemler sırasında operand olarak tanımlanan değerin işaretsiz sayılar içerdiği kabul edilir. INC ve DEC komutları Carry flagı haricinde diğer aritmetiksel flagları etkiler.

Genel Formu

INC operand

DEC operand

NEG Komutu

 Operandının değeri 0 sayısından çıkartır ve sonucu tekrar bu operanda aktarır; yani operand olarak tanımlanan değerin 2’li tamamlayıcısını üretir ve sonucu tekrar bu operanda aktarır.

CBW/CWD Komutları

 Aritmetiksel işlemle sırasında herhangi bir operasyona tabi tutulacak Operandlar farklı uzunluklara sahip olabilirler. Böyle bir durumda operasyon öncesinde bu operandların uzunluklarının düzenlenmesi gerekir. Bu düzenleme küçük uzunluğa sahip operandın uzunluğunun büyük uzunluğa sahip operandın uzunluğuna denkleştirilmesi şeklinde olur.

 İşaretli sayılar içeren operandlarn uzunluklarının düzenlenebilmesi için cbw ve cwd komutları kullanılır. Cbw komutu ah ve al yi, cwd komutu ise dx ve ax i gizli operand olarak kullanır. Cbw komutu al registerı içerisindeki işaretli sayının işaret bitini ah’nin tüm bitlerine, cwd komutu ise ax registerı içerisindeki sayının işaret bitini dx registerının tüm bitlerine aktarır. CBW ve CWD komutları operandsız olarak yazılır.

CMP Komutu

 Kendisine operand olarak verilen 2 sayısal değerin karşılıklı olarak kıyaslanmasını sağlar.

Genel formu: CMP opr1,opr2

 2 sayı arasında bir ilişki olup olmadığını anlayabilmek için bu sayıları birbirinden çıkartmak ve bu çıkarma içleminin flaglar üzerindeki etkilerini öncelemek gerekir.

Örn: çıkarma işlemi sonucunda zero flagı set durumuna geçiyorsa bu 2 sayının birbirine eşit olduğu; aksi taktirde birbirinden farklı olduğu anlaşılabilir.

İşaretsiz Sayılarda (A,B)

İşaretli Sayılarda (A,B)

ZF:1 ise A=B

ZF:1 ise A=B

ZF:0 ise A<>B

ZF:0 ise A<>B

CF:1 ise A<B

SF<>OF ise A<B

 Genel olarak bir kıyaslama işleminden hemen sonra kıyaslama sonucuna bağlı olarak belli program parçalarının icra ettirilmesi, belli program parçalarının ise icra ettirilmemesi istenebilir. Bu durumda CMP komutunu tek başına kullanmak bir anlam ifade etmez. Cmp komutundan hemen sonra koşullu dallanma komutları yada koşullu döngü komutları ile program akışının farklı bir konumda devam etmesini sağlar.

Lojik Komutlar

 Lojik operasyonlar kapı olarak isimlendirilen elektronik aygıtlar tarafından gerçekleştirilir.

 Bir kapıda genel olarak 2 giriş ve 1 çıkış sinyali yer alır. Sadece not kapısı tek bir giriş ve tek bir çıkış sinyali ile çalışır. Lojik kapının girişindeki sinyallerle operasyonlara tabi tutulan bitlere çıkıştaki sinyaller ise operasyon sonucuna karşılık gelir.

Lojik Komutlar

  • OR
  • NOT
  • AND
  • XOR
  • TEST

NOT Komutu

 Operandının değerinin binary sistemdeki karşılığında yer alan 1 bitlerinin 0, 0 bitlerinin 1 yapar. Yani her bir bitin değilini üretir. Elde edilen sonuç operand olarak belirtilen alıcı alana aktarılır.

Genel Formu: NOT opr

OR Komutu

 2 sayısal değeri oluşturan bitleri karşılıklı olarak kıyaslar bitlerden her 2 side 0 ise yeni bit değeri olarak 0, aksi taktirde 1 sonucunu üretir. Operasyon sonrasında elde edilen değer soldaki alıcı alan operandına aktarılır.

Genel formu: or opr1,opr2

x

y

Or (x,y)

1

1

1

0

1

1

1

0

1

0

0

0

XOR Komutu

 Kendine operand olarak verilen değerlerin karşılıklı olanlarını kıyaslar şartların her 2 sininde aynı olduğu durumlarda 0 şartların birbirinden farklı olduğu durumlarda 1 sonucunu üretir. Yapılan işlem sonrasında elde edilen sonuç alıcı alan operandına aktarılır.

Genel Formu:XOR opr1,opr2

x

y

xor (x,y)

1

1

0

0

1

1

1

0

1

0

0

0

AND Komutu

 2 sayısal değeri oluşturan bitlerin karşılıklı olanlarını kıyaslar bitlerden her 2 side 1 ise 1 sonucunu, aksi taktirde 0 sonucunu üretir. Operasyon sonrasında elde edilen sonuç soldaki alıcı alan operandına aktarılır.

Genel Formu: AND opr1,opr2

x

y

and (x,y)

1

1

1

0

1

0

1

0

0

0

0

0

TEST Komutu

 Tamamiyle and komutu gibi çalışır. Test operasyonu tüm flagları and komutunda olduğu gibi etkiler. Farklı olarak komutunda birlikte kullanılan operandların değerini değiştirmez

Genel Formu: Test opr1,opr2

Dallanma, İcra Transferi

 Bir proğramın icra akışı bir dallanma yada bir procedure çağırımını gerçekleştiren bir komut kullanmadıkça birbirini izleyen komutlar üzerinde devam eder. Dallanma komutları sayesinde icra akışının bir sonraki komuta geçmesi engellenerek adresi belirtilen başka bir komuta transfer edilmesine sebep olur. Dallanma komutlarını kullanmaktaki asıl amaç belli bir şartın doğru yada yanlış olmasına bağlı olarak belli program parçalarının icra görmesini yada görmemesini sağlayabilmektir. Ayrıca dallanma komutlarını kullanarak belli program parçalarının döngüye sokulması sıklıkla yapılan işlemlerdendir. Dallanma komutları 2 ayrı sınıfta toplanır.

==> Koşulsuz Dallanma Komutları

  • JMP

==> Koşullu Dallanma Komutları

  • JZ,JE …………..= ise
  • JB,JC,JNAE …..< ise
  • JL,JNGE …..<ise
  • JA,JNBE …..> ise
  • JG,JNLE …..> ise
  • JBE,JNA …..<= ise
  • JLE,JNG …..<= ise
  • JNB,JNC,JAE …..>= ise
  • JGE,JNL …..>= ise
  • JNZ …………..<> ise
  • JO …………..OF:1 ise
  • JNO …………..OF:0 ise
  • JS ………….SF:1 ise
  • JNS ………….SF:0 ise
  • JCXZ ………….CX:0 ise

JMP Komutu

 Programın icra akışını bir noktadan başka bir noktaya koşulsuz olarak yönlendirir. İcra akışının yönlendirileceği komutun adresi JMP komutunun parametresi olarak kullanılır.

Genel Formu: JMP adres

J:jump=atla

Z:Zero=sıfır

E:Equal=eşit

C:Carry=Carry Flağı

B:Below=Küçük

A:Above=büyük

O:Oweflow=OF

S:Sign=SF

L:Less=küçük

G:Greater=büyük

N:Not=değil

CX:CX reg. =CX

Koşullu Dallanma Komutları

 8086 mikroişlemcisi belirtilen bir koşulun doğru olması halinde dallanmayı sağlar. 17 farklı dallanma komutuna sahiptir.

Dallanma operasyonunun gerçekleştirilebilmesi için belirli bir koşulun doğru olması gerekir. Komutun icrası sırasında belirtilen doğru ise verilen adrese dallanır. Koşul doğru değil ise dallanma gerçekleşmez ve işlenen komut ile icra devam eder. Koşullu dallanma komutları 1 veya 2 flagın mevcut değerine göre hareket eder.

JZ/JE Komutları

 İşaretli ve işaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılır.komutun icrası sırasında ZF set durumunda ise adres olarak belirtilen bölgeye dallanma işlemi gerçekleşir. Bir CMP komutunun hemen arkasında kullanıldıklarında sayıların birbirine eşit olması halinde dallanma gerçekleşir.

JC/JB/JNAE Komutu

 İşaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılırlar. Carry flagının 1 olması durumunda dallanma gerçekleşir. Bir CMP operasyonundan sonra kullanıldığında 1. değerin 2. değerden küçük olması durumunda dallanma gerçekleşir.

JL/JNGE Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılır.sign ve overflow flağının değeri birbirinden farklı ise dallanma gerçekleşir. İşaretli bir sayının işaretli başka bir sayıdan küçük olup olmadığını kontrol etmek üzere bir cmp komutundan hemen sonra kullanılır.

JA/JNBE Komutu

 Her 2 komutta işaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılırlar. Bu komutlar Carry ve zero flaglarını kontrol eder. Her 2 flag da reset durumunda ise dallanma gerçekleşir. Bir cmp operasyonundan hemen sonra kullanıldığında 1. sayının 2. sayıdan büyük olması durumuna göre dallanma gerçekleşir.

JG/JNLE Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılır. Yapılan operasyon sonrasında ZF reset, sign ile OF flaglarının değeri birbirine eşit ise dallanma gerçekleşir. İşaretli 1. değerin işaretli 2. değerden büyük olup olmadığını kontrol etmek üzere bir cmp komutunun hemen arkasından kullanulur.

JBE/JNA Komutu

 İşaretsiz sayılarda yapılan operasyonlardan sonra kullanılırlar. Operasyon sonrasında Carry veya ZF herhangi biri set edilmişse dallanma gerçekleşir.bir değerin başka bir değerden küçük yada eşit olup olmadığını öğrenmek üzere bir cmp komutunun hemen arkasından kullanılırlar.

ÖRNEK:0 ile 9 arasında herkangi bir rakamın sürekli kuvveti alınıyor. Girilen sayının kaçıncı kuvveti 1000 den büyük olduğunu hesaplayan program blognu yazınız.

JLE/JNG Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılırlar. Operasyon sonrasında ZF set veya SF<>OF ise dallanma gerçekleşir. İşaretli bir sayının işaretli başka bir sayıdan küçük yada eşit olup olmadığını kontrol etmek üzere bir cmp komutunun hemen arkasından kullanılır.

JNB/JNC/JAE Komutu

 İşaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılır. Operasyon sonrasında ZF set veya CF reset ise dallanma gerçekleşir. Bir cmp komutunun hemen arkasından kullanıldıklarında 1. değerin 2. değerden büyük yada eşit olup olmadığını kontrol edilir.

JNL/JGE Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra ZF set edilmişse yada sign ile OF flaglarının değerleri birbirlerine eşitse dallanma gerçekleşir. İşaretli bir değerin başka bir değerden büyük yada eşit olup olmadığını kontrol etmek üzere bir cmp komutunun sonrasında kullanılır.

JNZ/JNE Komutu

 İşaretli ve işaretsiz sayılar üzerinde yaılan operasyonlardan sonra kullanılırlar. Yapılan operasyon sırasında ZF reset ise dallanma gerçekleşir. Bir cmp operasyonundan hemen sonra kullanıldıklarında sayıların birbirinden farklı olması durumuna göre dallanma gerçekleşir.

JS Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılırlar. Sign flağının set durumuna göre dallanmaya sebep olurlar.

JNS Komutu

 İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılarak SF reset durumuna göre dallanma gerçekleşir.

JO ve JNO Komutları

 İşaretli sayılar üzerinde yapılan operasyonlarda kullanılarak yapılan operasyon sırasında OF set ediliyorsa JO komutunun, set edilmiyorsa JNO komutnun icrası gerçekleşir.

JCXZ Komutu

 Diğer koşullu dallanma komutlarından farklıdır. Diğer koşullu dallanma komutları bayrakların durumunu kontrol ederler.JCXZ komutu CX registerının durumunu kontrol eder.bu komutun icrası sırasında cx registerının değeri 0’a eşitse dallanma gerçekleşir. Aksi taktirde dallanma gerçekleşmez.

Tarih:
Hit: 1580752
Yazar: serhat8102



Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.