1.BÖLÜM 1.SAYI SİSTEMLERİ

Benzer belgeler
Adresleme Modları. Mikroişlemciler ve Mikrobilgisayarlar

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

8086 Mikroişlemcisi Komut Seti

Mikroişlemcili Sistemler ve Laboratuvarı 8.Hafta

Ders 3 ADRESLEME MODLARI ve TEMEL KOMUTLAR

MTM 305 MİKROİŞLEMCİLER

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI İKİLİ TABANDA ÇOK BAYTLI ÇARPMA

Program Kontrol Komutları. Mikroişlemciler ve Mikrobilgisayarlar 1

Bölüm 3: Adresleme Modları. Chapter 3: Addressing Modes

3.3. İki Tabanlı Sayı Sisteminde Dört İşlem

JZ TEST3 (7/3) 1 makine çevrimi süresi

MTM 305 MİKROİŞLEMCİLER

MTM 305 MĠKROĠġLEMCĠLER

Bildiğiniz gibi programları oluşturan kodlar ve veriler hafızaya yüklendikten sonra işlemci tarafından satırsatır icra edilirler.

SAYISAL ELEKTRONİK. Ege Ü. Ege MYO Mekatronik Programı

Quiz:8086 Mikroişlemcisi Mimarisi ve Emirleri

MTM 305 MİKROİŞLEMCİLER

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri

EGE ÜNİVERSİTESİ EGE MYO MEKATRONİK PROGRAMI

BIL 362 Mikroilemciler Dersi Arasınav Cevapları 3 Temmuz 2007

10 LU SAYISAL SİSTEMİ İLE 2 Lİ SAYISAL SİSTEMİ ARASINDA ÇEVİRİM UYGULAMASI

Aritmetiksel Komutlar

BM-311 Bilgisayar Mimarisi

KOMUT TABLOSU İLE İLGİLİ AÇIKLAMALAR:

Şekil. 64 Kelimelik Yığıtın Blok Şeması

Fatih University- Faculty of Engineering- Electric and Electronic Dept.

2. SAYI SİSTEMLERİ VE KODLAR

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

8086 Mikroişlemcisi Komut Seti

Giriş MİKROİŞLEMCİ SİSTEMLERİ. Elektronik Öncesi Kuşak. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Kuşak. Bilgisayar teknolojisindeki gelişme

Bölüm 4 Veri Aktarma Komutları

8086 dan core2 ya yazaç yapısını tanımak. Bayrak yazacının içeriğinde yer alan bayrakların görevlerini tanımlamak. Real mod çalışmada bellek

Bir işaretli büyüklük sayısında en soldaki basamak bir işaret içerir. Diğer basamaklarda ise sayısal değerin büyüklüğü (mutlak değeri) gösterilir.

Özet DERS 5. Şu ana kadar bilmeniz gerekenler... İşaretsiz Çarpma. Bayraklardaki Durumlar. İşaretli Çarpma

ALGORİTMA VE PROGRAMLAMA II

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

MTM 305 MĠKROĠġLEMCĠLER

Assembly Dili Nedir? Assembly dili biliyorum derken hangi işlemci ve hangi işletim sistemi için olduğunu da ifade etmek gerekir.

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri 2. SAYI SĐSTEMLERĐ VE KODLAR

MTM 305 MĠKROĠġLEMCĠLER

C Konsol Giriş Çıkış Fonksiyonları

Yrd. Doç. Dr. Caner ÖZCAN

HAFTA 1 KALICI OLMAYAN HAFIZA RAM SRAM DRAM DDRAM KALICI HAFIZA ROM PROM EPROM EEPROM FLASH HARDDISK

MTM 305 MĠKROĠġLEMCĠLER

ALGORİTMA VE PROGRAMLAMA I DERS NOTU#8

Mikrobilgisayar Donanımı

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

MİKROBİLGİSAYAR SİSTEMLERİ VE ASSEMBLER

Elektronik sistemlerde dört farklı sayı sistemi kullanılır. Bunlar;

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

BIL 362 Mikroilemciler Dersi Final Sınavı Cevapları

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

MİKROBİLGİSAYAR SİSTEMLERİ VE ASSEMBLER

Mikrobilgisayar Mimarisi ve Programlama

PROGRAMLAMAYA GİRİŞ DERS 2

Yrd.Doç.Dr. Celal Murat KANDEMİR. Kodlama (Coding) : Bir nesneler kümesinin bir dizgi (bit dizisi) kümesi ile temsil edilmesidir.

C Programlama Dilininin Basit Yapıları

Göstericiler (Pointers)

SAYI SİSTEMLERİ. Sayı Sistemleri için Genel Tanım

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Bölüm 5: ARITMETIK VE MANTIK IŞLEM YAPAN KOMUTLAR

Özyineleme (Recursion)

x86 Ailesi Mikroişlemciler ve Mikrobilgisayarlar

Genel Programlama II

DERS 3 MİKROİŞLEMCİ SİSTEM MİMARİSİ. İçerik

2. SAYI SİSTEMLERİ. M.İLKUÇAR - imuammer@yahoo.com

Algoritma ve Programlama: Karar Yapıları ve Döngüler

ÖZET. Lojiksel ve Hiziksel Hafıza. x86 byte düzeni nın Fiziksel Hafıza Yapısı. Ders 3. Temeller

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Diziler İndisli Değişkenler

Bilgisayarların Gelişimi

Yrd. Doç. Dr. Caner ÖZCAN

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

Mikrobilgisayar Mimarisi ve Programlama

Her bir kapının girişine sinyal verilmesi zamanı ile çıkışın alınması zamanı arasında çok kısa da olsa fark bulunmaktadır -> kapı gecikmesi

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

EBG101 PROGRAMLAMA TEMELLERİ VE ALGORİTMA

2011 Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

MTM 305 MĠKROĠġLEMCĠLER

Microsoft Office Excel 2007

Mikrobilgisayarda Aritmetik

PASCAL PROGRAMLAMA DİLİ YAPISI

MİKROBİLGİSAYAR SİSTEMLERİ. Teknik Bilimler Meslek Yüksekokulu

Pointer Kavramı. Veri Yapıları

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI MİKROİŞLEMCİLİ A/D DÖNÜŞTÜRÜCÜ

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

İŞLEMCİ DURUM KAYDEDİCİSİ (PROCESSOR STATUS REGISTER)

Sayılar Teorisi SAYILAR TEORİSİ VE SAYILAR

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

Bilgisayar İşletim Sistemleri BLG 312

Genel Programlama I

BM-311 Bilgisayar Mimarisi

SAYISAL ELEKTRONİK DERS NOTLARI:

Algoritma ve Programlamaya Giriş

b) Aritmetik İşlem Komutları

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Yrd. Doç. Dr. Caner ÖZCAN

Mikrobilgisayarlar. Mikroişlemciler ve. Mikrobilgisayarlar

Transkript:

1.BÖLÜM 1.SAYI SİSTEMLERİ Başka bir gezegeni ziyaret etmedikçe, nesneleri ondalık sayılar kullanarak sayarak hayatımızı geçiririz. Matematikçiler ondalık ifadesini 10 tabanında sayma sistemi olarak değerlendirirler. Çünkü bu 0 ile 9 arasında 10 rakamdan oluşmaktadır. İnsanoğlu ondalık sayılarla daha rahat sayabilmektedir. (Belki de on el ve ayak parmağı olduğu için.) Ama bilgisayarlar böyle değil. Bunun yerine bilgisayarlar 2 lik tabandaki (binary) sayma sistemiyle sayarlar. Bu tabanın yalnız iki rakamı vardır. 0 ve 1. Bundandır ki bilgisayarlar kendi düzeylerinde haberleşirler. (Siz bunu assembler dili kullandığınızda yaparsınız.) İkilik (binary) sayma sistemine alışık olmalısınız. Binary yanında, assembler-dili programcıları bir diğer sayma sitemi olan 16 tabanındaki (hexadesimal) sayma sitemine de iyi derecede alışık olmalıdırlar. Bu bölüm daha önce hiçbir birikimi olmayan okuyucular için bilgisayar sayı sistemlerini ele alır. Eğer zaten binary ve hexadesimal sayma sitemlerini biliyorsanız bu bölümü atlayabilirsiniz. 1.1.İKİLİK (BINARY) SAYMA SİSTEMİ Bir bütün program talimatlarını ve veriyi belleğinden alır. Bellek binlerce elektrikli bileşen içeren tümleşik daireler (ya da yongalar) kapsar. Işık anahtarları gibi bu bileşenlerde yalnız iki olası ayar vardır. On ya da off. Hala yalnızca bu iki ayarla, bellek bileşenleri kombinasyonları herhangi bir boyutun sayılarınız gösterebilir. Nasıl mı? Okumaya devam edin. Bellek bileşeninin On ve Off ayarları ikilik sayı sisteminin iki rakamıyla uyuşmaktadır. Bu bilgisayarın temel sistemidir. Yalnızca iki rakamımız var. 1 (On) ve 0 (Off). İkilik sayı sistemi bir 2 tabanı sitemidir. Yeniden, bu durum ikilik sayı sistemini 10 rakama sahip (0 ile 9 arasında) standart ondalık sayı sisteminden ayırır. Belleğin anahtara benzer bileşenleri bits (binary digits in kısaltması) diye adlandırılır. Gelenek olarak, bir bit on olduğunda 1 değerini off olduğunda 0 değerini alır. Bu gösterir ki bir ondalık rakamı (0 ile 9 arasında) düşünene kadar sınırlandırır. Şimdi siz ondalık rakamları 9 dan büyük formda sayılara birleştirebiliyorsanız, binary rakamları da 1 den büyük sayılara birleştirebilirsiniz. Bildiğiniz gibi 9 dan büyük ondalık sayıları göstermek için ek onlu rakamlara ihtiyacınız var. Benzer şekilde 99 dan büyük ondalık sayıları göstermek için bir yüzlü rakama gerek var ve böyle devam eder. Her ondalık rakam için hemen sağına 10 un katları rakamları eklemelisiniz. 1

