9 Aralık 2010 Perşembe

MAKİNE DİLİ

Eski arsivimden cikarttigim bir makale dokunmadan yayinliyorum surcu lisanimi affedin cocukluk zamaninda yazdigim ilk makalelerimden diye orijinal olarka yayinliyorum daha once www.bilgi.ofisi.com yayinliyordum

04.01.2002


MAKİNE DİLİ
(ASSEMBLY)

Once kavramlari aciklayalim
Assembly makine dili
Assembler derleyici



Yazımda takılabileceğiniz yerleri açıklamaya çalıştım ve sürekli olarak aynı terimleri defalarca İngilizce’sini veya Türkçe’sini parantez içinde sürekli kullandım. Sizin bunları sürekli görüp öğrenmeniz için.
Bu yazının büyük bir çoğunluğunu hiçbir kaynak kullanılmadan yazıldı fakat bir kısmı üniversite defterine ait olduğu için bir kaynağa ait olup olmadığını bilemiyorum. Böyle bir şey var ise bildirilirse çıkartabilirim.
  • Bilgisayarınız olsun J
  • İçinde Windows ve DOS, bunlar içinde programlama dilleri olsun
  • matematiğiniz olsun ve mantık hesaplarını biliniz
  • elektronik bilginiz olsun (sayısal elektroniğiniz de)
  • İngilizce’niz olsun
  • biraz çalışan beyin
Bir bilgisayarınız olmalı elbette
Bu işi yapmak için elinizde bulunacak eski bir 8086 bilgisayar yeterli olur. Şimdi soracaksınız benim bilgisayarım olur mu diye. Olur, çünkü bu işlemci temelli olması yeterli bilgisayarınızın ki şu an çıkan Pentium 4’ler bile bu temeli kullanır.
Şimdi asıl içeriğimize geçelim. Eğer temeliniz yoksa bu yazıyı okumanın sadece kafanızı karıştıracağını düşünüyorum.




INDEKS
1.                  Programlama Dilleri
2.                  Sayısal Elektronik ve Mantık Hesaplamaları
3.                  Assembly’e Giriş
3.1.                       Hafıza ve İşlemci (RAM & CPU)
3.2.                       Genel Amaçlı Kaydediciler (General Purpose Register)
3.2.1.                 AX, BX, CX, DX
3.2.2.                 DS, DS, SS, ES
3.2.3.                 SP, BP, SI, DI, IP
3.2.4.                 Program Status Word (Flag Register)
3.3.                       Genel Komutlar
3.3.1.                 MOV
3.3.2.                 INC
3.3.3.                 DEC
3.3.4.                 INT
3.3.5.                 CMP
3.3.6.                 JUMP .............
3.3.7.                 CALL – RET
3.4.                       Prototip Program ve Op Code için örnekler



1. Programlama Dilleri
Bilgisayarınıza işlem yaptırabilmek için ona birbiriyle bağıntılı toplu emirler vermeniz gerekir. Örnek verirsem. Susadın mı ? evet veya hayır olarak iki cevap gelir. Evet ise su iç hayırsa işlem yapma. Bu olay bilgisayar ile aranızda ortak bir dil kurulmasının gerektirir. Bu dil hanginize daha yakınsa diğeri daha çok zorlanır. Bir bilgisayarın anlayacağı en iyi dil makine dilidir. Bu dilde komutlar ve tanımlar yerini bilgi şekline dönüştürür. Yukarıdaki örneği makine dili için şöyle yaparız. Musluğu aç bardağı musluğun altına tut dolunca bardağı çek ve musluğu kapat. İşte bu ayrımdan dolayı dil seviyeleri ortaya çıkar.