Örneğin; 324 sayısını göstermek için (3*100)+(2*10)+(4*1) ya da böyle (3*10 2 )+(2*10 1 )+(4*10 0 ) Böylece, her ondalık rakamda 10 un gücü önündeki rakamdan daha büyüktür.benzer kural ikilik sistemde de uygulanır. Burada her ikilik rakamda ikinin gücü önündeki rakamdan daha büyüktür. En sağdaki bit 2 0 ın katına sahiptir (Ondalık 1). Sonraki bit 2 1 nin katına sahiptir (Ondalık 2) ve böyle gider... Örneğin: İkilik 101 sayısı ondalık 5 değerindedir. Çünkü: 101 2 = (1*2 2 ) + (0*2 1 )+ (1+2 0 ) = (1*4) + (0*2) + (1*1) = 5 10 Binary sayılarının nasıl inşa edildiğini anlayabiliyor musunuz. Verilen herhangi bir bit konumunun değerini bit durumunun öncellenmesinin ağırlığını iki katına çıkarırsınız. Böylece ilk sekiz bitin binary ağırlığı 1, 2, 4, 8, 16, 32, 64 ve 128 olur. Bu durum Şekil 0-1 de gösterilmiştir. 7 6 5 4 3 2 1 0 BIT KONUMU 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 İKİ ONDALIK 128 64 32 16 8 4 2 1 DEĞERİN GÜCÜ Şekil.1.1 Sekiz ikili rakamın ağırlıkları. Ondalık sayıyı ikilik sayıya çevirmek için bir dizi basit çıkarama işlemi yapın. Her çıkarma prosedürü bir tekil ikilik rakam (bit) değeridir. Başlamak için en büyük olası ikilik ağırlığı ondalık değerden bu bit konumuna 1 girin. Sonra sonraki en büyük ağırlığı sonuçtan çıkarın ve bu bit konumuna bir 1 girin. Sonuç 0 2

olana kadar devam edin. Herhangi bir güncel ondalık değerden çıkarılamayan ağırlıklı bir konuma bir 0 girin. Örneğin: Ondalık 50 yi ikiliğe çevirmek için. 50-32 bit konumu 5 = 1 18-16 bit konumu 4 = 1. 2-2 bit konumu 1 = 1 0 Değer bit değerlerine (3,2 ve 0 bitlerine) bir 0 girmek sonuç değerini vermeyi sağlar. Sonuç 110010 Ondalık 50 nin eşiti ikilik değerin gerçekten 110010 olduğunu doğrulama için, 1 in konumlarının ondalık ağırlıklarını toplayın. 32 (bit 5) 16 (bit 4) - 2 (bit 1) 50 1.1.1.Sekiz Bit Bir Byte Eder Apple II Ailesi Commodore 64 ve VIC-20, Radio Shack TRS-80 ve diğer ünlü mikrobilgisayarların mikroişlemcileri 8-bit çevresinde tasarlanırlar. Sekiz-bit mikroişlemciler zaten böyle isimlendirilmiştir. Çünkü bunlar bilgiyi bir anda sekiz bit olarak işlerler. İşleme sekiz bitten daha fazla olduğunda bu mikroişlemciler ek işlemler gerçekleştirmelidir. Bilgisayar terminolojisinde bilginin bit 8-bit birimi byte olarak adlandırılır. Sekiz bitle, bir byte 0 (ikilik 00000000) ile 255 (ikilik 11111111) arasında ondalık değerlerle gösterilir. Bir byte işleme biriminin temelidir. Mikrobilgisayarlar belleklerinin tutabildiği byte numaralarının açıklaması içinde tanımlıdır. Mikrobilgisayar üreticileri belleği 1,024 byte lık blokların içinde inşa ederler. Bu belirli miktar 2 10 byte gösteriminde bilgisayarların ikilik yönelimini yansıtır. 3

1.024 değerinin bir standart kısaltması vardır. Bu K harfidir. Bu sayede bir bilgisayar 256*1.024 (ya da 262,144) byte içeren 256K bellek içerir. 1.1.2.İkilik Sayıları Toplamak İkilik sayıları ondalık sayılarla aynı yolla toplayabilirsiniz: Bir sütundan sonrakine fazlayı taşıyarak. Örneğin ondalık 7 ve 9 değerlerini toplamak için: onlar sütunundan üretilmiş doğru sonucu (16) bir 1 taşımalısınız. Benzer bir şekilde, 1 ve 1 ikilik değerini toplamak için, ikiler sütunundan üretilmiş doğru değere (10) bir 1 taşımalısınız. Çoklu-bit sayılarını toplamak biraz karmaşık olur. Çünkü siz bir önceki sütundan bir elde sağlamalısınız. Örneğin bu işlem iki elde gerektirir. 1011 + 11. 1110 En sağdaki sütunun toplanması (1+1) 0 sonucunu üretir ve 1 in bir eldesi ikinci sütunun içinedir. Eldeyle birlikte ikinci sütunun toplanması ( 1+1 +1) 1 sonucunu üretir ve bir elde de üçüncü sütunun içinedir. İkilik toplamada genel kurallar bu tabloda gösterilmiştir. Tablo.1.1. İkilik Toplamada Genel Kurallar: Girdiler Sonuçlar Operand #1 Operand #2 Elde Toplam Elde 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 4

1.1.3.İşaretli Sayılar Şimdiye kadar ikilik içindeki işaretsiz sayıların nasıl gösterildiğini tartıştık. Daha önce andığımız gibi bir işaretsiz sayının içindeki her bit onun konumunu yansıtan bir ağırlığa sahiptir. En sağdaki (ya da) en az-belirgin bit 1 in ağırlığına sahiptir. Her daha belirgin bit iki kez ağırlığa sahipse bu onun öncelidir. Böylelikle, eğer bir byte taki her sekiz bit 0 sa byte 0 değerine sahiptir. Eğer hepsi 1 ise, byte 255 değerine sahiptir. Bununla beraber, siz sık sık pozitif ve negatif değerleri işletmek isterseniz. Bu işaretli sayılar dadır. Bir byte bir işaretli sayı yalnızca yedi en az-belirgin bit (0-6 arası) veriyi gösterir. En belirgin bit (7) sayının işaretini belirtir. İşaret biti 0 ise sayı pozitif ya da sıfır ve 1 ise sayı negatiftir. Şekil 0-2 işaretli ve işaretsiz byte ların sırasını gösterir. 7 6 5 4 3 2 1 0 işaretsiz sayı 7 6 5 4 3 2 1 0 her bit veri gösterir 0 pozitif işaretli sayı düşük seviyeli bitler veri gösterir işaret biti=0 7 6 5 4 3 2 1 0 1 negatif işaretli sayı ikinin-bileşeni formundaki düşük seviyeli bitler veri gösterir, işaret biti=1 Şekil.1.2. İşaretli ve işaretsiz sayıların gösterimi. 5

İşaretli sayı tutulurken, bir tekil byte 0 (ikilik 00000000) ve +127 (ikilik 01111111) arasında pozitif değerleri gösterebilir. Ve 1 (ikilik 11111111) ve 128 (ikilik 10000000) arasında negatif değerleri gösterir. Not: -1 ikilik olarak 11111111 dir. Bu 10000001 den daha kolay değil midir? (Bu, 1 ve bir eksi işaret bitidir.) Hayır. Bu yanlış yanıtlar üretebilir. Düşünün Örneğin, +1 ve 1 eklerseniz ne olur. Yanıt kesinlikle 0 olmalı. 00000001 = +1 + 10000001 = -1 10000010 = -2 Böylece -1 göstermek için birkaç yol gerekir. +1 eklediğimizde 0 elde ederiz. 1 için 11111111 ile geldiğinde: bu doğru yanıtı üretir. Bunu test etmek için toplamamızı yeniden yapalım... 00000001 = +1 + 11111111 = -1 1 00000000 = 0 Başındaki fazladan 1-bit elde dir. Artık bit toplamadan gelir. Basitçe yok sayabiliriz. 1.1.4.İkinin Bileşeni -1 deki gibi tüm negatif işaretli sayılar özel bir formda gösterilmiştir. Bu yapılan toplamalarda doğru yanıtları üretir. Buna ikinin bileşeni formu denir. Negatif sayıların ikilik gösterimini bulmak için (bu ikinin bileşen formunu bulmaktır.) basitçe sayının pozitif formunu alın ve her biti tersine çevirin. (--- her 1 i 0 a ve her 0 ı 1 e ---) sonra sonuca 1 ekleyin. Örneğin devamında 32 nin ikinin bileşeni ikilik gösteriminin nasıl hesaplanacağını gösteriyor. 6

00100000 +32 11011111 her biti tersine çevir + 1 1 ekle 11100000-32, ikinin bileşeni formunda Şüphesiz, ikinin bileşeni dönüşümü negatif sayıları zor çözülür yapar. İyi ki aynı prosedürü bir (ikinin tümlenmişi) negatif sayının pozitif formunu bulmak için verdiğimizde de kullanabiliyoruz. Örneğin: 1101000 değerinin sahip olduğu değeri bulmak için aşağıdaki gibi bir yol izlenir. 00101111 her biti ters çevir + 1 1 ekle 00110000 = 16+32=48 Assembler programları ayıları ondalık formda (işaretli ya da işaretsiz) girmenize isin verir ve kendiliğinden bütün dönüşümleri yapar. Bununla birlikte bu dönüşümleri kendiniz yapabilecekseniz bellekte ya da bir saklayıcının içinde saklanmış bir negatif sayının açıklamasını yapmak isteyebilirsiniz. 1.2.HEXADESİMAL (ONDALIK) SAYILAR: Gerçi, ikilik sayı sitemi, belleğin içine gönderilmiş sayıları göstermek için işe yarar bir yoldur. Yalnız birinin stringi ve sıfırlarla çalışmak çok zordur. Bunlar zaten hataya meyillidir. Çünkü 10110101 gibi bir sayı, kötü tip tanımlamak için aşırı derecede kolaydır. Yıllar önce, programcılar genel olarak bitlerin gruplarıyla işlem yapmanın tek bitlerle işlem yapmaktan daha iyi olduğunu buldular. En başlangıçtaki mikroişlemciler 4-bit aygıtlardı (bir anda dört bit bilgi işlenirdi). Bu nedenle mantıksal alternatif olan ikilik bitleri dördün grupları olarak numaralayan bir sistemdi. Bildiğiniz gibi, dört bit ikilik değerleri 0000 ile 1111 arasında (ondalık 0 ile 15 değerleri arasına eşittir), 16 olası olası kombinasyonun bir toplamı olarak gösterir. Eğer sayma sistemi bu 16 kombinasyonda gösterirse, 16 rakama sahip olmalıdır. Bu da bir taban 16 sistemi olmalı Eğer taban 2 sayılıysa binary ve taban 10 sayılıysa desimal denir. Peki bir taban 16 sitemi için hangi terim uygundur? Evet herkes taban 16 sistemini bir Yunan sözcüğü olan hex (6 için) ile bir Latin sözcüğü olan decem (10 için) birleşimiyle oluşan hexadecimal 7

(hexadesimal) ismiyle isimlendirdi. Bu sayede taban 16 sistemine hexadesimal (onaltılı) sayı sistemi dendi. Hexadesimal sayı sistemindeki 16 rakamın ilk 10 u 0 ile 9 arasındadır. (ondalık 0 ile 9 arasındaki değerler) ve son altısı A ile F arasında (ondalık 10 ile 15 arası değerler) etiketlendi. Tablo 0-2 her hexadesimal rakamın ikilik ve ondalık değerini listeler. Tablo.1.2. Hexadesimal Sayı Sistemi: Hexadesimal Rakam Binary Değeri Ondalık Değeri Hexadesimal Rakam Binary Değeri Ondalık Değeri 0 0000 0 8 1000 8 1 0001 1 9 1001 9 2 0010 2 A 1010 10 3 0011 3 B 1011 11 4 0100 4 C 1100 12 5 0101 5 D 1101 13 6 0110 6 E 1110 14 7 0111 7 F 1111 15 İkilik rakamlar ve ondalık rakamlar gibi her hexadesimal rakamda kendi tabanının bazı katlarında bir ağırlığa sahiptir. 16 tabanlı hexadesimal sayı sisteminde her rakam ağırlığı bir sağındaki bir sağındaki rakamdan daha büyüktür. Bu 16 defa sürer. En sağdaki rakam bir 16 0 ın ağırlığındadır. Yanındaki 16 1 ağırlığında, ve böyle devam eder.örneğin: Onaltılı 3AF değeri ondalık 943 değerine sahiptir. Çünkü: (3*16 2 ) + (A*16 1 ) + (F*16 0 ) ondalık formda (3*256) + (10*16) + (15*1) = 943 1.2.1.Hexadesimal Sayıları Kullanma BASIC ve diğer yüksek-düzeyli diller genellikle sayıları ondalık formda gösterirken, assembler dili genellikle sayıları hexadesimal formda gösterir. Bu adresleri, talimat kodlarını ve bellek bölgesiyle saklayıcılarının içeriğini kapsar. Böylelikle programınızdan en yüksek verimi almanız için hexadesimal düşünmeyi deneyin. Bu ilk başta zordur, ancak bu daha fazla deneyim kazanmanızı kolaylaştırır. 8

1.3.ASCII / BINARY KOD DÖNÜŞÜMLERİ Bilgisayar her zaman klavye karakterlerini ASCII ye çevirir. Girdi bir sayı sunarsa, işlemci onu işletmeden önce binary ye ya da BCD ye dönüştürmelisiniz.. Aynı şekilde önce bir sayı yazdırabilir ya da bunu ekran üzerinde gösterebilirsiniz. Bunu ASCII forma sokmanız gerekir. Biz her problemi bu bölümde adresleyeceğiz: ASCII sayıdan binary ye ve binary sayıdan ASCII ye nasıl dönüştürülür. (ASCII ve BCD arasındaki dönüşüm benzer prosedür gerektirir. Bu alıştırma okuyucuya bırakılmıştır.) 1.3.1.ASCII Strigleri Binary ye Dönüştürme: Tablo, 6-8 0 ile 9 arasındaki rakamlar için ASCII kodlarını gösterir. Görebileceğiniz gibi değer aralığı 30H dan 39H2a kadardır. Zaten ondalık rakamın binary eşiti basitçe ASCII kodun düşük dört biti olduğu not edilmiştir. Tablo.1.3. Ondalık Rakamlar İçin ASCII kodları ASCII Değer (Hex) Ondalık Rakam(Dec) 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 38 8 39 9 Daha önce söylediğimiz gibi ondalık sayılar 10 un kuvvetleriyle çarpılmış rakamları dizisiyle açıklanmıştır. Örneğin: 237 = (7*1) + (3*10) + (2*100) ya da 237 = (7*10 0 ) + (3*10 1 ) + (2*10 2 ) Bir anda bir rakam olarak sayıları girmemizden beri, bir ASCII-tabanlı ondalıktan ikiliğe dönüşüm yordamı ondalık ağırlıkları için hesap yapmalı. Bu yordam bir ya da daha çok 10 ile çarpma işlemi içermeli anlamına gelir. Örneğin: operatör tipleri 93 ise, siz 3 eklemeden önce 9 ile 10 u çarpmalısınız. Genelde, dönüşüm süreci bu düzende işler. 9

Dönüşüm yordamı ilk (en belirgin) rakamı ASCII kodun dört yüksek-düzende biti olarak parçalara ayırarak binary ye çevirmelidir. Sonra binary değerini kısmi sonuca kaydeder. Yordam birkaç alt dizi rakamlarını binary ye dönüştürmelidir., bir önceki kısmi sonucu 10 la çarpmalı, sonra yeni rakamı çarpıma (bu yeni bir kısmi sonuç üretir) eklemelidir. 1.4.ASCII den Binary ye Dönüşüm Algoritması Siz genellikle negatif sayıları pozitif sayılar kadar iyi dönüştürmeye ihtiyaç duyarsınız. Ve sayılar bir ondalık ayıracı içerir, böylece dönüşüm programınız eksi (-) ve nokra (.) karakterlerini de hesaplamalı. Şekil 6-3 bellek içindeki bir ASCII stringi ikinin bileşeni (işaretli) binary sayıya çeviren bir algoritma için akış diyagramıdır. Sayıların 16-bite sığdığını varsayarız, böylece sayıların limiti 32768 ile +32767 dir. Başlamak için, sonuç ve ondalık sayaç (ondalık ayıracının sağındaki rakamların sayısı) sıfırlanır ve program geçen öndeki blokları tarar. Bu noktadan program sayının negatif ya da pozitif olup olmamasına bakarak iki yoldan birini alır. Bu yollar benzerdir. Dönüştürülmüş negatif negatif sayıların hariç tutulması bir pozitif sayı 32,767 ye karşı denetlenmişken negatif sayı 32,768 e karşı denetlenmiştir. Ve tümlenmiş olmalıdır. Şekil 6-3A da güncel dönüşümü yapan CONV_AB adlı prosedürün akış diyagramı verilmiştir. CONV_AB prosedürü sonraki string karakterinin ondalık ayıracı olup olmadığını denetleyerek başlar. Eğer ayıraç varsa, CONV_AB kalan karakter sayısını ondalık sayaç olarak kaydeder, sonra string göstergesini ilerletir. Eğer sonraki karakter ondalık ayıracı değilse CONV_AB onun ondalık rakam olup olmadığını denetler. Eğer bu karakter bir rakam değilse CONV_AB bunun geçersiz olduğunu bildirir ve bir hata göstergesi ayarlar. Sonra çağrılan programa geri döner. Geçerli bir rakam karakteri bulma üzerine CONV_AB güncel kısmı sonucu 10 la çarpar. Sonra ASCII karakteri bir rakama çevirir ve sonra bunu sonuca ekler. Eğer toplama elde üretirse, CONV_AB bir hata göstergeci ayarlar ve döner. Başka şekilde bu ayıracı arttırır ve ondalık ayıraç denetleme talimatlarına geri döner. Tüm string dönüştürüldüğünde, CONV_AB çağrılan programa geri döner. 1.4.1.Ascıı den Bınary ye Dönüşüm Programı Örnek.1.1. bunu gerçekleştiren bir prosedür ve ondan önce algoritmasını gösteriyor. Bu prosedür (ASCII_BIN) data segment teki (-belki de bir READ_KEYS prosedürüyle girilmiş Örnek 6-4 -) bir ASCII stringi bir 16-bit işaretli sayıya dönüştürür. ASCII_BIN stringin başlangıç adresini DS:DX ten, karakter sayacını (en yüksek 7) CX ten alır. Rastlantısız olarak bunlar READ_KEYS prosedürü parametreleri ASCII_BIN 16-bit değeri AX in içine döndürür. Rakamların sayısı ondalık ayıracından sonra DX in içindedir ve DI nın içindeki ilk dönüştürülemez karakterin adresidir. 10