2. Sayısal Elektronik ve Mantık Hesaplamaları
Hepimizin bildiği modern matematikte 10’luk sayı sistemini kullanırız. Fakat bizim kullandığımız sayı sistemi haricinde bilmemiz gereken 3 adet sayı sistemi daha var. İlk olarak kendi kullandığımız sistemi inceleyelim.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 : Bizim kullandığımız sayı sisteminde 10 rakam vardır. Bu sistemin adı 10’luk taban ya da Decimal sayı sistemi olarak bilinir.
Şimdi diğerlerine bakalım
0, 1 : Binary (2’lik) sayı sistemi
0, 1, 2, 3, 4, 5, 6, 7 : Octal (8’lik) sayı sistemi
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F : Hexadecimal (16’lık) sayı sistemi
Aslında tüm sistemler aynı sayılır. Sadece kullanım biçimi olarak değişiklik gösterir. Şuna açıklık getiriyim bu sayı sistemleri birbirlerine dönüşebilirler. Genelde şu vardır BINARY sayı sistemi ile 1’den büyük rakamlar nasıl yazılıyor. Yazılır J bunu maalesef burada anlatamayacağım. Ama tekrar söylüyorum tüm sayı sistemleri ile modern matematikte kullandığımız işlemleri yapabilirsiniz.
Sorumuzun cevabı : Bu sistemleri bilgisayar kullanır. Bilgisayar tüm bilgileri BINARY (2’lik sayı tabanı) olarak alır. Bunlar HEXADECIMAL kalıplar biçimli kullanılır. Örneğin veriyi byte’ler şeklinde okur fakat kendi iletişim trafiği içinde bunu muhakkak BINARY sisteme çevirir.
3. Assembly’e Giriş
3.1. Hafıza ve İşlemci (RAM & CPU
Hafıza (Random Access Memory) (Rasgele Erişimli Bellek)
Üzerinde çalışılan bir masa gibi düşünebiliriz. İşlemlerimiz için bu bölgeyi kullanılırız.

İşlemci (Central Proccess Unit) (Merkezi İşlem Birimi)
İşlemlerimizi yaptırdığımız yer bu kısımdır.

Çalışmalara. Hadi artık başlayalım;

Bir işlem yaptırmak nasıl oluyor bununla başlayalım. Şimdi bu karmaşık konuyu kafanızda canlandırabilmeniz için örnekler veriyorum.

Bir bilgiyi ekrana yazdıralım.
Öncelikle bu iş için hafızada bir bilgi olduğunu varsayalım. İşlemcimize şunu demeliyiz hafızanın şu bölgesindeki bilgiyi tut ve ekranın şu kısmına yaz.

Bir bilgiyi okutalım.
(bunu da otomatik yapabiliyor ama biz incelediğimiz için teorikleştiriyoruz)
İşlemcimiz klavyeden gelen her bilgiyi okusun. Sonra bunu hafızaya yerleştirsin ve ekranda da belirtsin.

Tabii yapabileceklerimiz bununla sınırlı değil işlemcimiz ile tüm donanımlara ait kontrolleri gelişmiş şekilde denetleyip, yönetebiliyoruz. Şimdi yukarıdaki iki örneğe tekrar dönelim dikkatinizi çekti mi bilmiyorum ama anlatayım. Biz önce bilgisayara hazır veriyi işlettik ikinci örnekteyse bilgisayardan bilgi alıp daha sonra bunu yazdırttık yani biz işlemciye hem bilgilerimizi işlettirebiliyoruz hem de işlemciden istediğimiz bir bilgiyi alabiliyoruz. Ya da bir işlem içinde ikisini de gerçekleştirebiliyoruz. Biz buna kesme isteği diyoruz.

IRQ (Interrupt Request) {Kesme İsteği}
Bilgisayara işlem yaptırırken bunu Kesme İstekleri ile yapıyoruz. Yine örnekliyorum; Aşağıda bilgisayarın tarihini değiştiriyoruz.

X değeri = 15             (ayın günü)
Y değeri = 3               (ay)
Z değeri = 2001        (yıl)
Kesme İsteği Kodu
İlgili Kesmeyi Yap

Gördüğünüz gibi örnekte bilgisayara parametre verip bunları işlemesini istedik şimdide biz bilgisayardan veri alalım.
Kesme İsteği Kodu
İlgili Kesmeyi Yap

X değeri = gün   (yani X günü gösteriyor)
Y değeri = ay    (Y ayı gösteriyor)
Z değeri = yıl   (Z yılı gösteriyor)

Şimdide bilgisayardan kesme ile return code (dönüş kodları) elde ettik.
Örneklerden de anlaşılabileceği gibi kesme ile işlemlerimizi yaptırabiliyoruz. Yukarıda gördüğünüz örnekleri makine diline çevirelim ve bu bilgileri tekrar incelemeye koyulalım.

mov DL, bugun
mov DH, ay
mov CX, sene
mov AH, 2B h
int 21 h
Parametreler sayesinde isteğimizi verileri belirlenmiş kaydedicilere aktarıp bilgisayara işletebiliyoruz.

mov AH, 2A h
int 21 h
mov gun, AL h
mov ay, DH h
mov sene,  CX h
Dönüş kodları işlem bitiminde elde edilen bilgiyi belirlenmiş kaydedicilere bizim kullanmamız için gönderiyor.

Yukarıdaki renklerin ne olduğunu hemen açıklayayım.

Sarı
renkler: mov ve int komutu
mov (move) komutu. Buradaki görevi eşittir işareti gibi düşünebilirsiniz. Yani MOV AX, 5 demek ax=5 anlamına gelir.
int (interrupt) komutu. İşlemleri yap anlamına gelir. Kendisine parametre olarak girilen kesme hizmetini devreye sokar

örneğin INT 21 h

Şimdide bu h ne anlama geliyor.
b           à binary (2’lik sistem)
o           à octal (8’lik sistem) {hemen hemen hiç karşılaşmazsınız}
d           à decimal (10’luk sistem) {bizim kullandığımız}
h           à hexadecimal (16’lık sistem)

Eğer bunları hatırlamadıysanız tekrar sayısal elektronik ve mantık hesaplarını okuyun.

Kırmızı renkler :
AX, BX, CX, DX (kaydediciler)
İşlem yapmak için kullandığımız bu kaydediciler parametre (dönüş kodları da bir nevi ters dönen parametredir) için kullanılanlarıdır. Şimdilik bunları değişken olarak görün.
3.2. Genel Amaçlı Kaydediciler (General Purpose Register)
3.2.1. AX, BX, CX, DX

Kaydediciler
Parametre işlemleri için kullanılan bu değişkenlere kaydedici denir. İsimleri sabittir. Kısaltmaları kullanılır.
AX       à accumulator
BX       à base
CX       à counter
DX      à data
Bu kaydediciler (register’lar) 16 bittir. (16 bit 2 byte yapar). Fakat ilginç bir kullanımları daha vardır. Bunları 1 byte şeklinde de kullanmanızı izin verilmiştir. Bunun için şöyle bölmüşlerdir. İlk 8 bit (ilk byte) ve son 8 bit (son byte) olarak. Yani
AX (2 byte)    à        AH (ilk byte)               à AL (son byte)
BX (2 byte)    à        BH (ilk byte)               à BL (son byte) - (1 byte=8 bit)
CX (16 bit)      à        CH (ilk 8 bit)               à CL (son 8 bit)
DX (16 bit)     à        DH (ilk 8 bit)               à DL (son 8 bit)
Fark ettiyseniz H’ler ilk kısım (HIGH yüksek demek). L’ler son kısım (LOW düşük demek). (Bazı kaynaklarda AX’in düşük kısmı diye geçebilir şaşırmanıza gerek yok çünkü AL’yi kastediyorlardır)

80386’dan sonra olması lazım (tam bilmiyorum) bu kaydedicilere yeni olarak EAX, EBX, ECX, EDX gibi yeni bir harf eklendi E J harfi bu harf sanırım EXTRA anlamına geliyor. EAX olarak ta 32 bit (4 byte) kaydedici şeklinde kullanabiliyorsunuz kaydedicileri. Böyle oluncada AX ise EAX’in düşük kısmı oluyor.
Bu öğrendiklerimizi pekiştirelim.
MOV EAX, AABBCCDD h              à EAX=AABBCCDD (hexadecimal)
Öyleyse
AX       = CCDD h
AH       = CC h
AL       = DD h
Bu örnek olayı anlamanıza yardımcı olmuştur ve güzel bir şey daha var hexadecimal sayılar bu iş için tam kullanımlık.
Tabii kaydedicilerin hepsi 4 tane değil (AX, BX, CX, DX). Bunlar haricinde birçok değişik görevli kaydedici var. En başında belirttiğim gibi bunlar parametre için en çok kullanılanları.
3.2.2. DS, DS, SS, ES
SEGMENT REGISTER
8086 ve 8088 işlemcisi kullanan bilgisayarlar programları ve dataları belleğin iki ayrı alanına yerleştirirler. Bu program ve data alanları max. 64 KB* büyüklüğünde olup Segment olarak isimlendirilir. 8086 ve 8088 işlemcisi aynı anda 4 segmente (Code, Data, Stack, Extra) sahip olabilir. Segmentin başlangıç adresinin gösterilmesi için sırasıyla CS, DS, SS ve ES segment regsiter’ları kullanılır. 220=1 MB* bellek adresleme yeteneğine sahip mikro işlemcide segment register’lar kullanılmak suretiyle 64 KB*’dan daha fazla bir alanın kullanılması sağlanır. Genel olarak 4 tür segment vardır.

* KB, MB gibi kavramları küçük harfle yazarsanız kilobit megabit olur. Burada ise KiloByte MegaByte anlamına geliyor. (kb<>KB & mb <> MB)
CODE SEGMENT
Bu segment çalışan programı içeren segmentin adresini gösterir. Diğer bir deyişle CS ile adreslenen segment içinde makine dili komutları yer almaktadır. Segmentin ilk baytından itibaren program parçası çalıştırılmaya başlanır.
DATA SEGMENT
Data segmenti register’i olan DS geçerli data segmentinin başlangıç adresini içerir. Bu segment genel olarak program değişkenlerini tarafından kullanılır. Diğer bir deyişle bilgi işlem operasyonlarında tabii tutulan bilgiler Data Segment içindeki lokasyonlara (bölümlerde) yer alır.
STACK SEGMENT
Bu segment alt programlara giderken dönüş adreslerini saklamak program bitiminde işletim sistemine dönmek için gerekli bölgelerin saklanmasında kullanılır.
EXTRA SEGMENT
Genel olarak string operasyonları için kullanılır.
BELLEK, SEGMENT VE OFFSET

D.......H
00.....00000
16.....00010
32.....00020
48.....00030
64.....00040
80.....00050 à dikkat ettiyseniz hepsinin son rakamı 0. (son oktet)

16’nın katları olan tüm hexadecimal sayılarda son rakam (son dijit) daima sıfırdır. Bu özellikten faydalanarak 20 bit uzunluğunda sayıların 16 bit ile adresleyebiliriz. Maksimum 64 KB’dan meydana gelen bölüm segment olarak isimlendirilir. Segmentler yani 64 KB büyüklüğündeki bellek blokları belleğin 16 ile tam olarak bölünebilen herhangi bir lokasyonundan (konumundan) itibaren başlar bir segmentim maksimum genişliği 65536 byte olduğuna göre segment içindeki her bir nokta 16 bit uzunluğundaki sayılar ile adreslenebilir. Bir segment içinde yer alan bir bellek bölgesinin adresini gösteren 16 bir uzunluğundaki işaretsiz tam sayıya offset denilir. Offset adreslerinin içinde bulunan segmentin sıfırıncı byte’ını başlangıç pozisyonu olmaktadır. Yani segment içindeki her bir byte offset dediğimiz adres ile belirlenir.
SEGMENT
Gerçek adresi bulmak için 16 h ile çarpılır (bu hexadecimal bir sayının sağına sıfır eklemekle aynı şeylerdir). Böylelikle 64 KB’dan büyük hafızalar sanki 64 KB gibi kullanılabilir.
Belirli segment register’ları için belirli offset register’ları kullanılır.

Segment         Offset             
CS                   IP
SS                   SP, BP
DS                   BX, SI, DI veya sabit
ES                   DI (string işlemlerde)
3.2.3. SP, BP, SI, DI, IP
IP ve BX register’larında birer pointer ya da index register’ı olarak kabul etmek mümkündür. Bu register’ların kullanımındaki asıl amaç segmentler içerisindeki offset adresini göstermek için kullanılır.

SP : Source Index -- String işlemlerde DS ile birlikte kullanılır.
DS : Destination Index -- Bazı string işlemlerinde DS ile birlikte kullanılır.
SP : Stack Pointer -- Stack segment’teki geçici stack alanlarını işaretlemek için kullanılır.
BP : Base Pointer -- Stack segment’teki geçici stack alanlarını işaretlemek için kullanılır.
IP : Instruction Pointer -- Komut göstergesi olan IP, CS içinde çalıştırılacak komutun offset adresini gösterir.
3.2.4. Program Status Word (Flag Register) (Durum Kaydediciler)

Bu register komut çalışması sonunda oluşan durumu test etmek için kullanılır.
Parametrelerden bahsetmiştik şimdide onlara yardımcı olan bir araçtan bahsedeceğim. Durum-Kaydedici(PWS) register-(kaydedici)’de yapılan bir işlemden sonra buradaki bayraklar (flag’lar) durumu bildirir.

Bazı bayraklar.
Z           à zero flag                 : sıfır bayrağı (ya da sıfır biti)
S          à sign flag                 : işaret bayrağı
O          à overflow flag         : taşma bayrağı
I            à interrupt flag         : kesme bayrağı
C          à carry flag                : elde bayrağı
T           à trap flag                 : adımlama bayrağı

Flag (bayrak) nedir ?
Flag’lar tek bitlik kayıtçılardır. Yani sadece 1 veya 0 gösterebilir. Flag 0 durumunu gösteriyorsa buna FALSE (reset), eğer 1 durumunu gösteriyorsa buna TRUE (set) denir. (Türkçe var yok gibi kelimelere çevirebilir)

Bayraklar ve Durumlarının Etkilenmesi
Zero Flag
Aritmetik ve karşılaştırma işlemlerinde sonuç 0 ise Z=SET olur. Aksi taktire RESET olarak bekler.
(1=SET= TRUE)

Sign Flag
Aritmetik işlemlerde sonuç pozitif ise S=SET olur.

Interrupt Flag
Kesme maskesi olarak kullanılır. I=1 ise kesme girişinde kesme kabul edilmez.

Carry Flag
Aritmetik işlemler sonucunda oluşan elde bitini depolar. Ayrıca ROTATE ve SHIFT işlemlerinde son biti depolar.

Overflow Flag
İşaretli sayılar üzerinde işlem yapılırken işaret biti üzerinde bir taşma olursa bu bayrak SET edilir.

*İşaretli Sayılar :
Sayılar çift yönlüdür yani negatif ve pozitif kısımları vardır.   Örneğin 65536 sayısı pozitif tam sayı olarak tanımlarsak 16 bit eder. Fakat biz  bu sayının eksi işaretlisini de kullanmak istersek 1 biti eksi işareti göstersin diye ayırıyoruz. O zamanda sayı için kullanabileceğimiz alan 15 bit’e düşüyor. 0 sayısıda pozitif olanlara dahil olduğu için pozitif sayılar negatif sayılarınkinden 1 eksiktir. Hepsini örnekleyelim

16 Bit sayı (tek duyarlı)
11111111.11111111           = 65536

16 Bit işaretli sayı (çift duyarlı)
1 1111111.11111111          = 32767
0 1111111.11111111          =-32768

İşaretsiz Sayılar :
Sadece pozitif sayılardır. 0’dan +(artı) sonsuza kadar olabilir.
3.3. Genel Komutlar
3.3.1. MOV komutu

Etkilenen bayraklar: [yok]
Genel Yazım Formları
mem   : memory (hafıza bölgesi)
reg      : register (kaydedici)
MOV reg, mem
MOV mem, reg
MOV mem, mem
MOV reg, reg
MOV (move) komutu. Buradaki görevi eşittir işareti gibi düşünebilirsiniz. Yani MOV AX, 5 demek ax=5 anlamına gelir.
3.3.1. INC (increment)

Etkilenen bayraklar: [AF OF PF SF ZF]
INC reg
INC mem
Parametre girilen bilgiyi bir sayı artırır.
MOV AX, 0
INC AX
AX=1 olacaktır.
3.3.2. DEC (decrement)

Etkilenen bayraklar: [AF OF PF SF ZF]
DEC reg
DEC mem
Parametre girilen bilgiyi bir sayı eksiltir.
MOV BX, 9
DEC BX
BX=8 olacaktır.
3.3.3. INT (interrupt)

Etkilenen bayraklar: [TF IF]
***under const.***
3.3.4. CMP (compare)

Etkilenen bayraklar: [AF CF OF PF SF ZF]
CMP reg, reg
CMP reg, mem
CMP mem, reg
CMP mem, immed
Karşılaştırma Komutudur. İki bilginin birbiriyle karşılaştırması için kullanılır. Karşılaştırma işlemi 3 basamakta yapılır.
  • İlk parametre bilgisi ikinci parametre bilgisinden çıkartılır.
  • Çıkan sonuç Durum Bayrağını (PWS) değiştirir.
  • Kendinden sonra gelen satır için Durum Bayrağını ayarlamıştır.
Bu kısmı biraz açıklamak istiyorum. Örneği inceliyelim

MOV AX,15h
MOV BX,15h
CMP AX, BX
Sizden buradaki CMP’yi ADD gibi düşünmenizi istiyorum. Fakat AX’in değerinin değişmediğini düşünün çünkü biz Durum Bayrağıyla ilgileniyoruz.... Böyle bir durumda bizim etkilenen bayraklarımız olacak örneğin ZF, CF, OF, SF gibi. Eğer biz AX’ten BX’i çıkartırsak ne olur. İlk olarak biz sayıların eşitliğini bulalım 15 - 15 = 0 ise ZF = SET olur. Diğer bayraklar RESET’ler (ki bizim şu an onlarla işimiz yok). Yani şöyle bağlıyayım, çıkartma işleminin sonucunun 0 olması için sayıların aynı olmasının gerektiğini biliyoruz. Öyleyse ZF = TRUE ise demektir ki sayılarımız eşit. Şimdi aşağıda bayrakları da verdiğim Jump koşullarına bakabilirsiniz.
3.3.5. JUMP .............

Genel Yazım Formatı
Jxxx* label
Koşul uyuşuyorsa label adresine git. Jump komutları bu iş için bayraklardan  faydalanırlar aşağıda size bunun dökümünü veriyorum.
Opr.1 ve Opr.2 İşaretis İse Opr.1 ve Opr.2 İşaretli İse Araştırılan Koşul
JZ, JE
JR, JC, JNAE
JA, JNBE
JB, JNA
JNB, JNC, JAE
JNZ, JNE
JZ, JE
JL, JNGE
JG, JNLE
JLE, JNG
JGE, JNL
JNZ, JNE
Opr1 = Opr2
Opr1 < Opr2
Opr1 > Opr2
Opr1 <= Opr2
Opr1 >= Opr2
Opr1 <> Opr2

Komut Komuntun tam ismi İşlevi İstenen koşul
*JE
*JNE
JB
JNB
JA
JNA
JBE
JAE
JNBE
JNAE
*JZ
*JNZ
JC
JNC
JP
JPE
JNP
JPO
JCXZ
-JL
-JNL
-JG
-JNG
-JLE
-JGE
-JNLE
-JNGE
-JO
-JNO
-JS
-JNS
Jump if Equal
Jump if Not Equal
Jump if Below
Jump if Not Below
Jump if Above
Jump if Not Above
Jump if Below or Equal
Jump if Above or Equal
Jump if Not Below nor Equal
Jump if Not Above nor Equal
Jump if Zero
Jump if Not Zero
Jump if Carry
Jump if Not Carry
Jump if Parity
Jump if Parity Even
Jump if Not Parity
Jump if Parity Odd
Jump if CX is Zero
Jump if Less
Jump if Not Less
Jump if Greater
Jump if Not Greater
Jump if Less or equal
Jump if Greater or Equal
Jump if Not Less nor Equal
Jump if Not Greater nor Equal
Jump if Overflow
Jump if Not Overflow
Jump if Sign
Jump if Not Sign
Eşitse
Eşit değilse
Küçükse
Küçük değilse
Büyükse
Büyük değilse
Küçük veya eşitse
Büyük veya eşitse
Küçük değil ve eşit değilse
Büyük değil ve eşit değilse
Sıfırsa
Sıfır değilse
Taşma varsa
Taşma yoksa
Bitler çift sayıda ise
Bitler çift sayıda ise
Bitler çift sayıda değilse
Bitler tek sayıda ise
CX'in değeri sıfır ise
Küçükse
Küçük değilse
Büyükse
Büyük değilse
Küçük veya eşitse
Büyük veya eşitse
Küçük değil ve eşit değilse
Büyük değil ve eşit değilse
Taşma varsa
Taşma yoksa
Negatif ise
Pozitif ise
ZF=1
ZF=0
CF=1
CF=0
CF=0 and ZF=0
CF=1 or ZF=1
CF=1 or ZF=1
CF=0
CF=0 and ZF=0
CF=1
ZF=1
ZF=0
CF=1
CF=0
PF=1
PF=1
PF=0
PF=0
CX=0000
SF<>0F
SF=0F
ZF=0 and SF=0F
ZF=1 or SF<>0F
ZF=1 or SF<>0F
SF=0F
ZF=0 and SF=0F
SF<>0F
OF=1
OF=0
SF=1
SF=0
*:İşaretli sayılar üzerinde yapılan operasyonlardan sonra kullanılır
-:hem işaretli hemde işaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılır.
NOT:* ve - işaretli olan komutlar işaretsiz sayılar üzerinde yapılan operasyonlardan sonra kullanılır.
3.3.6. ADD, MUL, DIV

Etkilenen bayraklar: [AF CF OF PF SF ZF]
Genel Yazım Formatı
ADD kaynak, hedef
ADD reg, reg
ADD reg, mem
ADD mem, reg
ADD mem, immed

Yapılan işlem sonrası gösterilen hedef, kaynağa eklenir. Örneğin;

MOV AX, 5
MOV BX, 3
ADD AX, BX
İşleminden sonra
AX=8
BX=3 olacaktır.

Çıkartma işlemi içinde aynı sırayı takip edebilirsiniz. Çıkartma, çarpma ve bölme aslında bir tür seri toplama işlemidir. Yani çıkartma işlemi içinde ADD kullanıyoruz. Örneğin 8’den 3’ü çıkartalım.

MOV AX, 8
ADD AX, -3
AX=5 olmuştur.
MUL (multiply)
Etkilenen bayraklar: [CF OF], [AF,PF,SF,ZF belirsiz]

MUL reg
MUL mem
IMUL

Bu kısımları özet olarak geçiyorum. MUL ile işaretsiz sayıları çarpabilirsiniz IMUL ilede işaretli sayıları çarpabilirsiniz.

Etkilenen bayraklar: [AF,CF,OF,PF,SF,ZF belirsiz]

DIV reg
DIV mem
IDIV
DIV (divide)

DIV ile işaretsiz sayıları IDIV ilede işaretli sayıları bölebilirsiniz.
3.3.7. Bazı komutlar (biraz bildiğini varsayanlar baksın)

CALL - RET

Bir tür prosedür gibi düşünebilirsiniz. Programı bu şekilde bölütlere ayırarak daha etkin kullanabilirsiniz. Bir CALL içine girildikten sonra RET komutu görülünceye kadar ilerlenir. (BASIC dilindeki gosub ve return komutu gibi;-)

PUSH - POP
PUSH, POP               : genel amaçlı yığıtçılar
PUSHA, POPA         : EDI, ESI, EBP, ESP, EDX, ECX, EAX sakla
PUSHF, POPF          : bayrakların durumunu yığıtla

Kaydedici, Hafıza veya Durum Bayraklarını saklamanızı sağlar.

Şöyle düşünelim kullandığımız değişkenler çok sınırlı bir miktarda bunları bir şekilde bir yerlerde de saklamamız gerekli işte    bunun için hafızada yığıt (stack) yaparız. Siz her saklama işlemi yaptığınızda hafızaya bir bilgi eklenir.   {her yeni bilgi SS:SP’nin üstüne atılır.}
Daha sonra sakladığınız bilgileri geri çağırmak için POP’u kullanırız.

LOOP
Genel Yazım Formu :  LOOP label
Genel amaçlı sayıcıdır. CX’ 0 olana kadar LABEL’a sürekli döner durur.

0100: MOV DX, 0
0103: MOV CX, 5
0106: ADD DX, CX
0108: LOOP 0106

program bitiminde dönen değerler böyle olur.
CX = 0 h
DX = F h
(for döngülerine benzetebilirsiniz)
3.4. Prototip Program ve Op Code için örnekler

Hiç yorum yok:

Yorum Gönder