BAŞLA SONUÇ=0 ONDALIK SAYAÇ = 0 BAŞLANGIÇ BOŞLUKLARINI YOKSAY HAYIR EKSİ İŞARETİ Mİ (-)? HAYIR ARTI İŞARETİ Mİ (+)? POZİTİF VARSAY GÖSTERGEC = GÖSTERGEC + 1 GÖSTERGEC = GÖSTERGEC + 1 CONV_AB (STRING DÖNÜŞTÜR) CONV_AB (STRING DÖNÜŞTÜR) EVET EVET DÖNÜŞÜM HATASI DÖNÜŞÜM HATASI HAYIR HAYIR EVET EVET SONUÇ < -32768? HAYIR SONUÇ < -32768? HAYIR SONUÇU TÜMLE HATA GÖSTERGECİNİ AYARLA BİTİR Şekil.1.3. Bir ASCII stringi binary ye çeviren algoritma 11

CONV_AB ONDALIK AYIRAÇ? HAYIR EVET ONDALIK SAYACI KAYDET GÖSTERGEÇ = GÖSTERGEÇ + 1 KARAKTER BİR RAKAM MI? HAYIR KISMİ SONUÇU 10 LA ÇARP EVET ASCII KODU BINARY RAKAMA DONUŞTUR SONUÇ = SONUÇ + RAKAM SONUÇ ÇOK MU BÜYÜK? EVET HAYIR GÖSTERGEÇ = GÖSTERGEÇ + 1 DAHA KARAKTER VAR MI? HAYIR HATA GÖSTERGEÇİNİ AYARLA GERİ DÖN Şekil.1.4. Klavyeden bir string okuyan prosedür. 12

TITLE READKEYS 50 tuş darbesini okur ; Bu prosedür 50 tuşu okur ; Girdi:Yok ; Sonuçlar: DS:DX = String adresi ; CX = Karakter sayacı ; ; Assemble with: MASM READKEYS; ; Link with: LINK callprog+readkeys; PUBLIC READ_KEYS DSEG SEGMENT PARA PUBLIC DATA USER_STRING DB 51,51 DUP(?) DSEG ENDS CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG,DS:DSEG READ_KEYS PROC FAR PUSH AX MOV AX,DSEG ; DS yi başlangıç durumuna getir MOV DS,AX LEA DX,USER_STRING ; String oku MOV AH,0AH INT 21H SUB CH,CH ; CX ten karakter sayacını oku MOV CL,USER_STRING+1 ADD DX,2 ; DX noktasını text yap POP AX ; AX i yerine koy RET ; Ana programa geri dön READ_KEYS ENDP CSEG ENDS END 13

Örnek.1.1..ASCII stringi binary ye dönüştüren prosedür. TITLE ASC_BIN ASCII den binary ye dönüştürür ; bir ASCII stringi onun 16-bit, ikinin bileşeni ; binary eşitine dönüştürür. ; Girdiler: DS:DX = Stringin başlangıç adresi ; CX = Karakter sayacı ; Sonuçlar: CF = 0 hata olmadığını bildirir ; AX = ikilik değer ; DX = Ondalık ayıracından sonra sayaç ; rakamları ; DI = 0FFH ; CF = 1 hata bildirir DS:DI = dönüştürülemez karakterin adresi ; DX ve CX meyilsiz ; ; Assemble with: MASM ASC_BIN ; Link with: LINK callprog+asc_bin PUBLIC ASCII_BIN.286C CSEG SEGMENT PARA CODE ASSUME CS:CSEG ASCII_BIN PROC FAR PUSH BX ; BX ve CX i kaydet PUSH CX MOV BX,DX ; BX in içine ofseti koy SUB AX,AX ; Başla, sonuç = 0 SUB DX,DX ; ondalık sayaç = 0 MOV DI,00FH ; hatalı karakter olmadığını varsay CMP CX,7 ; String çok uzun mu? JA NO_GOOD ; Öyleyse, CF yi CF yi ayarlamaya 14

; git ve çık BLANKS: CMP BYTE_PTR [BX], ; Geçmiş önceki boşlukları ; tara JNE CHK_NEG INC BX LOOP BLANKS CHK_NEG: CMP BYTE PTR [BX], - ; Negatif sayı mi? JNE CHK_POS INC BX ; Öyleyse, göstergeci arttır DEC CX ; sayacı azalt, CALL CONV_AB ; stringi dönüştür JC THRU CMP AX, 32768 ; sayı çok mu küçük? JA NO_GOOD NEG AX ; Hayır. Sonucu tamamla JS GOOD CHK_POS: CMP BYTE_PTR [BX], + ; Pozitif sayı mi? JNE GO_CONV INC BX ; Öyleyse göstergeci arttır DEC CX ; sayacı azalt GO_CONV: CALL CONV_AB ; Stringi dönüştür JC THRU CMP AX,32767 ; sayı çok mu büyük? JA NO_GOOD GOOD: CLC JNC THRU NO_GOOD: STC ; öyleyse, Elde Bayrağını ayarla THRU: POP CX ; register ları yerine koy POP BX RET ; ve çık ASCII_BIN ENDP ; Bu prosedür asıl dönüşümü gerçekleştirir. 15

CONV_AB PROC PUSH BP ; gelişi güzel register ları PUSH BX ; kaydeder MOV BP,BX ; BP nin içine göstergeci koy SUB BX,BX ; ve BX i temizle CHK_PT: CMP DX,0 ; Ondalık ayıracı bulunmuş mu? JNZ RANGE ; öyleyse, izleyen denetimi atla CMP BYTE PTR DS:[BP],. : Ondalık ayıracı mi? JNE RANGE DEC CX ; öyleyse, sayacı azalt, MOV DX,CX ; ve sayacı DX in içine kaydet JZ END_CONV ; CX=0 sa çık INC BP ; göstergeci arttır RANGE: CMP BYTE PTR DS:[BP], 0 ; Karakter bir rakam JB NON_DIG ; değilse... CMP BYTE PTR DS:[BP], 9 JBE DIGIT NON_DIG: MOV DI,BP ; adresini DI nın içine koy STC ; Elde Bayrağını ayarla JC END_CONV ; ve çık NON_DIGIT: IMUL AX,10 ; AX in içindeki rakamı 10 la çarp MOV BL,DS:[BP] ; ASCII kodunu çıkar AND BX,0FH ; yalnızca yüksek bitleri kaydet, ADD AX,BX ; kısmi Sonucu güncelle JC END_CONV ; sonuç çok büyükse çık INC BP ; aksi halde, BP yi arttır LOOP CHK_PT ; ve devam et CLC ; bittiğinde, Elde Bayrağını temizle END_CONV: POP BX ; register ları yerine koy POP BP RET ; ana programa geri don CONV_AB ENDP CSEG ENDS END 16

DX in içindeki değer sonucun büyüklüğünü gösterir. Bu size karışık boyutlarda dönüştürülmüş sayıları işletirseniz hangi ölçek etkeni ni uygulayacağınızı söyler. DX in içeriği 0 (sonuç bir tamsayı) ile 5 (sonuç bir basit kesir) arasında olabilir. Örneğin: AX 1000H (ondalık 4096) içerir ve DX 2 içerirse, sonucunuz ondalık 40,96 değerini gösterir. Bu Sonucu DX in içinden 3 olarak dönen önceki değer olan sonuca eklemek için, bir önceki Sonucu öncelikle 10 a bölmeniz gerekiyor. Benzer bir şekilde 40.96 yı DX in içinden 0 olarak dönen bir önceki sonuca eklemek için yeni değeri öncelikle 100 e bölmeniz gerekir. Elde Bayrağı (Carry Flag - CF) dönüşüm sırasında hata meydana gelip gelmediğini gösterir. Eğer CF 0 sa, sonuçlar geçerli, eğer CF 1 se ASCII_BIN aşağıdaki hatalardan birini bulmuştur. String yedi karakterden büyükse (CX>7) AX ve DX 0 tutar ve DI 00FFH tutar. ASCII_BIN geçersiz karakter buldu, DI bunun ofset değerini tutar. Sayı aralığın dışındaysa (-32768 den daha küçük, 32767 den daha büyük) AX sıfırsızdır ve DI 00FFH ı tutar. Yanıtın geçerliliğini denetlemek için ASCII_BIN i bu yazımda çağırın... CALL ASCII_BIN ; Dönüşüm prosedürünü çağır JNC VALID ; yanıt geçerli mi? OR DI,DI ; hayır. Hata durumu bulundu JNZ INV_CHAR OR AX,AX JNZ RANGE_ER.. ; string çok büyüktü.. RANGE_ER:.. ; sayı aralık dışında.. INV_CHAR:.. ; geçersiz karakter.. VALID:.. : yanıt geçerli.. 17

1.4.2.Binary Sayıları Stringe Çevirmek Bir sonuç yazdırmak ya da bunu ekranda göstermek için, onu ASCII ye çevirmeniz gerekir. İyi ki, bunu yapmak kolay. Bir 16-bit binary sayıyı ASCII ye dönüştürmek için sayının içerdiği 1, 10, 100,1000, 10000 leri bildiren ve bu sayaçların her birini bir ASCII karaktere dönüştüren bir programa ihtiyacınız var. ASCII karakterleri hesaplandığı gibi çıktı verebilir ya da onları bellekte bir string olarak saklayabilir ve başka bir programla daha sonra çıktı olarak verebilirsiniz. Örnek 6.6 AX içindeki bir 16 bit binary sayıyı bellekte bir ASCII stringe çeviren BIN_ASCII adında bir prosedürdür. Çeşitli sayaçlar türetmek için, BIN_ASCII AX in içeriğini ardı sıra 10 a böler ve her bölme işleminin kalanını string inşa etmek için kullanır. BIN_ASCII dönüştürülmüş stringlerin adresini DS:DX2in içine ve karakter sayacını CX in içine geri döndürür. Örnek.1.2. Binary sayıyı stringe çevirme TITLE BIN_ASC Binary yi ASCII ye çevirme ; Data segmentteki Işaretli binary sayıyı altı-byte li ASCII ; stringe (artı işaretli dört rakam) çevirir. ; Girdiler: AX = Dönüştürülmüş sayı ; DS:DX = string tamponunun başlangıç adresi ; Sonuçlar: DS:DX = stringin başlangıç adresi CX = Karakter sayacı ; Diğer register lar saklı. ; Assemble with: MASM BIN_ASC; ; Link with: LINK callprog+bin_asc; PUBLIC BIN_ASCII CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG BIN_ASCII PROC FAR PUSH DX ; ana programın register larini sakla PUSH BX PUSH SI 18

PUSH AX MOV BX,DX ; ofseti BX in içine koy MOV CX,6 ; tamponu boşluklarla doldur FILL_BUFF: MOV BYTE PTR [BX], INC BX LOOP FILL_BUFF MOV SI,10 ; hazırla -*- 10 a bol OR AX,AX ; i değeri negatifse, JNS CLR_DVD NEG AX ; sayıyı pozitif yap CLR_DVD: SUB DX,DX ; bölümün üst yarısını temizle DIV SI ; AX i 10 a böl ADD DX, 0 ; kalanı ASCII rakamına dönüştür DEC BX ; buffer yardımıyla yedekle MOV [BX],DL ; karakteri stringin içine sakla INC CX ; dönüştürülen karakterleri say OR AX,AX ; hepsi bitti mi? JNZ CLR_DVD ; değilse, yeni rakamı al POP AX ; evet, asıl değeri al OR AX,AX ; negatif miydi? JNS NO_MORE DEC BX ; evet. İşaretini sakla MOV BYTE PTR [BX], - INC CX ; ve karakter sayacını arttır NO_MORE: POP SI ; register ları yerine koy POP BX POP DX RET ; ve çık BIN_ASCII ENDP CSEG ENDS END 19

2.ADRESLEME MODLARI 2.BÖLÜM 2.1.8086/8088 Hafıza Mimarisi 2.1.1.Lojik ve Fiziksel Hafızalar 8086/8088 mikroişlemcisi 20-bit Adres Yolu ile toplam 1048576 (1M) byte hafıza hücresi adresleyebilmeye karşın, her iki işlemcinin fiziksel hafıza yapıları farklıdır. Bununla beraber bu işlemcilerin lojik hafızaları Şekil 4.13 te görüldüğü gibi aynıdır. Lojik hafıza, yazılım tarafından programcıya görülen hafızaya verilen isimdir. Bu hafıza, donanım tasarımcısı tarafından görülen, gerçek hafıza yapısını oluşturan fiziksel hafızadan farklı olabilir. 8088 ve 8086 mikroişlemcilerin lojik hafızası 0000h tan başlayıp FFFFh a kadar uzanır. Lojik hafıza genişliği bir byte (8-bit) olup bu adreslerin uzunluğu 1M byte hafıza bloğu belirtir. Mikroişlemci tarafından adreslenen 16-bit hafıza kelimesi, her herhangi bir byte adresinden başlar ve peş peşe 2 byte işgal eder. FFFFFh 1M byte 00000h Şekil 2.1. 8086/8088 lojik hafıza haritası. 8088 ve 8086 fiziksel haritaları genişlik olarak birbirinden farklıdır. 8088 hafızası 8-bit, 8086 hafızası ise 16-bit genişliğindedir. Programcı için hafıza her zaman 8-bit genişliğinde olmasına rağmen, fark sadece tasarımcısı için bulunur. 20

Şekil 4.14.8088 mikroişlemcisinin hafıza alanını göstermektedir. Bu hafıza haritası Şekil 4.13 te verilen lojik hafıza haritası ile aynıdır. 8088 in hafıza arabirimi 8085A işlemecisine benzemektedir. FFFFFh 00000h Şekil 3-2. 8088 fiziksel hafıza haritası. 8086 mikroişlemcisinin fiziksel hafıza haritası Şekil 4.15 te görülmektedir. 8088 den farklı olarak iki ayrı hafıza bloğu içermektedir. Tek blok (yüksek hafıza) ve çift blok (düşük hafıza). Her 8086 bloğu 512K*8 olup toplam adreslenebilir, 8086, byte veya kelime (16-bit, Word) verisini doğrudan adresleyebilmektedir. Bundan dolayı, 8086, 16 bit bir kelimeyi bir işlemde okuyup yazabilmektedir (verinin adresinin çift olması sağlandığında). Buna karşın, 8088, 16-bit veri aktarımı için 2 okuma veya yazmaya gerek duyar. 8086 yazılımı daha hızlı çalışır. Çünkü, 8086 bir çok komutu ve 16-bit veriye 8086 in iki katı hızında erişir. Tek Blok Çift Blok FFFFFh FFFFEh 512 K 512 K byte byte 00005h ---------------- 00003h 00001h ---------------- 00004h 00002h 00000h Yüksek Hafıza Düşük Hafıza Şekil 3-3. 8086 fiziksel (donanım) hafıza haritası 2.1.2. Segment li Hafıza Yapısı 8086/8088 mikroişlemcilerinde hafızaya erişim segment saklayıcıları yoluyla yapılır. Her bir segment bloğu 64K byte tır. Şekil 4.16 da segment saklayıcıları ile adreslenen bir hafıza 21

haritası örneği görülmektedir. Hafıza alanının aynı anda 4 farklı segment bulunabilmektedir. Bunlar kod segment (CS), veri segment (DS), ekstra segment (ES), ve yığın segment (SS). AFFFFh SS Yığın A000 Segment A0000h ES 8FFFFh Ekstra 8000 Segment 80000h DS 3FFFFh Veri 3000 Segment 30000h 1FFFFh CS Kod 1000 Segment 10000h Şekil.2.4. Segment saklayıcıları ile adreslenen bir hafıza haritası Her segment saklayıcısı, 20-bit adresin 16-bit kısmını tutar. Segment saklayıcıda bulunan 16-bit adresin düşük değerli bölümüne, 0h (0000h) eklenir. Ayrıca bir ofset (indis) bu adresle toplanarak, donanım tarafından otomatik olarak, 20-bit adres elde edilir. Bu işleme lojik adresin fiziksel adrese çevrilmesi denir. Segment saklayıcılarına göre, aşağıda açıklanacağı gibi, ofset, değişik saklayıcılardan gelir. Eğer bir 8086/8088 sistemi sadece 64K byte hafıza içeriyorsa, bütün 4 segment saklayıcısı 0000h ile yüklenir ve segment ler üst üste çakışır. Bu durumda adres aralığı X0000h XFFFFh arasında değişir. (X herhangi bir 16-lı rakamdır.) Her bir segment saklayıcısı, özel bir fonksiyona sahiptir ve bir veya daha çok indis veya işaretçi saklayıcısı ile ilişkilidir. Bir hafıza adresi üretmek için, bir segment saklayıcısının içeriği, bir ofset adres tutan bir indis veya işaretçi saklayıcısına eklenir. 22

Şekil 4.17 de bir komut tarafından adreslenen bir verinin, fiziksel adresinin üretimi görülmektedir. Bu örnekte, veri segment saklayıcısı DS 1000h içermekte, yeni veri segment 10000h fiziksel adresinden itibaren başlamaktadır. Taban saklayıcısı BX te ofset adres 0020h bulunmakta, ve böylece fiziksel adres 10020h veya 1000h*10h+0020h olmaktadır. BX 10020h 0020 ofset 10003h 10002h DS 10001h 10000h 1000 Şekil.2.5. Veri segment inde bulunana bir hafıza hücresine erişim Kod segment CS, program ve veri alanı olarak kullanılabilmesine rağmen genelde kodlarının bulunduğu alandır. 8086/8088 tarafından yürütülecek bir sonraki komutun adresi, komut işaretçisi IP ye CS * 10h içeriğinin toplanmasıyla elde edilir. Veri segment i DS, bir çok komut ve adresleme modu tarafından erişilen program verilerini tutar. Hafızadaki verinin adresi, BX,SI veya DI saklayıcılarından birine DS * 10h içeriğinin toplanmasıyla elde edilir. Yığın (stack) segment i SS, LIFO (Last In First Out) tarzında çalışmaktadır. Bir yığın hücresinin adresi, SP nin içeriği artı SS *10h tır. BP tarafından adreslenen veri de normal yığın segment inde bulunur. 23

ES string komutlarından kullanılan veri alanıdır. Bir string komutu yürütüldüğünde, hedef adres DI ES * 10h, kaynak veri adresi ise, SI artı ES * 10 tır. Aşağıda Tablo 4.5 te 8086/8088 mikroişlemcisinin değişik işlemleri ve bunlarda otomatik olarak kullanılan saklayıcılar görülmektedir. Tablo 3.1. İşlemlere göre değişik segment adres kaynakları. İşlem Çeşidi Segment Alternatif Segment Ofset Komut okuma CS yok IP Yığın işlemi SS yok SP Veri İşlemi (aşağıdakiler hariç) DS CS,ES veya SS çeşitli String kaynak DS CS,ES veya SS SI String hedef ES yok DI BP taban saklayıcı olarak kullanıldığında SS CS,ES veya SS çeşitli 2.1.2.1. Segment li Hafıza Yapısının Avantajları Yukarıda anlatılan segment li hafıza yapısı, ilk bakışta şaşırtıcı ve zor görülebilir. Bu hafıza yapısı için hatırlanması gerekenler özetle şunlarlar. Program işlem kodları CS alanından okunmakta, program verileri DS ve ES alanlarında saklanmaktadır. Yığın işlemleri ise, SP ve BP saklayıcılarını kullanarak SS üzerinde işlem yapar. Ayrı kod ve veri alanlarının olmasının ilk avantajı, bir programın, farklı veri blokları üzerinde çalışabilmesidir. Bu işlem, DS saklayıcısına farklı bir bloğa işaret eden yeni bir adresin yüklenmesiyle yapılır. Segment li hafıza yapısının en büyük avantajı, lojik adresler üreten x86 programlarının hafızanın herhangi bir yerine yüklenip çalıştırabilmesidir. Bunun nedeni, lojik adreslerin, her zaman, CS taban adresinden bağımsız olarak, 0000h ile FFFFh arasında değişmesidir. Çok-görevli (multi-tasking) x86 tabanlı bir ortamı veya Windows 95/98/NT işletim sistemini düşünelim. Bir çalışan aktif programın geçici olarak sabit diskte saklandığını ve onun yerine, yeni bir programın getirildiğini farz edelim. Bu çeşit programla, hafızanın herhangi bir yerinde çalışacakları için, tekrar yerleştirilebilir (relocatable) olarak adlandırılır. Programların bu şekilde çalışabilmesi, segment saklayıcıları yoluyla olmaktadır. Segment saklayıcılarının yani program, veri ve yığın saklayıcılarının taban adresinin değiştirilmesiyle programlar hafızanın herhangi bir yerinde çalışabilmektedir. 24

8085A ve benzeri birçok 8-bit mikroişlemci ve mikro denetleyicide, bu şekilde bir hafıza adres üretimi olmadığı için, programların tekrar yerleştirilebilirliği mümkün değildir. Yani, bir 8085A işlemcisi için, program ve verilerin başlangıç adresleri, ORG (Origin) gibi assembler ifadeleri ile belirlenip kod üretimi yapıldıktan sonra, bu adreslere, program ve veriler yüklenmelidir. Bu şekilde, program ve veriler, bir bakıma, hafızaya kök salar ve başka yere taşınamaz. Program ve verileri başka bir adrese yükleyebilmek için, ORG ifadesindeki adresler değiştirilir, sonra tekrar derleme yapılır ve yeni ikili kod üretilir. Bu sayede yeni adres yerleşimi için kod elde edilir. 2.2. Adresleme Modları 80286 (Kısa 286) işletmek üzere sizin programınızın operand larını oluşturmak için yolların çeşitliğini destekler. 286 bunları bir tutucudan oluşturabilir., kendisi bir direktifle, ya da bellek konumundan ya da bir I/O kapısından. Hepsi için adresleme kiplerini 7 gruba ayırabilirsiniz. 1) Saklayıcı adresleme 2) Kesin adresleme 3) Doğrudan adresleme 4) Saklayıcı dolaylı adresleme 5) Tabana dayalı adresleme 6) Doğrudan dizilmiş adresleme 7)Taban dizili adresleme Mikroişlemci direktifin içindeki bir mod alanı nın içeriğini sınayarak. Bu yedi adresleme modunu kullanmak için belirtir. Assembler mod alanını kaynak programdaki operandlarının görünüşlerinin tabanında ayarlar. Örnek olarak bunu girerseniz. MOV AX, BX Assembler her iki operandı (AX ve BX) saklayıcı adresleme modu için kodlar. Bununla beraber, eğer kaynak operandın başına ve sonuna köşeli parantez koyarsanız ve girerseniz. MOV AX, [BX] Assembler kaynak operandını (BX) saklayıcı dolaylı adresleme modu için kodlar. 25

Tablo 3-1 asembler formatını gösterir ve 286 nın 7 operand adresleme kipi için hangi segment tutucusu fiziksel adresini hesaplamak için kullanıldı. Not: Bütün kipler data segmentin içindeki verinin bu durumda yığın segmentin varsaydığı başvurmayı üstlenir. (DS segment saklayıcısıdır). BP saklayıcısının kapsadığını hariç tutar. (SS segment saklayıcısıdır.) Not: 286 nın string direktifleri DI noktalarının ekstra segmentteki yerleşimi data segmentdekinden daha iyidir. Tablo 2.1. 80286 Adresleme Modları: Adresleme Modu Operand Biçimi Segment Tutucu Tutucu reg Yok En yakın data Yok Doğrudan disp DS label DS Dolaylı saklayıcı [BX] DS [BP] [DI] [SI] SS DS DS Göreceli taban [BX]+disp DS [BP]+disp SS Doğrudan dizilmiş [DI]+disp DS [SI]+disp DS Taban dizilmiş [BX][SI]+disp DS [BX][DI]+disp DS 26

[BP][SI]+disp [BP][DI]+disp SS SS Notlar:1) disp taban izilmiş adresleme için seçimliktir. 2) reg her 8 veya 16-bit saklayıcı olabilir., IP hariç 3) data bir 8 veya 16-bit sabit değerinde olabilir. 4) disp bir 8 veya 16-bit işaretlenmiş ayırma değerinde olabilir. ES segment saklayıcısı gibi kullanıldı. Bütün diğer talimatlar Tablo 3-1 de atanmış olarak gösterildi. Bu bölümün devamında, her zaman tanımladığımız bir adresleme kipini, bir örnekte kullanımını sergileyeceğiz. Genellikle, biz 286 larda MOV (Move) talimatını bunu sergilemek için kullanırız. 2.2.1.Saklayıcı ve Kesin Adresleme Tutucu adreslemede, 286 operandı tutucudan (ya da içine yüklenenden) gidip getir. (Swap) Örneğin: MOV AX, CX 16-bit içerikli sayaç tutucusunu (CX), akümülatör tutucusuna (AX) taşır. CX saklayıcısının içeriğini değiştirmez. Burada, 286 adresleme saklayıcısını kaynak operandı CX den almak ve AX hedef saklayıcısının içine yükler. Kesin adresleme size 8 veya 16-bit sabit değeri kaynak operand gibi belirtmenize izin verir. Bu sabit talimat içindedir. (assembler ın koymuş olduğu) ve tutucu ya da bellek erişiminden daha iyidir. Örneğin: MOV CX, 500 Ondalık değer olan 500 ü CX tutucusuna yükler ve MOV CL, -30-30 değerini CL tutucusuna yükler. 27

Yakın operand zaten EQU direktifiyle tanımlanmış bir simge olabilir.bunun gibi bir form geçerlidir. K EQU 1024 ----- ----- MOV CX,K Sorunlardan sakınmak için, 8 bit 127 (7FH) tan 128 (80H) a kadar ve 16-bit 32767 (7FFFH) tan 32768 (8000H) a kadar. İşaretli numaralandırır. Eğer bunlar işaretsizse en yüksek 8 ve 16 bit değerler.sırasıyla 255 (0FFH) ve 65535 (0FFFFH) tır. Kesin Değerler İşaretli Uzatılmıştır: Assembler her zaman hedefin içindeki kesin değerleri işaretli uzatır. Bu bütün hedefin 8 veya 16 bitlerine kaynağın en belirgin bit ini kopyalar. Örneğin: MOV CX, 500 ; girerseniz assember kaynak değerini (ondalık 500) 10-bit ikilik modelde 0111110100 gibi görür. Bu değer 16-bit hedef saklayıcıya yüklendiğinde (CX), bu modeli işaretli bit değerlerinin (0) sekiz kopyasını başa getirerek uzatır. Böylelikle CX, sonunda 0000000111110100 ikilik değerini içerir. İkinci örnekte; 286: 8 bit ikilik modelini 30 (11100010) için CL nin içine yüklüyor. Bellek Adresleme Modları: Erişim Belleği 286 nın Yürütme Birimi (Execution Unit (EU)) ve Yol birimi (Bus Un it (BU)) tarafından ek bir çaba gerektirir. EU biriminin bir bellek operandı okuması ya da yazması gerektiğinde EU ofset değerini BU ya verir. BU, bu ofseti bir 20-bit fiziksel adres üretmek için ( dört 0 ekleyerek) segment tutucusunun içeriğine ekler, sonra bu adresi operanda erişmek için kullanır. Efektif Adres: Ofset Yürütme Biriminin hesapladığı, bellek operandı için çağrılan, efektif adrestir (EA). EA segmentin başlangıcından operandın yerine kadar olan byte ların uzaklığıdır. 16-bit işaretsiz değerin oluşu, EA segmentin içinde nerede yanlış olduğuna başvurabilir. Bu 65,535 (64K) byte üzerinde segmentin başlangıcını geçmiştir. 28

Zamanın miktarı Yürütme Birimi hesaplamak için aldığı EA talimatını yürütmek için almasında uzunluğun belirlenmesi ilk etkendir. Kullandığınız adresleme kipine bağlı olması, EA nın bazı şeyleri gerektirebilmesi biraz basitçe talimatın içinden bir ayrıma gidip getirmesiyle (swap) oluşmakta. Sonra tekrar; ayırma ekleme, taban tutucusu ve bir dizin tutucu gibi bazı çok uzun hesaplamalar gerektirebilir. Yürütme Zamanına aldırmamak programınızda kritik bir durumdur. Adresleme mov tanımından sonra, BU, bu zaman etkenlerini takdir etmelisiniz. 2.2.2.Doğrudan Adresleme Doğrudan adreslemede, EA kesin veri değerlerinin direktiflerde bulunduğu, direktiflerin içinde bulunur. 286 operand ın fiziksel adresini üretmek için EA yı (değişmiş) Data Segment saklayıcısına ekler. Doğrudan adresleme operandı genellikle etikettir. Örneğin direktif: MOV AX, TABLE şeklindeyse TABLE bellek bölgesinin içeriğini AX tutucusuna yükler. Şekil 3-1 talimatın nasıl çalıştığını gösteriyor. DATA SEGMENT MOV AX,TABLE 0000 0001 BB TABLE AX AABB 0002 AA 0003 TABLE + 2 0004 Şekil.2.6. Sayfa 108 Doğrudan Adresleme 29

Not: 286 veriyi siz hariç tutmak isterseniz zıt düzen içinde bellekte depolar. Bu düşük düzen byte ından sonra yüksek-düzen byte ını koyar. Verinin yüksek (en belirgin) parçası, en yüksek bellek adresinin içindedir. 2.2.3.Saklayıcı Dolaylı Adresleme Saklayıcı Dolaylı adreslemeyle, operandın etkin adresi ya Bx saklayıcı tabanı, ya BP taban işaretçisi (ya da bir dizin tutucusu (SI ya da DI)) içindedir. Dolaylı saklayıcı operandını saklayıcı operandından ayırmak için köşeli parantezle kapatmalısınız. Örneğin: MOV AX, [BX] bu talimat BX le adreslenmiş bellek bölgesinin içeriğini AX saklayıcısının içine yükler. Şekil 3-2 bu örneği resimliyor. BX in içine bellek adresine OFFSET öneki girebilmek için bir ofset koymanın bir yolu vardır. Örneğin: AX içinde TABLE bölgesinde bir sözcük yüklemek için, bu diziyi kullanın. MOV BX, OFFSET TABLE MOV AX, [BX] Bu iki talimatla aynı işi yapmak için MOV AX, TABLE BX in önceki önceki içeriğini yok etmesi hariç tutulur. Eğer bir yalnız bellek bölgesine (burada TABLE ın içeriği) erişmek istiyorsanız bu tek talimat daha duyarlı yaklaşım gösterir. Bununla birlikte, bazı taban adresleriyle başlayan, birkaç bölgeye ulaşmak için saklayıcının içinde etkin adres bulunması daha iyidir. Neden böyle? Çünkü her zaman tutucunun içeriklerini getir-götür adressiz üretebilirsiniz. 2.2.4.Göreceli Taban Adresleme Göreceli taban adreslemeyle assembler etkin adresini BX yada BP tutucusuna bir ayırma değeri ekleyerek hesaplar. BX formu belleğin farklı bölümünde yerleşmiş veri yapısına erişmenin uygun yolunu verir. Bunu yapmak için, yapının taban adresini saklayıcı tabanının içine koyun tabanda ayrılması ile yapının öğelerine başvurun. Bundan sonra, taban saklayıcıda basit değişiklikler yaparak, yapının içinde değişik kayıtlara ulaşabilirsiniz. Örneğin: Diskten bazı personel kayıtlarını okuduğunuzu varsayın, bulunan her kayıt işçinin kimlik numarasını, bölüm numarasını, bölge numarasını, yaşını, maaşını vb içerir. Eğer böyle numarası kaydın 5. ve 6. byte larında saklıysa, kaydın adresi BX le başlıyorsa, direktif böyledir. MOV AX, [BX] + 4 30

DATA SEGMENT MOV AX,[BX] BX 0001 0000 0001 BB TABLE 0002 AA AX AABB 0003 TABLE + 2 0004 Şekil.2.7. Dolaylı Register Adresleme DATA SEGMENT MOV AX,[BX] + 4 + BX 001A 0019 001A EMP_50 001B AX AABB 001C 001D 001E 001F BB AA 0020 Şekil.2.8. Göreceli Taban Adresleme 31

Bu talimat işçinin bölge numarasını AX in içine yükler. (Ayırmada 4 değeri 5 ten daha iyidir, çünkü ilk byte 0 dır) Şekil 3-3 bu örneği sergiler. Macro Assembler göreceli taban operandı belirlemede üç değişik yola izin verir. Eşdeğer 3 direktif: MOV AX, [BP]+4 MOV AX, 4[BP] MOV AX, [BP+4] ; Bu standart formdur, fakat kullanabilirsiniz. ; ilk ayırmayı koyar ; ya da köşeli parantezle birlikte 2.2.5.Doğrudan Dizli Adresleme Doğrudan dizili adreslemeyle, etkin adres ayırma ve dizin saklayıcısının toplamıdır, DI ya da SI dan biri. Bu adresleme tipi bir tablonun içindeki öğelere erişim için uygundur. Ayırma noktaları tablonun başlangıcına ve dizin saklayıcı noktaları öğenin içinedir. Örneğin : B_TABLE isminde bir byte tablomuz var. Direktif dizisi şöyledir. MOV DI, 2 MOV AL, B_TABLE [DI] Direktif AL saklayıcısının içine 3. öğeyi yükler. 32

DATA SEGMENT MOV AX,TABLE[DI] 0001 TABLE DI 0004 + TABLE + 2 AX AABB 0005 0006 BB AA TABLE + 4 Şekil.2.8. Doğrudan Dizili Adresleme Bir sözcük tablosu içinde, öğeler bağımsız 2 byte tır. Böylece dizin değeri olarak çift öğe numaranız olur. TABLE isimli Word tablosuyla talimat dizisi şöyledir. MOV DI, 4 MOV AX, TABLE [DI] Bu direktif dizisi üçüncü öğeyi AX saklayıcısının içine yükler. Şekil 3-4 bu örneği sergiler. 2.2.6.Taban Dizili Adresleme Taban dizili adreslemede, EA bir taban saklayıcı, bir index saklayıcı ve (seçimlik olarak) ayırmanın toplamıdır. Çünkü iki ayrı ofset kabul eder. Bu mod iki boyutlu dizilere erişimde yararlıdır. Burada ayırma ve dizin saklayıcısı sıra ve sütun ofsetini sağlarken taban saklayıcı dizinin başlangıç adresini tutar. 33

Örneğin: bir kimyasal işlem fabrikasında bilgisayarınızın monitöründe altı basınç sübabı var varsayalım. Bu her yarım saatte sübab ayarını okur ve bunları belleğe kaydeder. Birinci hafta içinde bu okuma formu her alt öğe için 336 bloktur. (7 günde her gün için 48 okuma). 2.016 veri değeri toplamıdır. Eğer dizinin başlangıç adresi BX ise, blok ayırması (okuma numarası zamanları 12) DI nın içindedir; ve sübab numarası ayrımı VALUE değişkeni ile tanımlanmıştır. Bu direktifi kullanabiliriz. MOV AX, VALUE [BX] [DI] Bu direktif bazı seçilmiş basınç sübaplarını AX içinden okur. Şekil 3-5 te bu talimat data segmentin 100h ofset adresine sahip bir diziden subab-4 (2.okuma) ün üç okumasını özetler. Burada taban dizili adresleme operandları için bazı diğer geçerli biçimleri verilmiştir. MOV AX, [BX+2+DI] ; bütün üç terimi bir köşeli paranteze koyabilirsiniz. MOV AX, [DI+BX+2] ; herhangi düzende MOV AX, [BX+2] [DI] ; ya da ayırmayı birleştirebilirsiniz MOV AX, [BX] [DI+2] ; başka saklayıcıya 34

MOV AX,VALVE[BX][DI] 100 OKUMA 0 BX 0100 + OKUMA 1 DI 0018 118 (VALVE 0) (VALVE 1) VALVE = 8 (VALVE 2) (VALVE 3) OKUMA 2 AX AABB 120 BB AA (VALVE 5) Şekil.2.9. Bir iki boyutlu diziden veri değerini çıkarır. 35

3. ASSEMBLER-DİLİ YAPISI 3.BÖLÜM 3.1.Giriş: Her assembler dili yapısı bir kaynak program içinde birbirini izleyen [label:](etiket),mnemonic,[operand],[;comment] (yorum) isimli 4 alandan oluşur. Bunların içinde yalnızca mnemonic alanı daima gereklidir. Etiket ve yorum alanları daima seçimliktir. Operand alanı operand gereken yapılarda uygulanır. Aksi halde atlamalısınız. (Biz etiket, operand ve yorum alanlarının seçimlik olarak belirtmeniz için boşluklarla göstereceğiz.) Bu alanları çizgi üzerinde herhangi bir yerde girebilirsiniz. Ancak en az bir boşluk (ya da tab) ile ayırmalısınız. Bir assembler-dili yapısında bütün dört alan böyle kullanılır. GETCOUNT: MOV CX, DI ; sayacı başlatır 3.2.Etiket Alanı: Etiket alanı assembler-dili yapısında bir isimle var olur. Bu yapı program içindeki diğer yapılarak kaynak teşkil eder. Böylece etiketler assembler-dili programı içinde aynı amaçlı ve çizgi numarası belirli temel programlara sunumu gerçekleştirir. Bir etiket yapısı en fazla 31 karakterden uzunluğunda olabilir ve iki nokta ile sonlanmalıdır. Böyle oluşabilir: A dan Z ye harfler (veya a dan z ye, assembler de küçük harf büyük harf ayrımı yoktur) 0 dan 9 arasında sayısal değerler. Özel karakterler :?. @ _ $ Herhangi bir karakterle etikete başlayabilirsiniz. Ancak siz bir periyod kullandıysanız (.) ilk karakteri olmalı. AH, AL, AX, BH, BL, BP, CH, CL, CX, CS, DH, DL, DX, DI, DS, ES, SI, SP ve ST saklayıcı isimleridir. Bunları kullanamazsınız. Etiket içinde boşluk kullanamazsınız. Fakat aynı etiketi alt çizgi karakteri ile (_) sağlayabilirsiniz. Örneğin; önceki örnek yapı gibi yazabilirsiniz. GET_COUNT : MOV CX, DI ; sayacı başlatır. Açıkça, GET_COUNT, GETCOUNT ta olabilir. 36

3.2.1.Etiket İsmi Seçme: Çünkü assembler harflerin, basamakların, simgelerin değişken durumlarını girmenize izin verir. Hemen hemen bütün etiketler kabul edilebilir olarak düşünebilirsiniz. Zaten biz etiket seçme için yorumlar öneriyoruz. Kısa ve olası isim yapma, mantıklı olabilmeli. Böylece, MPH MILES_PER_HOUR için tercih edilebilir. CUR_YR, CURRENT_YEAR için mantıklı bir kısaltmalıdır. Hatasız tipte isim yapma. Her zamanki tipleme sorunu birkaç özdeş harfin bir sırada (HHHH gibi) ve benzer karakterin ( O harfi ile 0 sıfır, I harfiyle 1 sayısı, S harfi ile 5 sayısı gibi ) Burada tanımlama hatası çağırmasının hiçbir mantığı yoktur, hepimiz için bunları başka yolla yapmak yeterlidir. Etiketleri karıştırabileceğiniz diğerleri ile birlikte kullanmayın. Örneğin, bunun gibi şeyleri kullanmaktan kaçının XXXX ve XXYX 3.3.Mnemonic Alanı: Mnemonic alan (mnemonic in başı m harfi sessiz ) 2 den 7 ye kadarki harfler yapı için kısaltmadır. Örneğin: MOV move yapısı için kısaltmadır. ADD add yapısı için kısaltmadır. Assembler her sayısal eşitliklerin içindeki mnemonic yapıyı çevirirken içsel tablolar kullanır. Mnemonic e ek, bazı yapılar gerektiriyor ki bir ya da iki operand tanımlanması (Örneğin : bir ADD yapısı eklemek için iki terim bilmek gerektiriyor.) Mnemonic assembler a kaç tane operand, hangi tip, operand alanında ele geçirmeyi söyler. 3.4.Operand Alanı: Operand alanı 80286 ya işlenen veriyi nerede bulabileceğini söyler. Bu bazı yapılar için gereklidir ve diğerleriyle engellenmiştir. Eğer hazırsa, operand alanı 8 tane 1 veya 2 operand içerir. Mnemonic ten en az bir boşluk ya da tablo ayırmıştır. Eğer iki operand gerekliyse, aralarına bir virgül koymalısınız. İki operandlı yapılarda, ilki hedef operand ve ikincisi kaynak operandtır. Kaynak operand mikroişlemcinin hedef operandın içine ekleyeceği, çıkartacağı, karşılaştıracağı veya depolayacağı değeri belirtir. Örneğin : Bu move talimatında MOV CX, DX CX, DX deki : Kaynak operantının içindeki Dx register ının içeriğini hedef operandının içindeki CX register ına taşır. Belki de tahmin ediyorsunuzdur. Hedef operand hemen hemen her zaman değiştirilirken; kaynak operand asla işlemle değiştirilmedi. 37

3.5.Yorum Alanı: BASIC teki REM e benzer bir ifade, kaynak programın içinde seçimlik tanımlama ifadesidir; programı daha kolay anlaşılır yapar. Yorumdan önce noktalı virgül (;) gelmelidir. Bu alandan önce en az bir boşluk ya da tabla ayırmak iyi fikir, ancak bunu yapamazsınız. Assembler yorumları yok sayar., ancak programı listeleyeceğiniz zaman yazar. Yorum alanına istediğiniz herhangi bir şeyi yazabilirsiniz., ama yararlı alabilecek, programda ne olduğunu açıklayan yorumlar yapmalısınız. talimatı yeniden vermeyin Örneğin: 1) MOV CX, 0 ; sayaç tutucusunu temizler 2) MOV CX, 0 ; CX in içine 0 ı taşır. 1. açıklama ikinci açıklamadan daha anlamlıdır. 3.5.1.Yalnız Yorumlar: Tanım bloğu içinde talimatın kendisi tarafından bir yorum tanımlayabilirsiniz. Bunu yapmak için çizginin başına bir noktalı virgül girin; assembler yorum çizgisini tanımlayacaktır ve isleyen her şeyi yok sayar. 38

4.BÖLÜM 4.ASSEMBLER KOMUTLARI 4.1.Veri Transfer Komutları: 4.1.1.Adres Yükleme Komutları: Bu komutlar, bir saklayıcıya veya bir saklayıcı ile bir segment saklayıcısına bir adres yüklemede kullanılmaktadır. Tablo.4.1.de komutların 3 değişik şeklini göstermektedir. 4.1.1.1. LEA (Load Effective Address): LEA komutu, bir saklayıcıya operand ile belirtilen adresi yükler. Tablo.4.1 de birinci örnekte, AX saklayıcısı, operand SUBADR içeriği ile değil (yani bu adresteki veri ile değil) SUBADR adresiyle yüklenmektedir. Tablo.4.1.Adres yükleme komutlarının değişik kullanımları Asembly Dili LEA AX,SUBADR LDS DI,LIST LES BX,VEC1 Yapılan İşlem AX SUBADR adresiyle yüklenir DI ve DS LIST teki adres ile yüklenir BX ve ES VEC1 deki adres ile yüklenir 4.1.1.2. LDS ve LES: LDS ve LES komutları, bir 16-bit saklayıcıya bir ofset adres ve DS (LDS ile) veya ES (LES ile) segment saklayıcısına 6yeni bir segment adresi yükler. Bu komutlar, yeni ofset ve segment numarasını seçmede, değişik geçerli adresleme modlarından herhangi birisi kullanılır. Bu komutlardan her birinde hafızadan mikroişlemciye iki tane 16-bit kelime, yani toplam 4-byte veri transferi olur. LDS ve LES komutları ile, bir program içinde farklı bir DS ve ES alanlarına işaret edilirken, ofset saklayıcılara da yeni ofset yüklenir. Şekil.4.1 de LDS BX,[SI] komutu ile SI ile işaretli hafıza alanından bir 32-bit sayı BX ve DS saklayıcılarına kopyalanmaktadır. 39

4.2. Dizi (String) Komutları: Üç çeşit dizi (string) veri transfer komutu vardır. Bunlar: LODS, STOS ve MOVS. Bu komutlar, mikroişlemci ile hafıza arasında, bir blok veya tek bir byte veya kelime transferinde kullanılır. Bu komutları tanıtmadan, aşağıda önce, bu komutların kullanımında önemli olan, yön (direction) bayrağı (D) ve dizi işlemlerinde kullanılan DI ve SI saklayıcılarının fonksiyonları anlatılacaktır. DS Hafıza LDS BX,[SI] 10000 (DS) AX BX SP BP SI DI 20 34 2000 2034 3000 34 20 00 30 12000 12001 12002 12003 CS DS 1000 1FFFF Şekil.4.1 LDS BX,[SI] komutu yürütülürken bellek saklayıcılarının durumları. 4.2.1.Yön Bayrağı (D): Yön bayrağı dizi işlemleri sırasında, DI ve SI saklayıcıları için otomatik-arttırma (D = 0) veya otomatik-azalma (D = 1) çalışma modunu seçer. D bayrağı CLD komutu ile 0 lanır ve STD komutu ile 1 lenir. Yani CLD otomatik-arttırmayı ve STD otomatik-azalmayı seçer. Bir dizi komutu ile yapılan veri transferinden sonra, D bayrağıyla seçilen çalışma moduna göre, eğer veri 1-byte ise DI ve/veya SI 1 arttırılır veya azaltılır. Benzeri şekilde, transfer edilen veri 2 byte ise, bu kez DI ve/veya SI 2 arttırılır ya da azaltılır.di ve SI Bir dizi komutunda DI, SI veya her ikisi kullanılabilir. Normalde SI, DS için ve DI, ES için ofset adres olmaktadır. SI için segment atanması, bir segment ön eki (override prefix) ile değiştirilebilir. Bununla beraber DI segment ataması her zaman ES tir bu atama değiştirilemez. 40