<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Assembly Programlama Dili</title>
	<atom:link href="http://assembly.hepsiproje.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://assembly.hepsiproje.org</link>
	<description>Assembly Programlama Dili Dersleri</description>
	<pubDate>Fri, 29 Jan 2010 10:29:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Kablosuz Haberleşme</title>
		<link>http://assembly.hepsiproje.org/?p=26</link>
		<comments>http://assembly.hepsiproje.org/?p=26#comments</comments>
		<pubDate>Fri, 04 Jul 2008 14:37:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[kablosuz haberleşme]]></category>

		<category><![CDATA[802.11a]]></category>

		<category><![CDATA[802.11b]]></category>

		<category><![CDATA[802.11g]]></category>

		<category><![CDATA[802.11n]]></category>

		<category><![CDATA[ağ]]></category>

		<category><![CDATA[alıcı]]></category>

		<category><![CDATA[alıcı-verici]]></category>

		<category><![CDATA[bağlantı noktası]]></category>

		<category><![CDATA[Bilgisayar]]></category>

		<category><![CDATA[Donanım]]></category>

		<category><![CDATA[Elektronik]]></category>

		<category><![CDATA[Full-Duplex]]></category>

		<category><![CDATA[Half-Duplex]]></category>

		<category><![CDATA[İnternet]]></category>

		<category><![CDATA[kablo]]></category>

		<category><![CDATA[kablosuz]]></category>

		<category><![CDATA[manyetik]]></category>

		<category><![CDATA[manyetik alan]]></category>

		<category><![CDATA[Mobilite]]></category>

		<category><![CDATA[Nasıl Çalışır?]]></category>

		<category><![CDATA[network]]></category>

		<category><![CDATA[receiver]]></category>

		<category><![CDATA[simplex]]></category>

		<category><![CDATA[Tam-Dupleks]]></category>

		<category><![CDATA[Teknoloji]]></category>

		<category><![CDATA[trans-receiver]]></category>

		<category><![CDATA[transmitter]]></category>

		<category><![CDATA[verici]]></category>

		<category><![CDATA[wi-fi]]></category>

		<category><![CDATA[WiMAX]]></category>

		<category><![CDATA[wireless]]></category>

		<category><![CDATA[wireless network]]></category>

		<category><![CDATA[Yarı-Dupleks]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=26</guid>
		<description><![CDATA[Kablosuz ağ bağlantısı ilk olarak acil durumlarda iletişime olanak sağlayabilecek bir sistemin geliştirilmesi üzerine bulunmuştur. Daha sonra yaygınlaşarak oldukça fazla kullanım alanı bulmuştur. Çünkü kablosuz ağ sistemi şehirlerde oldukça ucuz maliyetlerle hiçbir altyapı ve kablo bağlantısı işlemlerine gerek duymadan kesintisiz internet bağlantısı sağlanabilmektedir. Kablolu bağlantı sistemlerinde belirli sayıda her PC’ye bir kablo gidecek şekilde bağlantı [...]]]></description>
			<content:encoded><![CDATA[<p>Kablosuz ağ bağlantısı ilk olarak acil durumlarda iletişime olanak sağlayabilecek bir sistemin geliştirilmesi üzerine bulunmuştur. Daha sonra yaygınlaşarak oldukça fazla kullanım alanı bulmuştur. Çünkü kablosuz ağ sistemi şehirlerde oldukça ucuz maliyetlerle hiçbir altyapı ve kablo bağlantısı işlemlerine gerek duymadan kesintisiz internet bağlantısı sağlanabilmektedir. Kablolu bağlantı sistemlerinde belirli sayıda her PC’ye bir kablo gidecek şekilde bağlantı sağlanır fakat kablosuz ağ sistemlerinde birçok bağlantı noktası üzerinden çok geniş bir alanda ve çok daha fazla sayıda kullanıcı özgürce bağlanabilmektedir. Kablosuz ağ bağlantı noktaları diğer ağlarla iletişime geçecek şekilde programlanmıştır. A noktasından B noktasına giden bir bilgi, bağlantı noktalarının birinden diğerine geçerek ilerler. Bu esnada bağlantı noktası en hızlı ve güvenli yolu seçer. Buna dinamik yol gösterme(dynamic routing) denir.<br />
<span id="more-26"></span><br />
<strong>Nasıl Çalışır</strong><br />
Kablosuz ağ bağlantı noktaları aslında bildiğimiz router modemlerle aynı şekilde çalışırlar ve küçük radyo dalgaları üreten sistemlerdir. WiFi standartları çeşit ve özelliklerine göre 802.11a, b,g ve n olarak ayrılmışlardır. Bunlardan en yaygın olarak kullanılanı 802.11b’dir ve 2.4Ghz’lik yayılma aralığına sahiptir. Ancak 802.11b ile en fazla 11 Megabit’lik bağlantı kurabilmek mümkündür. Oysa 802.11g ile saniyede 54 Mbit, 802.11n ile 140 Mbit’lik hızlara ulaşmak mümkündür. Günümüzde dizüstü bilgisayarların tamamına yakını üzerlerinde entegre Wi-Fi alıcıları bulundururlar. Bulunmayanlar ise PCMCIA kartlarla bu özelliği kolayca kazanabilirler.</p>
<p>Kablosuz ağ sistemleri radyo frekansları ile çalışmaktadırlar. Radyo dalgaları ile haberleşme üç çeşit olabilmektedir. Bunlar alıcı(receiver), verici(transmitter) ve alıcı-verici(trans-receiver) olarak adlandırılırlar.</p>
<p>Bunlardan kısaca bahsetmek gerekirse;</p>
<p><strong>Alıcılar</strong><br />
Adından da anlaşılabileceği üzere sadece radyo sinyallerini alabilen fakat gönderme özelliği barındırmayan aygıtlardır. Bunlara en basit örnek olarak FM radyoları ve televizyonları gösterebiliriz.<br />
<strong><br />
Vericiler</strong><br />
Sadece radyo sinyalleri gönderebilen ama alma yetileri olmayan elektronik devrelerdir. Bunlara örnek olarak radyo verici istasyonları, televizyon verici İstasyonları vb. sayılabilir.<br />
<strong><br />
Alıcı-Vericiler</strong><br />
Hem alma hem verme özellikleri olan aygıtlardır. Bunlara örnek olarak telsiz röleleri, cep telefonu baz istasyonları, cep telefonları vb. sayılabilir.</p>
<p>İletişim anlamında bilinmesi gereken bir diğer konu ise iletim yönüdür. İletim yönleri üçe ayrılır:</p>
<p><strong>1. Tek Yönlü İletim(Simplex):</strong> Kurulan iletim sistemin de iletimin sadece bir yöne yapılabildiği zaman aldığı addır. Örnek olarak FM radyolar gösterilebilir.</p>
<p><strong>2. Çift Yönlü Eş Zamansız İletişim(Yarı-Dupleks, Half-Duplex): </strong>Kurulan iletim sisteminde çift yönlü iletim yapılabildiği ancak eş zamanlı olarak sadece bir tarafın gönderim yapabildiği sistemlerdir. Örnek olarak Telsiz uygulamaları gösterilebilir. Bilgi sistemlerinde kullanılan radyo frekansı ile çalışan kablosuz iletişim sistemleri genelde bu tiptedir. Örneğin IEEE 802.11g standardı 54 Mbps’de Yarı-Dupleks iletim imkanı sunar.</p>
<p><strong>3. Çift Yönlü Eş Zamanlı İletişim (Tam-Dupleks,Full-Duplex): </strong>Hem alıcı hem vericinin eşzamanlı iletim yapabildiği zaman aldığı isimdir. Örnek olarak cep telefonları, telsiz telefonlar gösterilebilir.</p>
<p>Şehrin üzerinde bağlantı noktaları arasında kusursuz bir ağ oluşturulur. Bu sayede trende, arabada, parkta, cafelerde, restaurantlarda vb. birçok yerde özgürce internete bağlanabilmek mümkündür. Şehirlerde belirli aralıklarla yerleştirilmiş bağlantı noktaları ile kesintisiz sürekli bir bağlantı sağlanılır. Bunun için genellikle saniyede 11 Mbit(1.35MB/s) hıza olanak sağlayan ve 2.4 Ghz’lik yayılma aralığına sahip 802.11b sistemi kullanılır. Bu sistem hem fazla güç tüketmediklerinden hem 2.4 Ghz gibi birçok yerde kullanılan(modemler, oyun kumandaları vs.) standart bir yayılma aralığına sahip olduklarından ve insanlara zarar vermediği ifade edilen radyo frekansı ile haberleştiğinden şehir kullanımında tercih edilmektedir. Fakat şahsi görüşüm olarak bu frekansların her türlüsünün insanları etkilediğini ve aynı TV, radyo, cep telefonu frekanslarında olduğu gibi uzun vadede insanlara zararlı olacağını düşünüyorum. O nedenledir ki dizüstü bilgisayarımı biraz zorluk çıkarsa da kablolu modem ile kullanmaktayım.</p>
<p>Günümüzde adından bahsedilen yeni kablosuz ağ teknolojisi ise WiMAX’tir. Çalışma prensibi standart kablosuz ağ sistemleriyle aynıdır fakat çok güçlü mikrodalga iletimiyle sinyalleri daha uzak mesafelere taşıyabilmek mümkündür. Bu sayede birim metrekarelik alan için gereken kablosuz ağ noktası maliyeti düşmekle beraber sinyal kalitesi de arttırılmış olmaktadır. Tabi sinyal kuvveti arttıkça bunun insanlara daha da fazla zararlı olacağı gerçeği hiç düşünülüyor mu gerçekten merak ediyorum. Baz istasyonlarının sağlığımızı ve hatta hayatımızı büyük ölçüde tehdit ettiğini düşünürsek, buna kablosuz modem, oyun kumandaları, klavye, mouse, bluetooth cihazları gibi aygıtlar da eklenince oluşan manyetik kirlenmenin boyutlarını düşünmek bile istemiyorum. Teknolojinin insan sağlığını destekleyici şekilde örneğin CRT’lerden LCD monştörlere geçişte olduğu gibi ilerlemesi gerekirken, gün geçtikçe manyetik kirlenmeye çanak tutulması insanları endişelendiriyor. Bunun en son örneği ise, elektriğin e kablosuz olarak iletilmeye başlanması. Tam bir manyetik alan kaynağı olan elektrik enerjisinin dağıtımı bu şekilde desteklenir ve yaygınlaşırsa, çok daha vahim durumlarla karşılaşılacağı ve toplu beyin ölümlerinin gerçekleşebileceği aşikar. İnsan beyninin de nöronlar yani sinir hücreleri üzerinden elektriksel olarak çalıştığını biliyoruz. Manyetik alan kaynakları beynin kendi manyetik alanını bozarak beyin ısısını arttırmakta ve hücreleri yavaş yavaş öldürerek ciddi hasarlar vermekte. Bölünme ile bir daha yerine gelemeyen beyin hücrelerinin ölümünden kaynaklı ciddi dolaşım bozuklukları ve ilerleyen safhalarda buna bağlı vücut iflası ve beyin ölümleri görülebilir.</p>
<p>Teknolojinin daha bilinçli kullanılması gerektiğinin farkına felaketler olmadan önce varılması dileğiyle…</p>
<p>Etiketler: 802.11a, 802.11b, 802.11g, 802.11n, alıcı, alıcı-verici, ağ, bağlantı noktası, Bilgisayar, Donanım, Elektronik, Full-Duplex, Half-Duplex, kablo, kablosuz, manyetik, manyetik alan, Mobilite, Nasıl Çalışır?, network, receiver, simplex, Tam-Dupleks, Teknoloji, trans-receiver, transmitter, verici, wi-fi, WiMAX, wireless, wireless network, Yarı-Dupleks, İnternet &#8230;..  alıntıdır.</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=26</wfw:commentRss>
		</item>
		<item>
		<title>RS232, RS422, RS485 Protokol Nedir?..</title>
		<link>http://assembly.hepsiproje.org/?p=24</link>
		<comments>http://assembly.hepsiproje.org/?p=24#comments</comments>
		<pubDate>Mon, 23 Jun 2008 20:57:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[protokoller]]></category>

		<category><![CDATA[CAN BUS]]></category>

		<category><![CDATA[carrier detect]]></category>

		<category><![CDATA[clear to send]]></category>

		<category><![CDATA[data set ready]]></category>

		<category><![CDATA[data terminal ready]]></category>

		<category><![CDATA[DEVICENET]]></category>

		<category><![CDATA[FOUNDATION FIELD BUS]]></category>

		<category><![CDATA[GPIB]]></category>

		<category><![CDATA[ground]]></category>

		<category><![CDATA[Matrix Profibus]]></category>

		<category><![CDATA[MODBUS]]></category>

		<category><![CDATA[Nedir]]></category>

		<category><![CDATA[PROFIBUS]]></category>

		<category><![CDATA[Protokol]]></category>

		<category><![CDATA[protokol nedir]]></category>

		<category><![CDATA[receive data]]></category>

		<category><![CDATA[request to send]]></category>

		<category><![CDATA[ring indicator]]></category>

		<category><![CDATA[rs232]]></category>

		<category><![CDATA[rs232 protokol]]></category>

		<category><![CDATA[rs422]]></category>

		<category><![CDATA[rs422 protokol]]></category>

		<category><![CDATA[RS422 RS485 Protoko Nedir]]></category>

		<category><![CDATA[rs485 protokol]]></category>

		<category><![CDATA[RS485i]]></category>

		<category><![CDATA[transmit data]]></category>

		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=24</guid>
		<description><![CDATA[RS232 nin Matrix Profibus hali diyebileceğimiz ve bir okadar kulanılabilir ve esnek yapıya sahip  RS485 hakkında bir kaç küçük bilgi…
RS485 Kodlu iletişim sistemi genelde Siemensin kullandığı Profibus sistemidir. Yani Profibus=RS485
Daha basit bir dilde anlatmak gerekirse RS232 Platformunun geliştirilmiş modeli diyebiliriz. RS232 nominal 9600kb hızla çalışır. RS485 ise 12Mb hıza kadar çıkartılabilir. RS232 Max 15 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>RS232</strong> nin <strong>Matrix Profibus</strong> hali diyebileceğimiz ve bir okadar kulanılabilir ve esnek yapıya sahip  <strong>RS485</strong> hakkında bir kaç küçük bilgi…</p>
<p>RS485 Kodlu iletişim sistemi genelde Siemensin kullandığı Profibus sistemidir. Yani Profibus=RS485<br />
Daha basit bir dilde anlatmak gerekirse RS232 Platformunun geliştirilmiş modeli diyebiliriz. RS232 nominal 9600kb hızla çalışır. RS485 ise 12Mb hıza kadar çıkartılabilir. RS232 Max 15 MT kablo kullanılabilir. RS485 te ise 300mt kullanılır daha uzun mesafelerde her 300 mt de veriyoluna Repeater denilen cihazlardan takmak gerekir. Genelde üç kablo kullanılır. RxD, TxD (Receive Data, Transmit data) üçüncü kablo ise elektromanyetik alandan ve istenmeyen sinyallerden etkilenmemesi için ekranlama kablosudur. Ekran alıcıların ve göndericilerin PE yada Ground hatlarına bağlanır. Daha fazla bilgi istersen Profibus olarak arattır. Kolay gelsin.<br />
<span id="more-24"></span><br />
RS232 : En eski, en basit, en yaygın ve en çok bilinen iletişim protokolüdür. Buna Örnek olarak PC lerde bulunan seri port ünitesi verilebilir.<br />
Maximum iletim mesafesi 15 mt. dir. DB9 isimli konnektörlerle bağlantı yapılır. Maximum veri iletim birimi 9.6Kbps dir.<br />
Pın Şeması</p>
<blockquote><p>1: carrier detect (cd)<br />
2: receive data (rd)<br />
3: transmit data (td)<br />
4: data terminal ready (dtr)<br />
5: ground (gnd)<br />
6: data set ready (dsr)<br />
7: request to send (rts)<br />
8: clear to send (cts)<br />
9: ring indicator (ri)</p></blockquote>
<p>en cok 2. 3. ve 5. pinler kullanilir, bazi aygitlar icin diger pinlerin baglanmasina bile gerek yoktur, voltaj referansı lojik 0 icin -3..-25v ; lojik 1 icin +3..+25v dir<br />
1990larda eia-232 olarak yeniden adlandırılmasına ragmen, kimse eia’yi sallamayıp ares232 demeye devam etmiştir.seri cihazların en basit şekilde haberleşmesinde kullanılan standartlardır.</p>
<p>RS422</p>
<p>RS232 ile aynı yapıya sahip ama daha hızlı bitratelerini destekleyen bir iletişim protokolüdür.</p>
<p><strong>RS485 :</strong> RS232′nin mesafe yönünden oluşturduğu dezavantajı azaltmak için geliştirilmiş protokoldür.</p>
<p><strong>USB :</strong> Kısa mesafe ve hızlı veri iletişimi ile günümüzdeki PC bazlı donanım veya aparat üreten firmaların hemen hemen hepsince desteklenen iletişim protokolüdür.</p>
<p>Açılımı Universal Serial Bus tır. USB 1.1 için Maximum veri iletimi 128 Mbound USB 2.0 için iletim hızı 477 Mboundlara kadar çıkmaktadır.</p>
<p><strong>GPIB :</strong> Hızlı ve güvenilir veri iletimi için geliştirilmiş bir iletişim protokolüdür.</p>
<p>general purpose interface bus” kısaltması. hp icadıdır, hp ib olarak da anılır. Ancak günümüzde Endüstriyel otomasyon ve bilgisayar sistemlerinde pek kullanılmamaktadır.</p>
<p><strong>PROFIBUS :</strong> Profibus geniş kapsamlı üretim ve proses otomasyonu için tasarlanmış üreticiden bağımsız açık saha bus standartıdır.<br />
Üretici bağımsız oluşu ve açıklığı uluslararası standartlar olan En 50170, EN 50254 ve IEC 61158 üzerine kurulmuştur.<br />
650′ye yakın üyesi bulunan ve birçok araştırma enstitiüsü tarafından desteklen Profibus, farklı üreticilerin cihazları arasında<br />
haberleşme sağlayan ve bunu yaparken herhangi özel bir arabirime ihtiyacı olmayan bir veri yolu olmakla birlikte,</p>
<p>yüksek hızlı kritik uygulamalar veya komplex haberleşme işlemleri gibi kullanım alanlarında yaygın olarak uygulanan bir veri yolu sistemidir. RS485 olarakda adlandırılır.</p>
<p><strong>MODBUS</strong> : rs485 uzerinden seri olarak yada tcp ip uzerinden yapilan endustriyel otomasyon haberlesme protokulu. Özellikle otomasyonda elektronik kartların birbiriyle haberleşmesinde kullanılır.</p>
<p><strong>CAN BUS : </strong>Bosch firması tarafından geliştirilen (seri) veri yolu sistemi olan Controller Area Network veri yolu sistemi, özellikle otomotiv sektörüne yönelik<br />
akıllı network sensör ve actuatörler için tasarlanmış ve kısa bir zamanda bu çalışmalarda standart hale gelmiştir.<br />
Multi-Master yani bütün CAN noktalarının data iletebildiği ve birkaçınıda eş zamanlı olarak istekte bulunabildiği veri yolu sistemi olan<br />
CANbus sistemi alıcılar arasındaki adreslemeye göre çalışır. Örneğin Canbus Networke bağlı birçok modül birbirinden eşsiz adreslemeyle birlikte öncelikli mesajın iletilmesi şeklinde veri iletir.</p>
<p>Bu veri iletişim protokolu en sık Otomotiv ve Medikal endüstrisinde kullanım alanı bulmaktadır.</p>
<p><strong>DEVICENET :</strong> Allen-Bradley tarafından geliştirilen Akıllı sensör ve aktüatorler için tasarlanmış endüstriyel network yapısı olan DEVICENET “Open DeviceNet Vendors Association ” adı verilen üretici bağımsız bir kuruluş tarafından günümüzde gelişimini sürdürmektedir. DEVICENET ile limit switch, fotoelektrik sensör, barkod okuyucu ve motor starterleri gibi düşük seviyeli aygıtlara bağlanılabilir ve PC veya PLC gibi daha üst seviyeli aygıtlarla haberleşme sağlanabilir</p>
<p><strong>FOUNDATION FIELD BUS: </strong>Özellikle dağıtılmış proses kontrol uygulamaları için dizayn edilen Fieldbus Foundation (organizasyon) olarak dünyadaki otomasyon sistemlerinde yaklaşık %80 ‘lik bir pazara sahip olan 140 şirketin biraraya gelmesi ile oluşmuştur. Teknolojisi fiziksel katman, haberleşme çatısı ve kullanıcı katmanından meydan gelmektedir.</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=24</wfw:commentRss>
		</item>
		<item>
		<title>Assembler</title>
		<link>http://assembly.hepsiproje.org/?p=23</link>
		<comments>http://assembly.hepsiproje.org/?p=23#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:22:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[assembler]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=23</guid>
		<description><![CDATA[Assembler
Çevirici (Assembler)
Tipik olarak bir modern çevirici assembly (çeviri) komut “mnemonic”leri operasyon kodlarına “opcodes” çevirerek (tercüme ederek), ve hafıza mahalleri (memory locations) ve diğer varlıklar için sembolik isimler belirleyerek “object code” unu oluşturur. Sembolik referansların kullanılması, program modifikasyonlarından sonra bıktırıcı hesaplamaları ve elle yapılan adres güncelleştirmelerini kaydettiğinden çeviricilerin en önemli (kilit) özelliğidir. Çeviricilerin çoğu metinsel ikameyi [...]]]></description>
			<content:encoded><![CDATA[<h2><a id="post-6" title="Permanent Link to Assembler" rel="bookmark" href="../?page_id=6">Assembler</a></h2>
<p><strong>Çevirici (Assembler)</strong></p>
<p>Tipik olarak bir modern <strong>çevirici</strong> assembly (çeviri) komut “<strong><a title="mnemonic" href="http://assembly.hepsiproje.org/?page_id=2" target="_self">mnemonic</a></strong>”leri operasyon kodlarına “opcodes” çevirerek (tercüme ederek), ve hafıza mahalleri (memory locations) ve diğer varlıklar için sembolik isimler belirleyerek “object code” unu oluşturur. Sembolik referansların kullanılması, program modifikasyonlarından sonra bıktırıcı hesaplamaları ve elle yapılan adres güncelleştirmelerini kaydettiğinden çeviricilerin en önemli (kilit) özelliğidir. Çeviricilerin çoğu metinsel ikameyi (yerine koymayı) yerine getirmek için – örneğin, bir alt rutin (subroutine) yerine “inline” olarak çalışacak komutların ortak kısa serilerini üretmek için- makro imkanları da içerirler.</p>
<p>Çeviriciler genellikle yüksek seviyeli dilleri yazma konusunda derleyicilerden (compilers) daha basittir, ve 1950’li yıllardan beri kullanılmaktadır. (Bilgisayarların ilk günlerindeki ilk çeviriciler yorgun programcıların bir jenerasyonu için önemli bir keşifti.) Modern çeviriciler, bilhassa MIPS, Sun SPARC ve HP PA-RISC gibi RISC’e dayalı mimariler CPU “pipeline” verimliliğini sağlamaya yönelik komutu (instruction) optimize ederler.</p>
<blockquote><p><strong>MIPS</strong> (originally an acronym for <strong>Microprocessor without Interlocked Pipeline Stages</strong>)</p>
<p><a title="MIPS" href="../images/MIPS.jpg" target="_blank"><img src="../images/MIPS_.jpg" alt="mips" width="180" height="180" /></a></p>
<p>A MIPS R4400 microprocessor made by Toshiba.</p></blockquote>
<p><span id="more-23"></span><br />
Daha sofistike (karmaşık) olan Yüksek Seviyeli çeviriciler aşağıda belirtilenler gibi dil özetlerini (abstractions) sağlarlar:</p>
<p>• Yüksek kontrol yapıları</p>
<p>• Yüksek seviyeli prosedür fonksiyon deklarasyonları ve talepleri</p>
<p>• Yapılar/kayıtlar, birlikler, sınıflar ve takımlar dahil yüksek seviyeli özet veri türleri</p>
<p>• Sofistike makro işleme</p>
<p>Normal profesyonel kullanımda <strong>çevirici</strong> teriminin sıklıkla farklı anlamlarda kullanıldığına dikkatinizi çekeriz; sıklıkla çevirici yararından ziyade bir çeviri dilinin kendisine atfen kullanılır. Böylece “ASM-H çok kullanılan bir S/370 çevirici olmuştur” ifadesine karşı “CP/CMS S/360 çeviricide yazılmıştır” ifadesi kullanılır.</p>
<p>Assembly dilinde yazılan bir program pek çok yerine getirilebilir komutlara (emirlere) tekabül eden komut “mnemonic”lerin (sembollerin) bir serisinden oluşur; bir çevirici tarafından tercüme edildiğinde bunlar hafızaya yüklenebilir ve yerine getirebilirler.</p>
<p>Örneğin; bir x86/IA-32 işlemci makine dilinde ifade edilmiş olan aşağıdaki ikili (binary) komutu yerine getirebilir:</p>
<p>• Binary (ikili) : 10110000 01100001 (Altı haneli ondalık: 0xb061)</p>
<p>Muadil assembly dilinin sunumu daha kolay hatırlanır (daha fazla “mnemonic” tir ):</p>
<p>• Mov al. 061h</p>
<p>Bu komut şunu ifade eder:</p>
<p>• 61 (97 ondalık) altı haneli değeri “al” adı verilen işlemci kaydedicisinin içine naklediniz</p>
<p>“mov” sembolü (mnemonic) bir operasyon kodu veya “opcode” olup, “move” (taşı) sözcüğünü kısaltmak için komut set tasarımcısı tarafından seçilmiştir. Virgülle ayrılmış argümanların veya parametlerin bir listesi “opcode”u izler; bu tipik bir assembly dil ifadesidir.</p>
<p>Assembly dilinin makine diline dönüştürülmesi bir çevirici tarafından gerçekleştirilir, ve bunun tersi olan işlem bir demonte edici (disassembler) tarafından yapılır. Yüksek seviyeli dillerin aksine basit assembly ifadeleri ile makine dil komutları arasında genellikle 1-10-1 ilişki bulunur. Ancak, bazı hallerde bir çevirici ortak ihtiyaç duyulan işlevselliği sağlayacak olan çeşitli makine dili komutlarına yayılan pseudoinstructions (yapma emirler) sağlayabilir. Örneğin, bir “büyük veya eşit ise dallandır” emrine sahip olmayan bir makine için bir çevirici makinenin “eğer küçük ise kur” (set if less than) ve “eğer sıfır ise dallandır (kurulan emrin neticesinde)” ifadelerine kadar uzanan bir “yapma emri” bir çevirici verebilir. Tam yetenekli çeviricilerin pek çoğu ayrıca daha karmaşık kod ve veri dizisini üretmek amacıyla satıcılar ve programcılar tarafından kullanılan zengin bir makro dili (aşağıda tartışılmıştır) de sağlarlar.</p>
<p>Her bilgisayar mimarisi kendine özgü makine diline sahiptir, ve dolayısıyla kendisine ait bir çevirme dili vardır. Bilgisayarlar destekledikleri işlemlerin sayısına ve tipine göre birbirlerinden farklıdırlar. Bilgisayarlar aynı zamanda farklı ebat ve sayıda kayıt ünitelerine, ve hafızada veri tiplerinin farklı örneklerine sahip olabilirler. Pek çok genel amaçlı bilgisayarlar esas itibariyle aynı işlevselliği sürdürürlerken, bu işlevlerin yapılış tarzı farklıdır; benzer çevirme dilleri bu farklılıkları yansıtır.</p>
<p>“Mnemonics” (sembollerin) veya assembly dil sentakslarının çoklu takımları tek bir emir (komut) takımı için hazır olabilir, tipik olarak farklı çevirici programlarında. Bu gibi durumlarda en popüler olan genellikle üretici tarafından temin edilen ve dokümantasyonunda kullanılandır.</p>
<p>kaynak: <a title="Assembly Kaynak " href="http://tr.wikipedia.org/wiki/Assembly" target="_blank">wikipedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=23</wfw:commentRss>
		</item>
		<item>
		<title>Assembly Programlama Dili</title>
		<link>http://assembly.hepsiproje.org/?p=22</link>
		<comments>http://assembly.hepsiproje.org/?p=22#comments</comments>
		<pubDate>Mon, 09 Jun 2008 16:18:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[assembly]]></category>

		<category><![CDATA[assembly progrmlama dili]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=22</guid>
		<description><![CDATA[Assembly
Bir Çevirme Dili (Assembly Language) bilgisayar programlarının yazılmasında kullanılan alt seviyeli bir dildir.
Assembly dili programlarının yazılımında insan dostu sembollerin “mnemonics” kullanılması, daha fazla hataya yatkın ve zaman alıcı ilk bilgisayarlarda kullanılmış olan bir hedef bilgisayarının sayısal makine kodunda doğrudan programlama çalışmasının yerine geçmiştir. Bir assembly dil programı çevirici “Assembler” olarak adlandırılan faydalı bir program tarafından [...]]]></description>
			<content:encoded><![CDATA[<h2><a id="post-2" title="Permanent Link to Assembly" rel="bookmark" href="../?page_id=2">Assembly</a></h2>
<p>Bir Çevirme Dili (Assembly Language) bilgisayar programlarının yazılmasında kullanılan alt seviyeli bir dildir.</p>
<p>Assembly dili programlarının yazılımında insan dostu sembollerin “mnemonics” kullanılması, daha fazla hataya yatkın ve zaman alıcı ilk bilgisayarlarda kullanılmış olan bir hedef bilgisayarının sayısal makine kodunda doğrudan programlama çalışmasının yerine geçmiştir. Bir assembly dil programı çevirici “Assembler” olarak adlandırılan faydalı bir program tarafından hedef bilgisayarın makine koduna çevrilir. (Bir çevirici bir derleyiciden (compiler) farklıdır, bu genellikle “mnemonic” ifadelerden makine komutlarına teke tek (izomorfik) çeviriler yapar.)</p>
<blockquote><p><strong>mnemonics</strong>: <span style="color: #808080;">bir bilgisayarın anlayabileceği makina dilini oluşturan genelde üç harfli ve karşılığı 8bit, 16 bit, 32 bit ve katları olabilen (windows 98′in 32 bit desteği 32bitlik mnemonicleri desteklemesi anlamına gelir) kod sözcükleri.</span></p>
<p><a title="mnemonic" href="../images/mnemonic.gif" target="_blank"><img src="../images/mnemonic.gif" alt="Mnemonic" width="117" height="83" /></a></p>
<p>yukarıdaki resimde bir plc mnemonic leri gözükmektedir. Assembly mnemonic lerini ve kod örneklerini sıklıkla göreceksiniz.</p></blockquote>
<p><span id="more-22"></span><br />
Assembly dili karmaşık programlar yazmak için kullanılan düşük seviyeli bir programlama dilidir. Assembly insanlar tarafından anlaşılması zor olan makina dilinin sayısal ifadelerini, insanlar tarafından anlaşılarak programlanması daha kolay olan alfabetik ifadelerle değiştirerek düşük seviyede programlama için bir ortam oluşturur. Assembly kullanmanın amacı, ilk bilgisayarlarda yazılan programların daha az hata içermesi ve daha az zaman almasını sağlamaktır.</p>
<p><a title="assembly kod örneği" href="../images/assembly.jpg" target="_blank"><img src="../images/assembly.jpg" alt="assembly " width="146" height="109" /></a></p>
<p>Assembly dilini makina koduna çeviren programlara <strong>assembler</strong> denir. Bir assembler’ı derleyiciden ayıran en önemli özellik bire bir dönüşüm yapmasıdır. <strong>Derleyiciler</strong> kodun tamamını okurlar ve kodun tamamını anlamlı bir programa dönüştürürler. Kodun her satırını tek tek okuyan ve uygulayan programlara ise <strong>yorumlayıcı</strong> denir.</p>
<p><strong>Assembly dili programları</strong>, genellikle platformdan bağımsız olan yüksek seviyeli programlama dillerinin aksine bir hedef bilgisayar mimarisine sıkı sıkıya bağlıdır ( ve bu bilgisayara özeldir). Çok fazla sofistike olan çeviriciler programın gelişmesini kolaylaştırmak, çeviri işlemini kontrol etmek ve hataların düzeltilmesine yardımcı olmak amacıyla mekanizmalar kullanarak program komutlarının temel çevirisini genişletir.</p>
<p>Assembly dili bir zamanlar programlamada çok fazla kullanılmaktaydı, ancak günümüzde daha az kullanılma eğilimindedir, öncelikle doğrudan donanım manipülasyonunun veya anormal performans hususları söz konusu olduğu zaman bu dil kullanılmaktadır. Tipik uygulamaları cihaz sürücüleri, alt seviyeli dahili (embedded) sistemleri ve gerçek zaman uygulamalarıdır.</p>
<p>kaynak: <a title="Assembly Kaynak " href="http://tr.wikipedia.org/wiki/Assembly" target="_blank">wikipedia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=22</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 6.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=19</link>
		<comments>http://assembly.hepsiproje.org/?p=19#comments</comments>
		<pubDate>Fri, 06 Jun 2008 22:01:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<category><![CDATA[JB/JC/JNAE Komutları]]></category>

		<category><![CDATA[JO ve JNO Komutları]]></category>

		<category><![CDATA[JZ/JE Komutları]]></category>

		<category><![CDATA[KAYDIRMA ve DÖNDÜRME KOMUTLARI]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=19</guid>
		<description><![CDATA[Şimdide isterseniz bu atlama komutlarının ne işe yaradığını kısaca anlatayım arkadaşlar..
JZ/JE Komutları :JZ/JE (Jump if Zero/Jump if Equal) komutları herhangi bir işlem sonrasında zero flag’ın değerine göre programın akışını düzenler. Komutun icrası sırasında zero flag içerisindeki bit değeri 1 ise program JZ komutu ile gösterilen yere atlar aksi taktirde işlemci JZ komut yokmuş gibi programın [...]]]></description>
			<content:encoded><![CDATA[<p>Şimdide isterseniz bu atlama komutlarının ne işe yaradığını kısaca anlatayım arkadaşlar..</p>
<p><strong>JZ/JE Komutları :</strong>JZ/JE (Jump if Zero/Jump if Equal) komutları herhangi bir işlem sonrasında zero flag’ın değerine göre programın akışını düzenler. Komutun icrası sırasında zero flag içerisindeki bit değeri 1 ise program JZ komutu ile gösterilen yere atlar aksi taktirde işlemci JZ komut yokmuş gibi programın akışına devam eder.</p>
<p><span id="more-19"></span><br />
<strong>JNZ/JNE Komutları : </strong>JNZ/JNE (Jump if Not Zero/Jump if Not Equal) komutları JZ ve JE komutlarının zıttı olarak kullanılır. Herhangi bir işlem sonrasında zero flag içerisindeki değer sıfır değil ise program komutun gösterdiği yere dallanarak akışına devam eder.<br />
<strong>JB/JC/JNAE Komutları : </strong>JB/JC/JNAE (Jump if Below/Jump if Carry/Jump if Not Above or Equal) komutları carry flag’ın değerine göre dallanma gerçekleştirirler. Herhangi bir işlem sonrasında carry flag<br />
içerisinde 1 değeri varsa programın akışı JB komutu ile gösterilen yere gider. Aksi taktirde JB komutu dikkate alınmadan programın normal akışına devam edilir.<br />
<strong>JBE/JNA Komutları :</strong> JBE/JNA (Jump if Below or Equal/Jump if Not Above) komutlarının icrası sırasında carry ve zero flag’ları kontrol edilir. Bir işlem sonrasında iki flag’dan birinin 1 olması durumunda JBE komutu ile gösterilen noktaya dallanma yapılır.<br />
<strong>JL/JNGE Komutları : </strong>JL/JNGE (Jump if Less than/Jump if Not Greater or Equal) komutlarının gerçekleşmesi için gerekli koşul carry ve overflow flag bitlerinin birbirinden farklı değerler taşımasıdır. İki bitin farklı değerler içermesi durumunda programın akışı JL komutu ile gösterilen noktaya yönlendirilir.<br />
<strong>JS ve JNS Komutları : </strong>JS (Jump if Sign) ve JNS (Jump if No Sign) komutlarının icrası sırasında sign flag kontrol edilir. Sign flag içerisindeki değerin 1 olması JS için, sıfır olması JNS için gerekli koşuldur. Gerekli koşulun sağlanması durumunda program JS veya JNS komutu ile gösterilen noktadan akışına devam edecektir.<br />
<strong>JO ve JNO Komutları : </strong>JO (Jump if Overflow) ve JNO (Jump if No Overflow) komutlarının icrası sırasında overflow flag içerisindeki değere bakılır. Overflow flag içerisinde 1 JO komutu için ve sıfır olması JNO komutu için gerekli koşuldur.</p>
<p><strong>KAYDIRMA ve DÖNDÜRME KOMUTLARI</strong></p>
<p>Bit çevirme ve kaydırma komutları pek çok alanda kullanılır. Grafiksel işlemlerde, çevrim işlemlerinde, sayaçlarda,&#8230; Bit kaydırma kendi arasında kaydırma komutları ve çevirme komutları komutları olarak ikiye ayrılır. Kaydırma komutlarıda aritmatik ve logical olarak ikiye ayrılırlar. Bunların arasında işlevsel bir farklılık vardır. Kaydırma komutları biti sonuç 0 oluncaya kadar sağa yada sola doğru kaydırır. Kaydırılan bit yokolur ve tersine işlem yapılsa bile geriye dönemez. Çevirme komutları ise bitleri çevirerek dönüşüm yapar ve bit sayısına bağlı olarak tekrar eski değerine ulaşır. Çevirme komutlarında hiçbir bitin değeri kaybolmaz. Daima çevrimiçi olarak kalır. İki komut grubunda da sağa ve sola kaydırma mevcuttur ve ingilizcedeki left, right kelimelerinin başharfleri ile belirtilirler. Bu komutlar yardımcı register ile kullanılarak blok kaydırma veya çevirme işlemlerine tabi tutulabilirler. Yardımcı register değişmez olarak CL registerdir ve burada bir sayaç görevini üstlenir. Registerdeki sayının bitini şu kadar kaydır diye komut verebiliriz. Özellikle aritmatiksel kaydırma komutları register-register kullanılımı ile kaydırmak işlevine sahiptirler. Burada kaydırma sayısı registeri 0-31 sayıları olmak zorunda çünkü şu anda bu komutlar en fazla 32 bitlik registerleri kullanabiliyor.<br />
Mantıksal kaydırma ve çevirme komutları bildiğimiz matematiksel bölme ve çarpma işlemlerinin aynısı yaparlar. Sağa doğru yapılırsa çarpma, sola doğru yapılırsa bölme işleminin aynısını yapmış olurlar.<br />
Mantıksal kaydırma komutları : Örnek olarak elimizde eax registerde 00111000 şeklinde bir sayımız var. Bu sayıyı 1 bitlik kaydırma işlemine tabi tutuyoruz:<br />
MOV EAX ,00111000<br />
SHL EAX,1<br />
Eax=01110000<br />
Burada shl eax,1 komutu ile eax registerdeki bitleri sola doğru (shl= sola , shr = sağa) kaydırdık. Örnektede görüldüğü gibi ilk bit 0 oldu ve ilk set olan bit sola doğru kaydı. Sonuçta sayının değeri iki katına çıkmış oldu. Çünkü basamak atladı.Eğer biz bu işlemi 5 kere daha yaparsak bütün bitler sola doğru kayacağı ve yerlerin resetleyeceği için sonuç 0 olacaktır. Yani sayı döngü içinde mutlaka 0 değerine ulaşacaktır. Buradaki 0 değeri olarak bahsettiğim bitlerin tamamının sıfırlanması ve sayıyın değerini tamamen kaybetmesi oluyor.</p>
<blockquote><p>shl eax,1 ; 01110000 &lt;-<br />
shl eax,1 ; 11100000 &lt;-<br />
shl eax,1 ; 11000000 &lt;-<br />
shl eax,1 ; 10000000 &lt;-<br />
shl eax,1 ; 00000000 &lt;-</p></blockquote>
<p>Eğer sayıya shr işlemine (sağa kaydırma) tabi tutarsak:</p>
<blockquote><p>shr eax,1 ; 01110000 -&gt;<br />
shr eax,1 ; 00111000 -&gt;<br />
shr eax,1 ; 00011100 -&gt;<br />
shr eax,1 ; 00001110 -&gt;<br />
shr eax,1 ; 00000111 -&gt;<br />
shr eax,1 ; 00000011 -&gt;<br />
shr eax,1 ; 00000001 -&gt;<br />
shr eax,1 ; 00000000 -&gt;</p></blockquote>
<p>Mantıksal Döndürme komutları:Mantıksal döndürmek komutları aynı kaydırma komutları gibi bitleri sağa yada sola kaydırır yalnız bitlerin değeri kaybolmaz her kayan bitin yerine bir önceki bit gelir. Son bit ilk bir ile yer değiştirir veya ilk bir son bit ile yer değiştirir. Eğer döndürülecek registerin değeri 0 değilse ve değerini yokedecek başka bir işlem yapılmıyorsa değeri asla 0 olmaz. Çevrimi bir daire gibi düşünebiliriz. Aynı dünyanın güneş etrafında dönüşü gibi belli bir süre sonra bitler tekrar aynı yerlerine gelecektir. Yine kaydırma komutarı gibi tek tek yada yardımcı register vasıtasıyla birden fazla kombine çevrim mümkündür.<br />
Ayrıca RCR ve RCL çevirme komutlarıda CL register ile kombine kullanılır. İşlevleri aynıdır ancak C bayrağı ile birlikte kullanılır. Bu sayede döndürme işlemini bayrak bazında kontrol altına alabiliriz. Örneğin döndürülen sayının 0 olması durumda.<br />
mov ax,0111000<br />
mov cl,5<br />
rcl ax,cl<br />
Evet arkadaşlar böylece Assembly makalesini de bitirmiş oluyoruz.Dediğim gibi Assembly insana uzak ama makine ya yakın bir dil.Ama öğrenilmeyecek bir dilde değil.Umarım faydalı olabilmişimdir.Sevgilerimle….</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=19</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 5.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=18</link>
		<comments>http://assembly.hepsiproje.org/?p=18#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:56:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=18</guid>
		<description><![CDATA[ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -4 )
ASSEMBLY KOMUTLARI           :
Mantık Komutları: Arkadaşlar Mantıksal işlemlerde VE, VEYA, DEĞİL, VEYA DEĞİL gibi mantık karşılaştırmaları vardır. Bunlar assembly de AND, OR, XOR, NOT komutlarıyla işlevlerini gerçekleştirirler. Buradaki amaç en iyi seçenekleri bulmak ve istenildiği şekilde gruplama yapabilmektir. Mantıksal yani [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -4 )</strong></p>
<p><strong>ASSEMBLY KOMUTLARI           :</strong></p>
<p>Mantık Komutları: Arkadaşlar Mantıksal işlemlerde VE, VEYA, DEĞİL, VEYA DEĞİL gibi mantık karşılaştırmaları vardır. Bunlar assembly de AND, OR, XOR, NOT komutlarıyla işlevlerini gerçekleştirirler. Buradaki amaç en iyi seçenekleri bulmak ve istenildiği şekilde gruplama yapabilmektir. Mantıksal yani diğer adıyla Lojik işlemler bit’lerin temizlenmesini (0’lanmasını), 1’lenmesini veya tersinin alınmasını sağlar. Bütün lojik işlemler bayrak bit’lerini etkiler.Şimdi bu komutları görelim.</p>
<p><span id="more-18"></span><br />
<strong> AND komutu :</strong> AND komutu işlem sırasında “hedef” ve “kaynak” bölgesindeki değerleri mantıksal VE işlemine tabi tutar ve işlemin sonuncunu “hedef” alana kaydeder. Yapı olarak AND (VE) mantığı 1 ve 0’lar ile ifade edilirse aşağıda ki şekilde açıklayabiliriz;</p>
<blockquote><p>1 ve 1 = 1<br />
1 ve 0 = 0<br />
0 ve 1 = 0<br />
0 ve 0 = 0</p></blockquote>
<p>sonuçlarını üretir.Yukarıda da görüldüğü gibi arkadaşlar her iki değerde 1 ise sonuç 1 oluyor.Aksi durumlarda sonuç hep 0 olur.Bu komutu assembly programcıları genelde maskeleme işlerinde kullanırlar Aşağıdaki örnek açıklayıcı olacak;<br />
Mov ah,09hà ah ye 9 değerini yükledik<br />
Mov al,05h à al ye 5 değerini yükledik<br />
And ah,al à And işlemine tabii tutup sonucu AH de saklıyoruz.<br />
Yukarıda ki işlem şu şekilde işleyecektir.</p>
<blockquote><p>Ah       = 00001001<br />
Al        = 00000101</p></blockquote>
<p>And     =&#8212;&#8212;&#8212;&#8212;&#8212;<br />
00000001 = sonuç 1 olacak ve Ah ye yazılacaktır.Bu şekilde maskeleme yaparak 4 bite dokunmadan diğer bitleri sıfırlamakta denilebilir.<br />
TEST Komutu : TEST komutu tamamen AND komutu gibi çalışır. Tek fark elde edilen sonucun hedef alana aktarılmaması onun yerine değişen flag bitlerine göre programın akışının kontrol edilmesidir.<br />
OR Komutu : Bu komut da arkadaşlar mantıksal VEYA işlemine tabii tutar.Yukarıda ki AND işlemi gibi bitlerle işleme sokulur.OR işleminde her iki değerden birinin 1 olması durumunda sonuç yine 1 olur.Sadece her iki değerde 0 olursa sonuç 0 olur.Aşağıdaki tablo açıklar nitelikte.<br />
Or hedef,kaynak  şeklinde kullanılır.</p>
<blockquote><p>1 veya 1 = 1<br />
1 veya 0 = 1<br />
0 veya 1 = 1<br />
0 veya 0 = 0</p></blockquote>
<p>XOR Komutu : XOR komutunu arkadaşlar şu şekilde açıklayabiliriz, iki operand aynı ise 0, farklıysa 1 değerini veren bir işlemdir.Yada &#8220;aynılarda 0 farklılarda 1&#8243; sonucunu veren mantıksal ifadedir diyebiliriz. Özellikle şifreleme işlemlerinde tercih edilir ayrıca program içerisinde bir registerde ki değerleri sıfırlamak içinde kullanılır.Örneğin XOR EAX,EAX gibi bir kullanımda EAX içerisindeki değer sıfır olur ,bu kullanım MOV EAX,0 komutuyla aynı işi yapmasına rağmen XOR komutu daha hızlı ve seri çalışır.. Bir sayıyı kendisiyle XOR işlemine sokarsak 0 elde ederiz..</p>
<blockquote><p>1 &#8212; 1 = 0<br />
1 &#8212; 0 = 1<br />
0 &#8212; 1 = 1<br />
0 &#8212; 0 = 0</p></blockquote>
<p>NOT Komutu : NOT komutu &#8220;değil&#8221; anlamına gelir. Bunu bitlerin değili anlamında düşünürsek 1 ise 0 ; 0 ise 1 demek oluyor. Yani bitleri tam tersine çevirmiş oluyoruz.. NOT komutu diğer mantıksal komutlardan ayrı olarak flag register üzerine etki etmeyen tek komuttur. Kullanım şekli ile de diğer komutlardan farklılık gösterir. Direk “hedef” alan içerisindeki değerin bitleri ters çevrilip yine aynı alana yazılır.</p>
<blockquote><p>1 Değil   = 0<br />
0 Değil   = 1</p></blockquote>
<p><strong>Döngü Komutları : </strong>Evet arkadaşlar her programlama dilinin vazgeçilmezi olan döngü komutları da assembly ‘de aynı yere sahiptir.Döngü komutları verilen herhangi bir rutini koşul sağlanıncaya çalıştırır.Diğer dillerde ki For-next veya while-wend komutları gibi. Döngü komutları genelde şunlardır: LOOP, LOOPE, LOOPNE, LOOPZ, LOOPNZ. Bunlar CX (Count Register) yada ECX registerin durumuna göre işlem yapar..Döngü komutları LOOP ile başlar ve yanına aldığı ayrı bir opkod oluşur. Aldığı ek işlemi yapma ve devam etme şartıdır. Bu komutlar daima CX (veya ECX) register ile birlikte çalışır. Şartı ve döngü uzunluğunu bu sayaç register oluşturur. Daha önce gördüğümüz bayraklar burada da etkindir. Karşılaştırma ve şartın yerine getirilmesi kontrolu Z (sıfır bayrak = zero flag) ile kontrol edilir. Döngüyü kaplayan alanın bir sınırı vardır. Bunun nedeni ise döngü noktasını belirten değerin 8 bitlik bir sayı olması. Bu kodun +127 byte yukarı ve -128 byte aşağıya kadar ulaşması demektir.<br />
<strong>LOOP Komutu : </strong>LOOP komutu arkadaşlar o andaki CX (Count Register) yada ECX sayaç registerinin değeri 0 oluncaya kadar döngüyü işletir. Şartı sayaç registerin 0 olmasıdır. Yani her döngüde CX içerisindeki değer bir azaltılır ve CX’in değeri sıfır oluncaya kadar işlem devam eder.</p>
<blockquote><p>XOR AX, AX             AX degerini sıfırladık<br />
MOV CX,0005           CX 5 degerini atadık<br />
INC AX                      AX 1 eksilt<br />
LOOP                                     Tekrar INC komutuna dönecek</p></blockquote>
<p><strong> LOOPE ve LOOPNE Döngüleri :</strong> Eşit olması yada olmaması gibi bir durum kontrol eder. Burada yapılan işlem diğerleri gibidir ve pek bir fark yoktur.Loop kelimesinin sonundaki ”E” eşit (Equal) ve “NE” kelimeside (Not Equal) yani eşit değilse anlamındadır.Böyle bir döngü ile karşılatıgınız zaman ne anlamı oldugunu hemen anlarsınız.Burda CX deki değer verilen şarta eşit ise veya değil ise döngü ona göre çalıştırılır.<br />
<strong> LOOPZ ve LOOPNZ Döngüleri : </strong>Bu döngüler bir işlemin sonucu 0 ise zero flag bitinin (sıfır bayrak biti) olması durumuna göre çalışır. Genelde bu döngü komutları daha çok kullanılır ve ikiside sayaçlı bir döngü işlemi için yeterlidir. LOOPZ komutu (Sonundaki “Z” opkodu Zero yani sıfır anlamında) CX veya ECX registerin o değerine ulaşıp ulaşmadığını kontrol eder. Bir bakıma yukarıda bahsettiğim LOOP komutu gibidir ve tek farkı bayrak kontrolu olmasıdır. LOOPNZ ise 0 değilse durumunu kontrol eder. Yani sayaç registerin değeri 0 değilse devam eder.<br />
<strong> ATLAMA KOMUTLARI</strong><br />
Namı diğer Dallanma komutları, programın normalde yukarıdan aşağı doğru giden akışını herhangi bir koşula bağlı olarak yada koşulsuz olarak başka bir yere yönlendirmek amacı ile kullanılır. Kullanılan bu dallanma komutları yüksek seviyeli dillerdeki “if” veya “goto” komutları gibi düşünülebilir.<br />
Assembly dilinde kullanılan dallanma komutları atlama yaptıkları yere göre FAR veya NEAR özelliği taşır. NEAR özelliği taşıyan komutlar 2-3 bayt yer tutarken FAR özellikli olanlar 5 bayt yer tutmaktadır. Komutlar arasındaki fark, FAR özelliği taşıyanların farklı segment içerisindeki noktalara dallanma için kullanılmasıdır. Gerekli olmamakla beraber dallanmanın türü “FAR PTR” yada “NEAR PTR” ile belirtilebilir.<br />
JMP (Koşulsuz Dallanma) Komutu: JMP komutu belirtilen herhangi bir noktaya koşulsuz olarak dallanma yamak için kullanılır.<br />
jmp hedef şeklinde gösterilebilir.Aşağıda karşılşabileceğiniz atlama komutalarını ve anlamlarını içeren bir tablo veriyorum.Bu tablo çok işinize yarayacak</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=18</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 4.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=17</link>
		<comments>http://assembly.hepsiproje.org/?p=17#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:52:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=17</guid>
		<description><![CDATA[ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -3 )
 ASSEMBLY KOMUTLARI           :
Evet arkadaşlar geldik komutlar bölümüne ,assembly ‘de komutları kendi aralarında bölümlere ayırmak bence daha iyi olacaktır.Böylece komutların ne işlem yaptıklarını hangi komutların nereler de kullanıldıklarını anlamak daha kolay olur.Ayrıca vereceğim bazı püf noktalar ile de komutlara [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -3 )</strong></p>
<p><strong> ASSEMBLY KOMUTLARI           :</strong></p>
<p>Evet arkadaşlar geldik komutlar bölümüne ,assembly ‘de komutları kendi aralarında bölümlere ayırmak bence daha iyi olacaktır.Böylece komutların ne işlem yaptıklarını hangi komutların nereler de kullanıldıklarını anlamak daha kolay olur.Ayrıca vereceğim bazı püf noktalar ile de komutlara bakarak ne üzerinde etkili olduklarını hemen kavrayacaksınız.Assembly ‘ de komutları Transfer Komutları, Matematiksel Komutlar, Mantık Komutları, ,Döngü Komutları , Atlama Komutları ve Kaydırma Komutları olarak inceleyeceğiz .Çok gibi görünse de siz bir sefer bu makaleyi okuduğunuz zaman bir çoğunu hemen kavrayacaksınız.Neyse Transfer Komutları ile başlayalım.</p>
<p><span id="more-17"></span><br />
<strong>Transfer (Veri Taşıma )Komutları   :</strong><br />
Bu grup içerisindeki komutlar herhangi bir bilgiyi register-register, bellek-register ve register-bellek bölgeleri arasında transfer etmek için kullanılır.Başlıcaları şu şekildedir.<br />
MOV Komutu: Arkadaşlar önceki bölümlerde birkaç örnek verirken bu komutu kullanmıştım.Şimdi bu komutu yakından inceleyeceğiz anlaşılması kolay bir komut.Adını zannedersem “Move”(taşı) kelimesinden almış.Kullanımı :</p>
<blockquote><p>Mov Hedef , Kaynak</p>
<p>mov register, register<br />
mov bellek, register<br />
mov register, bellek<br />
mov [adres+register], register<br />
mov register, [adres+register]</p></blockquote>
<p>vb .şekildedir.Yalnız dikkat edin burada ters bir durum var ,ilk önce hedef sonra ise kaynak adres yazılır mesela Windows da bir veri kopyalarken dikkat ettiyseniz orada önce kaynak ,sonra da hedef bölge yazılır,burada ise tam tersidir.Assembly komutlarının hepsinde önce komut sonra hedef ve araya ( , )virgül koyarak kaynak adres yazılır.Diğer gösterimler ise Mov komutu ile bu bellek ve registerler (kaydedici) arasında ne şekilde veri transferi yapılabileceğini gösterir.Bu komutun bayrak registerleri üzerinde herhangi bir etkisi yoktur.Unutmadan şunu da söyleyeyim taşıma yaptığınız veri ile register aynı değerde olmalıdır.</p>
<blockquote><p>MOV        AX, 1525h<br />
MOV        DS, AX</p></blockquote>
<p>Yukarıda ki örnekte 2 byte lik 1525h (hexdecimal) değer AX (AX burada 16 bit yani 2 bytedir)registere aktarılıyor.Sonra ise AX deki değer DS ‘ye (Data Segment) yazdırılıyor.<br />
LEA (Load Effective Address) Komutu :Bu komut ise Etkin Adresi Yükle anlamındadır.Bu komut Mov komutuna benzetilebilir ancak aralarında etkin bir fark vardır.Mov komutu ile registere bir yerdeki(hafızadan veya registerden) değer yüklersiniz.Oysa LEA komutu ile registere o yerdeki değeri değil,oranın adresini yüklersiniz.Bu şekilde iki yada üç komut ile yapılacak bir işlemi tek bir komut ile yapmış olursunuz. Kısaca ;LEA komutunun genel kullanım amacı herhangi bir register’a bir bellek adresini yüklemektir. Aşağıdaki kullanım şekli ve örnek açıklayıcı olacaktır.<br />
lea register, adres<br />
lea register, [adres]</p>
<p>dizi db ‘Merhaba’,0</p>
<p>Bu şekilde ki örnekte lea eax, dizi şeklinde yazarsam eax registere ‘Merhaba’ değeri değil de,bulunduğu yerin adresi yüklenir. Böylece biz bu verinin başından itibaren istediğimiz gibi çalışma yapabiliriz. Bu komutun da bayrak registerleri üzerinde herhangi bir etkisi yoktur.<br />
MOVS (Move String)Komutu:Arkadaşlar en güçlü dizi (String)veri transfer komutu olan MOVS hafızanın bir alanından diğer bir alanına veri aktarımı yapar.Yanına aldığı B,W,D takıları ile ayrı bir opkod halini alır ve buna göre bitte işlem yapar. Diğer bir deyişle, bu komut hafızadan- hafızaya veri transferi yapar. Bir MOVS komutu SI(Source index) ile adreslenen hafıza değerini, DI (Destination index) ile adreslenen hafıza alanına aktarır.Yani bir nevi Kaynak-Hedef ilişkisi.</p>
<blockquote><p>MOVSB  = 1 byte işlem için - BYTE(8 bit)<br />
MOVSW = 2 byte işlem için - WORD(16 bit)<br />
MOVSD =  4 byte işlem için - DOUBLEWORD(32 bit)</p></blockquote>
<p><strong>LODS (Load)komutu:</strong> Bu da MOVS komutu gibi yanına aldığı ekin boyutuna göre 8 ile 32 bit arasında işlem gücü kazanır. Temel görevi SI(yada ESI) registerin gösterdiği noktadaki değeri alıp bit değerine göre (AL, AX, EAX)registere (Load)yüklemektir. Ayrıca LODS komutu değeri yükledikten sonra SI registerin değerini kullanılan bit değerine göre arttırarak sonraki veriye göre ayarlamış olur. Bu 8 bit lik veri için 1 byte- 16 bit lik bir veri için 2 byte - ve 32 bit lik bir veri çin 4 byte otomatik olarak toplanacak demektir.</p>
<blockquote><p>LODSB  = 1 byte işlem için (8 bit)<br />
LODSW = 2 byte işlem için  (16 bit)<br />
LODSD = 4 byte işlem için (32 bit)</p></blockquote>
<p><strong><br />
CMPS (Compare)Komutu : </strong>CMP komutunun bir değişiği olan bu komut tekil olarak diğerleri gibi yanına aldığı ek ile orantılı olarak bit sayısı kadar işlem(Karşılaştırma) yapar.Yine bu komut SI (veya ESI) ve DI (veya EDI) registerler ile birlikte çalışır.Bu komut tüm karşılaştırma ve test komutları gibi bayrak registeri etkiler. Bu komutu kısaca SI register ile gösterilen bölgeyi DI ile gösterilen bölge ile karşılaştırır diye açıklayabiliriz.. Bu komut ileride göreceğimiz karşılaştırma komutları gibi registerler karşılaştırması yapmaz. Karşılaştırma sonucunu ZF (zero flag) ile alırız. Eğer iki bölgede verdiğimiz bir değerin karşılaştırılması sonucu aynı ise ZF set (1) olur. Eğer yanlış ise ZF reset (0) olur.<br />
<strong>XCHG (exchange) Komutu : </strong>Exchange komutu iki değerin karşılıklı olarak yer değiştirilmesi için kullanılır.Karşılıklı olarak registerler birbirlerinin değerlerini alırlar. Tabi yine değişim yapılacak değerlerin de aynı boyda olması gerekmektedir.Bu komut da flag register’lar üzerinde herhangi bir değişiklik yapmaz. Kullanımı çok basittir arkadaşlar.<br />
Xchg register,bellek<br />
Xchg bellek,register</p>
<p>Mov ax,1234   ( ax =1234 örnekteki değerler 16 bittir.)<br />
Mov bx,5678   (bx = 5678 )<br />
Xchg ax,bx      (ax =5678        - bx =1234  değerler yer değişti)<br />
XLAT Komutu :XLAT komutu esas olarak BX (veya EBX) ve AL registeri esas alarak çalışır Genellikle tablo olarak tasarlanan dizilere erişmek için kullanılır. AL kaydedicisine tablonun elemanlarından birini yükler. Bu komutu aşağıdaki örneğe bakarak daha iyi anlayabilirsiniz.<br />
Tablo DB   A, B, C, D, E, F<br />
Bu tablonun 4. elemanını AL’ye yüklemek istersek;<br />
MOV  AL, 04                    ; 04 .eleman sorguluyoruz.İndeks değeri (Diziler 0 dan başlar)<br />
LEA    BX, Tablo               ; BX’e (taban kaydedici) Tablonun ofset adresi yükleniyor<br />
XLAT ; Tablonun 4. elemanına erişilip E’nin ASCII karakterin hex karşılığı AL’ye yükleniyor(AL=105)<br />
<strong>PUSH-PUSHA-PUSHF—POP-POPA-POPF Komutları :</strong><br />
Arkadaşlar Yığın (Stack) konusunu önceki bölümde anlatmıştım. Bu yığın dediğimiz bölge döngülerin döngü sayısını tutmak içinde kullanılır. Ayrıca Bayrak registerlerin (F veya EF) durumu da yığın içinde saklanılabilir.Matematiksel işlemlerde de yığın kullanılır. Bu anlamda yığın çok önemlidir.İşte bu yığına veriyi atmak ve geri almak için de PUSH ve POP komutlarını kullanırız. PUSH ve POP komutları kullanıldığında yığın bölgesinin işaretçisi olan SP (Stack Pointer ) kaydedicisinin durumu da değişir. Tabiî ki bu yığına attığımız veya yığından çektiğimiz değerin boyutuna bağlıdır. 2 byte’lık değer ile işlem yaparak yığına 2 byte lık bir değer atarsak (mesela bu AX kaydedicisinin içeriği olabilir) SP’nin değeri de 2 byte azalır.Anlamadıysanız bir önceki konudan stack konusunu tekrar okuyabilirsiniz…<br />
PUSH komutu herhangi bir bilgiyi belleğin stack adı verilen bölümüne kaydetmek için kullanılır;diye tanımlayabiliriz.PUSH komutu ile stack üzerine atılacak bilgi en az 16-bit uzunluğunda olmalıdır.Komut aşağıdaki gibidir.<br />
PUSH değer<br />
Yukarıda “değer” ile gösterilen kısım daha öncede belirttiğim gibi 16-bit uzunluğunda olmalıdır. Bunun yanı sıra “değer” ile gösterilen kısım sabit bir değer alamaz. Yani PUSH ile stack üzerine yazabileceğimiz değer ya bir register içerisindeki değer yada bir bellek bölgesindeki değer olmalıdır.<br />
mov eax,1234        AX = 1234h değeri atıyorum<br />
push eax                 AX ‘teki değer şimdi STACK ‘ta ve   SP-2 olarak azaldı.<br />
POP komutu ile de stack üzerinden bilgi okuması yaparız. Yani PUSH komutu ile yığına gönderdiğimiz bilgileri POP komutu ile de geri okuruz. Okunacak bilgi 16-bit uzunluğunda olmalıdır.POP komutu ile alınan bilgi stack üzerine yazılan son bilgidir. PUSH ve POP komutları ile bilgi transferi yapılırken yazılan ve okunan bilgilerin sıralaması önemlidir, yine bir önceki konuda açıkladım. Programlar yazılırken stack üzerindeki işlemlerde hesaplama hatası yapmamak için buna dikkat etmek gerekir.<br />
mov eax,1234  = yukarıdaki örneğimiz<br />
push eax          = satck ‘a atıldı<br />
xor eax,eax      = eax ‘i boşaltıyorum<br />
pop eax           = eax-1234 değeri geri yükledim.<br />
PUSHA-POPA :Bazen bütün register’ların yığında saklanması gerekebilir. Örneğin bir donanım kesmesi oluştuğunda çağrılacak bir kod yazmak istersek kesme çıkışında bütün register’ların ilk konumuna getirilmesi gerekir. Bunun için kesme koduna girişte bütün register’lar stack’ta saklanmalı, ve çıkışta da hepsi geri alınmalıdır.<br />
İşte bu işlemi kolaylaştırmak 80386 sonrası işlemcilere tek komutla bütün registerleri yığına atan ve yine tek komutla hepsini yığından geri alan PUSHA ve POPA komutu eklenmiştir. Kısaca; PUSHA komutu sırasıyla 16 bit sistemde AX, CX, DX, BX, SP, BP, SI, DI kaydedicilerinin değerlerini stack’a atar.POPA da ters sırada geri çeker.<br />
PUSHF : PUSHF komutu da PUSH komutu gibi stack üzerine bilgi aktarır. Yalnız burada ki tek fark, PUSHF komutu ile aktarılacak bilginin herhangi bir register yada bellek bölgesinden değil de flag (bayrak) register’dan alınmasıdır.Yani bayrak registerlerin değeri Stack üzerine atılır.Sonunda ki “F” harfi Flag ( bayrak )anlamında olduğu için karıştırmayacağınıza eminim.Bir de atılacak bilgi doğrudan 16-bit uzunluğundaki flag register içerisindeki değerdir.Komut herhangi bir işlem sırasında bayrak register’ın mevcut değerini korumak için kullanılır.Yine PUSH komutunda olduğu gibi PUSHF komutu da atılan değerin boyutuna göre SP ’nin değerini azaltır. Aşağıdaki gibi tek başına kullanılır…<br />
PUSHF</p>
<p><strong>POPF : </strong>POPF komutu ile de arkadaşlar stack üzerine attığımız bayrak değerlerini ,yine 16-bit’lik bayrak register’a geri aktarırız. Ancak geri aldığımız bu 16 bitin hepsi işlemci tarafından dikkate alınmaz.Anlaşılacağı gibi POPF komutu bayrak register ’ın değerlerini tamamen değiştirmektedir. Sonunda ki “F” harfi Flag ( bayrak )anlamındadır.Komut tıpkı PUSHF komutunda olduğu gibi tek başına kullanılır.<br />
<strong><br />
Matematiksel (Aritmetik) Komutlar           :</strong><br />
Assembly de bütün register arasında standart toplama, çıkarma, çarpma ve bölme işlemleri rahatça yapılabilir arkadaşlar.Ben de burada standart olarak 4 bölüme ayırıp açıkladım. Aritmetiksel komutların<br />
icrası sırasında flag registerler değişikliğe uğrar.<br />
<strong><br />
a - ADD ve ADC (Toplama)Komutları :</strong> ADD komutu toplama işlemini gerçekleştirmek için kullanılır. ADD komutu ile “kaynak” içerisindeki değer “hedef” ile toplanıp tekrar “hedef” register içerisine kaydedilir. “Hedef” ve “kaynak” alanları da register-register, bellek-register, register-bellek gibi çiftlerden birisi olabilir.Örnek olarak;<br />
MOV AX, 5  à ax içerisine 5 değerini yazdık.<br />
ADD AX, 6   à Ax deki değer ile 6 yı toplayıp tekrar Ax ‘e kaydettik.<br />
Yukarıdaki örnekte AX registerimizin değeri 11 olacak ve hexdecimal karşılığı olarak 0Bh yazılacaktı.ADC komutu da tıpkı ADD komutu gibi toplama işlemi için kullanılır arkadaşlar.Aralarındaki tek fark ise ADC komutunda toplama işlemine bir de carry (elde biti) flag’ın değerinin eklenmesidir.Yukarıdaki örnekte işlemin sonucun da eğer carry flag’ın değeri 1 olsa idi, o zaman bizim işlemimizin sonucu da 11 değil 12 olarak çıkacaktı. Gösterimi daha anlaşılır olacaktır.<br />
register = hedef + kaynak + carry flag’ın değeri<br />
b- SUB , SBB ve CMP ( Çıkartma ) Komutları :<br />
SUB (Subtract )komutu çıkarma işlemi için kullanılır. Kullanımı ADD komutunda olduğu gibidir. “Kaynak” içerisindeki değer “hedef” içerisinden çıkartılıp sonuç “hedef” register içerisinde saklanır.Şu şekilde örnek gösterebiliriz.<br />
Mov ax,8<br />
Mov bx,3<br />
Sub ax,bx         sonuç ax = 5<br />
SBB Komutu (Subtract with Barrow) ise SUB komutunun Carry&#8217;li versiyonudur. Ödünç ile toplama komutu olan SBB, operand ile beraber elde (Carry) bayrağını çıkarmada kullanır.Yani SBB komutu ile SUB arasındaki ilişki, ADD komutu ile ADC arasındaki ilişki ile aynıdır.SUB komutu ile aynı işlem yapılır yalnız burada “hedef” alana atılan değerden carry flag’ın değeri de çıkartılır.<br />
register = hedef – kaynak – carry flag’ın değeri şeklinde gösterebiliriz.<br />
CMPbu komut aslın da karşılaştırma komutu gibi görünse de arkadaşlar CMP komutu kullanım bakımından tamamen SUB komutu gibidir. Ancak işlemin sonucunu herhangi bir kaydediciye yüklemez ,çıkartma işleminden sonra yalnızca bayraklar etkilenir aralarında ki fark sadece budur. CMP ’nin anlamı &#8220;compare&#8221; yani karşılaştır demektir. Bu komut A, C, O, P, S ve Z bayraklarını etkiler.CMP komutundan sonra sonuca göre genellikle koşullu dallanma komutları ile programın akışı değiştirilir.</p>
<p>Cmp ax, bx</p>
<p>Yukarıdaki örnekte Ax den BX çıkarılıyor AX, BX’e eşit ise işlemin sonucu sıfır olur ve zero flag 1 değerini alır.</p>
<p><strong>INC – DEC (Artırma-Eksiltme ) Komutları :</strong>INC ve DEC komutları registerleri, adresleri, yada değerleri azaltmak - arttırmak içindir. Her iki komutta her çalışmasında sadece 1 byte lık azaltma veya arttırma yapmaktadır. Daha fazla adımlarda azaltma-arttırma yapmak için ADD ve SUB komutlarını kullanmalıyız. DEC ve INC komutları oluşturdukları yeni değerlere göre bayrak registeri etkilerler.<br />
Kısaca INC komutu kendisine verilen register yada bellek bölgesi içerisindeki değeri bir arttırır. C<br />
dilindeki “++” komutu ile aynı işi yapmaktadır .Yada VB deki “a = a + 1” ile aynı anlamdadır.<br />
Add ax,1         komutu da aynı işi yapar fakat aşağıda ki örnek daha hızlı çalışır.<br />
inc ax   (ax= ++)<br />
DECkomutu da kendisine verilen register yada bellek bölgesi içerisindeki değeri bir azaltır.Yine C dilindeki “&#8211;“ komutuna ,yada VB dilindeki “ a = a – 1 ” komutuna karşılık gelmektedir.<br />
Dec ax (ax = &#8212; anlamın da ve oldukça hızlı çalışır)<br />
MUL ve IMUL (Çarpma) Komutları :Çarpma işlevide registerler arasında , adresler arasında, ve kendi arasında uygulanabilir. Çarpma işlemi MUL ve IMUL komutları ile gerçekleşmektedir. İkisini amacı çarpim olduğu halde MUL ve IMUL arasında farklılıklar vardır. MUL işaretsiz çarpma ,IMUL ise işareti dikkate alarak çarpma işlemlerini yapar.Arıca IMUL komutu 2 veya çarpıma olanak vermekte ve kullanım şekli daha geniştir. IMUL komutu 32 bit işlemler için idealdir.<br />
MUL :Aritmetiksel olarak çarpma işlemi iki değer ile gerçekleştirilmesine karşın MUL komutu sadece bir değer alır. MUL komutu ile kullanılan değer gizli olarak ax /al içerisindeki değer ile çarpma işlemine tabi tutulur.Şöyle ki;<br />
mov ax,0045    -ax = 45<br />
mov bx,0011   -bx =11<br />
mul bx             -ax * bx = sonuç yine ax registere aktarılır .<br />
Yukarıdaki örnekten anlaşılacağı gibi daima AX (AL ve EAX register) asıl çarpılandır.Eğer bir çarpma işlemi sonucu ax registerin alabileceği en büyük değeri geçiyorsa geçme sayısı DX registere aktarılır. Eğer geçme yoksa DX registerde bir değişme olmaz.<br />
IMUL : IMUL komutu da MUL komutu gibi çarpma işlemi için kullanılır tek fark IMUL komutunun işaretli sayılar üzerindeki işlemler için kullanılan bir komut olmasıdır.Ayrıca IMUL komutu çoklu register ve büyük değerlerle işlem yapmaya olanak vermektedir. Yanlız MUL komutunda olduğu gibi taşma olduğunda DX register aktarılma yapılmaz. IMUL ile üçlü çarpımda mümkündür.</p>
<p>mov ax, 04h<br />
mov bx,05h<br />
imul ax,bx,8h  ; [AX*BX] * 8 = 160<br />
Yukarıda sadece küçük sayılarla örnek verdim anlaşılması için yoksa bu komutla daha büyük sayılar çarpılabilir.32 bit işlemcilerde bu komut kullanılır.<br />
<strong>DIV ve IDIV (Bölme) Komutları : </strong>Bölme komutuda DIV ve IDIV olmak üzere kapsamlı olarak iki tanedir. DIV komut da MUL komutundan olduğu gibi sadece bir değer ile işleme girer ve gizli olarak AX register’ını kullanır. Yani işlem sonundaki bölüm değeri AX ve kalan değeri de DX içerisine atılır.DIV division yani bölme kelimesinin kısaltmasıdır, dikkat edilmesi gereken bir diğer husus da sıfır ile bölme durumudur. Diğer işlemlerde olduğu gibi bölme işleminde de matematik kuralları geçerlidir ve matematikte &#8220;sıfıra bölme&#8221; anlamsızdır. CPU&#8217; da sıfıra bölüm için özel bir kesme(interrupt) ayırmıştır ve böyle bir durum da işlemi durdurur.<br />
Mov ax,10<br />
Mov bx,3<br />
DİV bx<br />
bx deki 3 değeri ax deki 10 değerine bölünüyor ve ax de 3 değeri ,kalan 1 ise DX registerde saklanıyor.<br />
IDIV komutu ise aynı IMUL komutunda olduğu gibi daha yüksek işlemler için idealdir.Ayrıca IDIV komutu işaretli sayılar üzerinde işlem yapmak için kullanılır.Bu komutu fazla kullanmayacağınızdan bu kadar yeterlidir diye düşünüyorum.</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=17</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 3.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=16</link>
		<comments>http://assembly.hepsiproje.org/?p=16#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:46:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=16</guid>
		<description><![CDATA[ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -3 )
ADRESLEMELER :
Bildiğiniz gibi programları oluşturan kodlar ve veriler hafızaya yüklendikten sonra işlemci tarafından satır-satır icra edilirler. Ayrıca CPU tüm giriş-çıkış işlemlerini de hafızaya erişerek yapar. Bazen hafızadan doğrudan bir kod ya da veri alır, işler. Bazen hafızaya bir veri gönderdiğinizde birde bakmışsınız bu bir yazıcıdan belge olarak çıkmış . [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ASSEMBLY  PROGRAMLAMA DİLİ (BÖLÜM -3 )</strong></p>
<p><strong>ADRESLEMELER :</strong></p>
<p>Bildiğiniz gibi programları oluşturan kodlar ve veriler hafızaya yüklendikten sonra işlemci tarafından satır-satır icra edilirler. Ayrıca CPU tüm giriş-çıkış işlemlerini de hafızaya erişerek yapar. Bazen hafızadan doğrudan bir kod ya da veri alır, işler. Bazen hafızaya bir veri gönderdiğinizde birde bakmışsınız bu bir yazıcıdan belge olarak çıkmış . İşte bilgisayarın donanım ve yazılım olayın da yaptığı bunca çeşitli iş için CPU hafızaya değişik yollardan erişme ihtiyacı duyar. Sizlerde programlarınızı yazarken CPU’nun hafızaya nasıl erişeceğini yazdığınız kodlarla belirtmek zorundasınız. Assembly dilinin bir basamağı olan adresleme modları da bu konuları kapsıyor ve bence iyi bilinmesi gereken bir konu.</p>
<p><span id="more-16"></span><br />
<strong>Başlıca adreslemeler:</strong></p>
<p><strong>Register (Kaydedici) adreslemesi : </strong>Adından anlaşılacağı gibi kaydediciden kaydediciye yapılan işlemlerde bu adresleme modları kullanılır. En hızlı adresleme modu’dur, çünkü işlem hafızada (Bellekte) değil işlemcinin içinde gerçekleşir</p>
<blockquote><p>mov eax, ebx ; EBX teki değeri EAX’e kopyalar<br />
mov dl, al ; AL teki değeri DL’ye kopyalar (Açılımları yukarda söylemiştik)<br />
mov esi, edx ; EDX teki değeri ESI’ya kopyalar</p></blockquote>
<p>Kaydedici adreslemede en çok dikkat etmeniz gereken husus hedef ve kaynağın boyutlarıdır. Örneğin 16 bitlik bir kaydediciden 8 bitlik bir kaydediciye taşıma yapılamaz!<br />
mov cx, al ; Yanlış kullanım, AL(8 bit) ile CX(16 bit) eşit boyutta değil.<br />
Hafıza bölgesi adreslemesi : Bu adresleme ile register hafızanın herhangi bir bölgesi işaretlenir. Bunun için MOV komutu yerine LEA (ilerde bahsedeceğim)komutunu kullanabiliriz. MOV komutu registere verilen değeri yükler yada adresler. LEA komutu da aynı işi yapar. Ancak MOV komutundan önemli bir farkı vardır. Verdiğiniz yerdeki değeri değil adresi yükleme yapar. <strong>Örneğin:</strong><br />
debug &#8216;Yazi1&#8242;,01<br />
lea eax, debug şeklinde verilince EAX registere &#8216;Yazi&#8217; değişkeninin değeri değil bulunduğu yerin adresi yüklenir. Böylece biz bu verinin başından itibaren istediğimiz gibi çalışma yapabiliriz.<br />
Dolaysız adresleme :Bu adresleme registerler arasındaki değerlerin hafıza adresi olarak kullanılması ile oluşan adreslemedir. Buna göre elimizde hiçbir değer yok sadece registerler vardır.<br />
mov dword ptr [esi] ,eax =EAX deki değeri-ESI ile işaretlenen 32 bit hafıza bölgesine yaz<br />
mov byte ptr [eax],bl = Aynı şekilde fakat burada ki değer 8 bit<br />
mov dword ptr [esi],ebx =İlk örnek ile aynı</p>
<p>Burada şu ana kadar bahsetmediğim birkaç kelime var onları anlatmak istiyorum arkadaşlar.Örneğin byte ptr ve [ ] parentez şimdi bunları kısaca açıklayacağım.<br />
byte ptr : Açılımı arkadaşlar (byte pointer) demektir.Eğer yükleyeceğiniz değer 1 byte (8 Bit) cinsinden bir değer ise bunu işlemciye bildirmek zorundasınız ,aksi takdirde hata verir.<br />
word ptr : Bu da arkadaşlar (word pointer) anlamındadır.Ve 16 bittir.Yükleyeceğiniz değer16 bitlik ise yine CPU ya bildirmek zorundasınız…<br />
dword ptr : Bunun açılımı da arkadaşlar (double word pointer) demektir ,yani 16 bitlik 2 sayı anlamındadır.Doğal olarak da 32 bitlik (4 bayt) lık bir değeri temsil eder.<br />
[ ] Parentez : Bu ise arkadaşlar kullanıldığı yerin bir hafıza (bellek) adresi olduğunu gösterir.Bir [ ] parentez görürseniz o gösterilen yerin hafıza adresi olduğunu bilin..</p>
<p><strong>Dolaylı Adresleme :</strong>Bu adreslemede arkadaşlar ileride göreceğimiz PUSH ve POP komutuna benzer olarak istenilen bir hafıza adresine saklama işlemi yapılır. Bu bir register olabileceği gibi bağımsız bir değerde olabilir.Örneğin :</p>
<blockquote><p>mov dword ptr [deneme],ebx<br />
mov word ptr [00364010] ,4252h</p></blockquote>
<p>Böylece Registerler ve adreslemeler konusunu da bitirmiş oluyoruz.Ama siz başka makalelerde okuyarak bilginizi sağlamlaştırın derim çünkü değişik kaynaklar her zaman iyidir ama bu kadar anlaşılır olmayabilir J.Bundan sonra stack olayına da değinip ,komutlara geçeceğiz.Stack olayı da iyi bilinmeli ve anlaşılmalı arkadaşlar bu nedenle buna da değinmek istiyorum.Bu arada bugün Mübarek Kadir gecesi Allah C.C tekrarını nasip eder inşallah.</p>
<p><strong>STACK ( YIĞIN ) NEDİR :</strong></p>
<p>Gelelim arkadaşlar Stack dediğimiz Yığın konusuna.Bu konuda oldukça basit bir konu yeter ki bu yazdıklarımı dikkatli okuyun.Şimdi program yazan arkadaşlar bilirler ,program yazarken bir değişken kullanırız.Mesela deriz ki; sayi= 24 bu bizim değişkenimizdir.Ve değiştirilmediği sürece hep 24 değerini saklayacak.Ama biz bu değişkene başka değerlerde almak ve 24 değerinin de kaybolmamasını istiyoruz.İşte böyle bir durumda CPU bilgileri geçici olarak saklamak için hem registerleri hem de stack dediğimiz bu bölgeyi geçici yerleşim bölgesi gibi kullanır.Yani bilgilerimizi geçici olarak bu yığına atar ve geri alır.Kısaca Stack, bilgilerin geçici olarak depolandığı bir bölümdür deriz.<br />
Bu yığına giden bilgiler arkadaşlar word uzunluğunda olup en az 2 byte (16 bit) ‘dir.Bu stack alanının bilgisini SP (Stack Pointer) tutar ve buraya gelen verilerin uzunluğuna göre SP kendi değerini azaltır.Buradan değerler geri alındığında ise SP kendi değerini alınan verinin uzunluğu kadar artırır.Bu biraz karmaşık görünebilir ama değil çünkü biraz sonra bunu da bir örnekle anlatacağım .Bu yığına veriler PUSH ve POP komutları ile atılır ve geri alınır.Atarken PUSH komutunu ,alırken de POP komutunu kullanırız.Bunları komutlar bölümünde inceleyeceğiz zaten.<br />
Gelelim şimdi SP in veri alırken değerini azaltması olayına.Arkadaşlar şimdi bir çok bölmelerden oluşan bir kitaplık düşünün (Bu bizim Satck ‘ımız yani yığın bölgemiz).Bu kitaplığımız boş haliyle 100 adet kitap alabiliyor.Biz bu kitaplığa tutar da,5 adet kitap korsak ne olur?Kitaplığımızın %5 ‘i dolmuş olur ,yani boş alanı %95 ‘ e düşmüş yani azalmış oldu değil mi.Kitap alabilme yeri azaldı.İşte Stack ‘ta veri aldıkça boş olan yerleri azalıyor.Şimdi anladınız değil mi.<br />
NOT : Birde unutmadan arkadaşlar bu stack’a atılan veriler ,en sondan başlayarak geri alınır.Yani Son giren veri ilk çıkar.Şöyle diyelim hani biz kitaplığa 5 adet kitap koymuştuk ya,işte bu kitapları geri alırken de ilk önce 5. kitabı sonra 4. sonra 3.-2. ve 1. kitabı alabiliriz.Stack ta da bu böyledir.Tıpkı iç içe açılan For –next döngüsü gibi.En son açılan döngü ilk önce kapatılır. VB ‘ ci olduğum için aklıma bu örnek geldi.</p>
<p>Evet arkadaşlar bu konuyu da bitirdik .Komutlar bölümün de görüşmek üzere.Saygı ve sevgilerimle.</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=16</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 2.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=15</link>
		<comments>http://assembly.hepsiproje.org/?p=15#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:41:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=15</guid>
		<description><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM -2 )
REGISTERLER :
Evet arkadaşlar geldik registerler (Namı diğer Yazmaçlar nedense bu kelimeyi görünce sinir oluyorum ben buna kaydedici demeyi uygun buluyorum ama bilmeniz açısından yazdım ) konusuna, bu konuda oldukça kolay arkadaşlar.Makaleyi okudukta sonra anlayacağınızdan eminim.Registerleri kısaca şöyle tarif edebiliriz, programlamayla ilgilenen arkadaşlar bilirler,hani program yazarken değişken dediğimiz ,(a=53 , b= [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ASSEMBLY PROGRAMLAMA DİLİ (BÖLÜM -2 )</strong></p>
<p><strong>REGISTERLER :</strong></p>
<p>Evet arkadaşlar geldik registerler (Namı diğer Yazmaçlar nedense bu kelimeyi görünce sinir oluyorum ben buna kaydedici demeyi uygun buluyorum ama bilmeniz açısından yazdım ) konusuna, bu konuda oldukça kolay arkadaşlar.Makaleyi okudukta sonra anlayacağınızdan eminim.Registerleri kısaca şöyle tarif edebiliriz, programlamayla ilgilenen arkadaşlar bilirler,hani program yazarken değişken dediğimiz ,(a=53 , b= ”atmaca” gibi)değer atama durumları vardır ya hani,işte registerleri de bu değişkenlere benzetebiliriz.Örneğin b=”atmaca” değişkenimize başka herhangi bir değer atamadığınız sürece “b” ‘nin değeri hep “atmaca olacaktır.Taki bir değer atarsanız ,mesela 42 derseniz o zaman “b” ‘nin taşıdığı değer 42 olur.Bunun gibi registerler de (yani kaydediciler) CPU&#8217; nun her türlü işlemlerini yerine getirmesi için bu görevi yerine getirirler.<br />
Kısaca şöyle de diyebiliriz ,işlemci yani CPU register adı verilen bölmelerden oluşur ve bu registerler de mikroişlemcinin en temel bileşenlerinden biridir .Bu registerleri ben 4 bölüme ayırmayı uygun buluyorum kimileri 3 yada 5 bölüm olarak inceleyebiliyor.</p>
<p><span id="more-15"></span></p>
<p><strong>1-GENEL AMAÇLI REGİSTERLER</strong></p>
<blockquote><p>AX =Accumulator Register<br />
BX = Base (Taban )Register<br />
CX = Counter (Sayaç )Register<br />
DX = Data (Veri )Register</p></blockquote>
<p><strong>2-SEGMENT REGİSTERLERİ</strong></p>
<blockquote><p>CS = Code Segment Register<br />
DS = Data Segment Register<br />
SS = Stack Segment Register<br />
ES = Extra Segment Register</p></blockquote>
<p><strong>3-OFFSET REGİTERLERİ</strong></p>
<blockquote><p>IP = Instraction Pointer Register<br />
SP = Stack Pointer Register<br />
BP = Base Pointer Register</p></blockquote>
<p><strong><br />
a-)İndex Registerler</strong></p>
<blockquote><p>SI = Source (Kaynak )Index Register<br />
DI = Destination (Hedef)Index Register</p></blockquote>
<p><strong>4-FLAG (BAYRAK )REGİSTERLERİ</strong></p>
<blockquote><p>O = Overflow flag<br />
D = Direction flag<br />
I = Interrupt flag<br />
T = Trace flag<br />
S = Sign flag<br />
Z = Zero flag<br />
A = Auxilary Carry flag<br />
P = Parity flag<br />
C = Carry flag</p></blockquote>
<p>Evet registerlerimiz bunlar,siz şimdilik hepsini de ezberlemeye kalkmayın zamanla programlar üzerinde durdukça öğreneceksiniz,bunlardan özellikle flag (bayrak )registerleri sadece bilgi almak açısından kullanırız ,yoksa bunlar üzerinde işlem yapamayız.İşlem sonunda eşitlik var mı yok mu,veya işlem sonunda taşma oluyor mu ya da olmuyor mu; gibi bilgileri görmek için kullanırız.Ben yine de mümkün olduğu kadar karşılarına Türkçe karşılıklarını da yazdım ki zorlanmayasınız.Bunların bir kısmını ayrıntılı olarak sonraki konularda anlatacağım zaten.<br />
<strong><br />
1-GENEL AMAÇLI REGİSTERLER :</strong></p>
<p>Yukarıda görmüş olduğunuz (ax ,bx ,cx ve dx )registerleri eski 8 ve 16 bit işlemciler ( 8086,80186 gibi) için bu şekilde kullanılıyordu.Fakat bu işlemciler günümüzde pek kalmadı ve yeni 32 bit işlemciler daha yaygın bir şekilde kullanılıyor.Bunun içinde bu register isimlerinin başına Extended (Genişletilmiş ) kelimesinin “e” harfi getirildi.Yani EAX-EBX-ECX-EDX şeklinde oldular.Bizde bundan sonra bu Genel Registerler ,Segment Registerler ,Ofset ve İndex registerleri yazarken bu şekildeyazacağız.EBX-EDI-ESI-ESP vs gibi..<br />
Bir ornek ;</p>
<blockquote><p>Mov eax,24<br />
Mov ebx, 10<br />
Add eax , ebx<br />
Sonuç = 34</p></blockquote>
<p>Dönelim bu genel kaydedicilere ,bunlar kendi aralarında 2’ye bölünerek 8 adet olurlar.Şöyle ki;</p>
<blockquote><p>EAX = AH - AL<br />
(32 BİT)= (16 BİT) - (16 BİT)<br />
EBX = BH - BL<br />
(32 BİT)= (16 BİT) - (16 BİT)<br />
ECX = CH - CL<br />
(32 BİT)= (16 BİT) - (16 BİT)<br />
EDX = DH - DL</p></blockquote>
<p>Eğer bunlar 16 bit lik registerler olsaydı o zaman da 8 bit AH , 8 bit AL olarak değişecekti.Sonlarına eklenen H ve L harfleri “H” High (Yüksek)- “L” ise Low (Düşük) kelimelerinden gelmiştir. 16 bitlik bir register en fazla 65535 değerini alırken 32 bitlik bir register 4294836225 değerine kadar alır.<br />
EAX register programlarda en çok kullanılan yazmaçlardan biridir. Accumulator’ün kısaltılması sonunda oluşan EAX yazmacı bütün giriş ve çıkış işlemlerinde ve bazı aritmetik işlemlerde kullanılır.<br />
EBX Registeri Base register olarak da bilinir. RAM işlemlerinde adreslemede kullanılır. Register adresleme işlemlerinde daha çok offset degerlerini tutar. Ayrıca hesaplama işlemlerinde de kullanılır.<br />
ECX Registeri Counter registeridir. Döngü işlemlerinde ve kaydırma işlemlerinde sayaç olarak kullanılırIZ.<br />
EDX Register bazı giriş çıkış işlemlerinde ve matematiksel işlemlerde kullanılır.Daha çok çarpma ve bölme işlemlerinde büyük sayıları saklamak için AX registerinin bir parçasıymış gibi kullanılır.</p>
<p><strong>2-SEGMENT REGİSTERLERİ :</strong></p>
<p>Segment register’ ları (ECS, EDS, ESS ve ES) programımız bilgisayarın belleğine yüklendiği<br />
zaman bellek içerisinde oluşturulan bölümlerin (Segment) başlangıç adreslerini tutarlar. Yani bu register’lar için bir çeşit yer göstergeci diyebiliriz. ECS, programımızın çalıştırılabilir kodlarını barındıran (Code Segment) bölgesinin başlangıç adresini tutar. Yani ECS ile gösterilen yerde makine dili kodlarımız vardır. EDS ise, programımız içerisindeki değişkenlerin saklı tutulduğu bölümdür. ESS (Stack), bellekte programımız için ayrılan stack bölümünün ( ki bu bölümü ayrı bir şekilde aşağıda anlatacağım ) başlangıç adresini tutar.ES (Extra segment) ise daha çok dizi yani string (Numerik olmayan) işlemleri için kullanılırız.<br />
<strong><br />
3-OFFSET VE İNDEX REGİTERLERİ :</strong></p>
<p>Offset ve index register’ları bellek içerisindeki herhangi bir noktaya erişim sağlamak için kullanılır.Bu işlem için erişmek istediğimiz bölgenin offset ve segment adresleri gerekli register’lara aktarılır bizde bu şekilde işlemi gerçekleştirmiş oluruz..<br />
Instruction Pointer register’ı ise CPU tarafından işlenecek olan bir sonraki komutun bellekteki adresini tutar. Bu register üzerinde programcının hiçbir eylemi olamaz. Her komut icra edildikten sonra CPU otomatik olarak kullanılan komuta göre gerekli değeri bu register’a atar.Arkadaşlar belki biraz ağır bir anlatım gibi görünebilir fakat bunların başka bir izah şeklini bulamadım yani şu an aklıma gelmiyor.<br />
<strong>4-FLAG (BAYRAK )REGİSTERLERİ :</strong></p>
<p>Arkadaşlarbunları detaylı bir şekilde anlatmadan önce şunu hatırlatmak istiyorum.Bayrak kaydedicisindeki her bir bitin 1 olma durumuna SET, 0 olma durumuna da RESET denir. İşlemcinin ürettiği bu sonuçlar hakkında programcı bunlara bakarak işlem durumunu analiz eder.<br />
<strong>Overflow flag (OF):</strong> Biz buna taşma biti de diyebiliriz. İşaretli (negatif)sayı üzerinde meydana gelen taşma durumunu tespit etmek amacıyla kullanılır. Yani işlem sonucunda işaret biti değişmişse bu flag set edilir,yani 1 değerini alır.<br />
<strong>Direction flag(DF):</strong>Bizim kullanmadığımız bir bayraktır.String işlemlerini yapan komutlar için kullanılır.Yani bir stringi hafızanın bir yerinden diğer bir yerine kopyalarken CPU tarafından kullanılmaktadır. İşlemci bu bayrağa bakarak transferin yönünü belirler.<br />
<strong>Interrupt flag (IF) :</strong> Buna kesme bayrağı da diyebiliriz. CPU’nun çeşitli aygıtlardan gelen kesme isteklerini dikkate alıp almayacağını bildirir. 0 olması durumunda istekler dikkate alınmaz,1 olursa alır.<br />
<strong>Trace flag (TF) :</strong> Trace biti de diyebileceğimiz bu bayrak CPU nun sadece 1 komut çalıştırma yapması için kullanılır.Hani Debugger ile bir programı açıp programda adım adım ilerliyoruz ya ,işte CPU bunu ,bu bayrağın durumuna göre yapar 1 olursa işletilmeye hazırdır demektir..<br />
<strong>Sign flag (SF) :</strong> Yapılan işlem sonucunda elde edilen sayının en solundaki bit 1 ise bu negatif bir sayıdır demektir ve bu bayrakta 1 değerini döndürür.Eğer ki 0 ise pozitiftir ve bayrak 0 değerini yansıtır.Kısaca bu bayrak sayının negatif veya pozitif olduğunu gösterir.<br />
<strong>ADD EAX, EBX</strong><br />
Eğer SF nin değeri 1 ise o zaman EAX deki sayı negatif bir sayı deriz.<br />
<strong>Zero flag (ZF) :</strong> Bir işlemin toplam sonucu 0 ise bu flag set edilir yani 1, değilse reset yani 0 edilir.Bu bayrağı karıştırmayın arkadaşlar tekrar ediyorum eğer işlem sonunda sonuç 0 ise ,bu bayrak 1 değerini döndürüyor.Mesela<br />
<strong>SUB EAX, EBX</strong><br />
işleminde iki register’ın değerleri eşitse sonuç 0 olacağı için ZF set (1)edilecektir.Aşağıdaki Olly debugger ile aldığım örnek resim olayı kavramanıza yardımcı olacak.</p>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=15</wfw:commentRss>
		</item>
		<item>
		<title>ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ 1.BÖLÜM</title>
		<link>http://assembly.hepsiproje.org/?p=14</link>
		<comments>http://assembly.hepsiproje.org/?p=14#comments</comments>
		<pubDate>Fri, 06 Jun 2008 21:29:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Assembly Dersleri]]></category>

		<category><![CDATA[ASSEMBLY PROGRAMLAMA DİLİ DERSLERİ]]></category>

		<guid isPermaLink="false">http://assembly.hepsiproje.org/?p=14</guid>
		<description><![CDATA[GİRİŞ :
Evet arkadaşlar Bismillah diyerek başlıyoruz Assembly dilini çok iyi bilen biri olarak DEĞİL , ÖĞRENEN biri olarak anlattım ve mümkün olduğu kadar açıklayıcı ve basite indirgemiş şekilde anlatmaya çalıştım, çünkü bu makaleyi programlamayla iyi bir şekilde uğraşan arkadaşlar la beraber programlamayla amatör şekilde uğraşan arkadaşlarımız da okuyacaktır.Bu nedenle oldukça basit bir şekilde anlatım yaptığıma [...]]]></description>
			<content:encoded><![CDATA[<p><strong>GİRİŞ :</strong></p>
<p>Evet arkadaşlar Bismillah diyerek başlıyoruz Assembly dilini çok iyi bilen biri olarak DEĞİL , ÖĞRENEN biri olarak anlattım ve mümkün olduğu kadar açıklayıcı ve basite indirgemiş şekilde anlatmaya çalıştım, çünkü bu makaleyi programlamayla iyi bir şekilde uğraşan arkadaşlar la beraber programlamayla amatör şekilde uğraşan arkadaşlarımız da okuyacaktır.Bu nedenle oldukça basit bir şekilde anlatım yaptığıma inanıyorum.Aynı zamanda hiç programlama bilgisi olmayan arkadaşlarda bu yazıyı okuyacaklardır ,fakat “Bu da ne böyle ,bu nasıl dildir”diyeceklerine de eminim J Ama tekrar yapılarak ve azimle onlarında öğreneceğinden eminim.Bu makalenin sonunda uzman bir assembler programcısı olacağınızı elbette ki söyleyemem ,fakat assembly hakkında çok şey öğreneceğinizden ve Ergenekon üstadın akademisinden de bu makaleyi okuyarak çok daha fazla istifade edeceğinizden de eminim.Assembly biraz karmaşık gibi görünebilir,çünkü makinenizin yani bilgisayarınızın anladığı asıl dil bu diyebiliriz.Diyebiliriz diyorum çünkü aslında CPU yani işlemciniz Binary sayılar dediğimiz ikili sayı ( 1 ve 0 ) sisteminden başka bir dilden anlamaz.Bu sayıları ve dönüşümlerini ileriki konularda anlatacağım zaten bu nedenle üstünde durmuyorum.</p>
<p><span id="more-14"></span><br />
Aslında üst düzey hangi programlama dilini kullanırsanız kullanın ,hepside sonunda kullandığınız prog.dilinin compiler’i (derleyici) tarafından makine diline çevrilir. Yani 1ve 0 (sıfır)’ lara .1’in mantığına “akım var”, 0 ‘ın mantığı’na da “akım yok” diyebiliriz,kısaca makine bu dilden anlar, ve yine kısaca makineler aptaldır ama çok seri ve hızlıdırlar diyebiliriz. O zaman neden assembly öğrenmeyesiniz ki? Evet dersimize geçiyoruz .</p>
<p><strong>ASCII :</strong><br />
Arkadaşlar bir byte ile temsil edilen harfler için kullanılan en yaygın ASCII (Ameri can Standard Code for Infırmation Interchange) kod standardıdır. Herhangi bir *.exe dosyasına debugger (editor) ile baktığınız zaman ,o dosyanın içerisinde bir çok karmakarışık semboller ,işaretler ve karakterler görürsünüz.Bunlar Ascii kod karakter setinde ki rakamlara karşılık gelen harfler veya sembollerdir.Ascii tüm ülkelerde standart hale getirilmiş kod setleri olup,sizin kullandığınız bilgisayarlarda ve cep telefonlarında da bu standart kodlar kullanılır.Bu kodlar 0-255 arası değişik karakterlere ,harflere ve sayılara sahiptir.Mesela bizim kullandığımız 1 rakamını karşılığı Ascii 33 ‘tür.Büyük harfler 65 ‘den başlar ,küçük harflerde 97 ‘den başlayıp 122 ‘ye kadar devam eder.Aşağıda ki,</p>
<p><strong>Sayılar: Harfler:</strong><br />
32=0 65=A 97=a<br />
33=1 66=B 98=b<br />
34=2 67=C 99 =c<br />
35=3 68=D 122=z</p>
<p>gibi örnekler verebiliriz.Bunların dışında kalan karakterler ise değişik sembolleri ( ?,*,-,!,é,+) ve sesleri(Beep sesi mesela) ve ayrıca satır başı,boşluk karakteri gibi işlerin karşılığıdır.<br />
<strong><br />
BINARY (İKİLİ SAYI SİSTEMLERİ ):</strong></p>
<p>Arkadaşlar yazıya başlarken makinelerin aslında 1 ve 0 (sıfır) dan başka bir şeyi anlamadığını söylemiştik.Çünkü makineler devrelerinde akım geçer veya geçmez mantığını kullanır.Dolayısıyla 1 için “akım vardır”,0 içinse “akım yoktur” deriz.Veya 1 için Açık,0 için Kapalı diyebiliriz.İşte bu 1 ve 0 ların her birine bit ,bu bitlerin 8 tanesinin bir araya gelip oluşturdukları gruba da bayt diyoruz arkadaşlar.Görüldüğü gibi 1 ve 0 dan oluşan sadece 2 tane sayımız var ,işte bu nedenle bu sayılara da Binary (ikili sayılar) deniyor.CPU da yani mikro işlemcide birçok işlemlerini bu bitler üzerinde yapar.Bu kısa tarifleri yeterli bularak bunlarla yapılan işlemlere geçiyorum.<br />
Binary sayılar 0-255 arası değer alırlar.<br />
00000000=0 11111111=255 (Ascii değer de 255 değer alıyordu)</p>
<p>8 tane bit bir araya gelip 1 baytı oluşturuyor demiştik yukarıda ,eğer bunlar işaretli bir sayı olacak olsaydı o zamanda –(eksi) 127 ile + 128 arasında değer alacaklardı bi nevi ikiye bölünmüş olacaktı..2 Byte lık yani 16 bitlik(word) sayının alacağı değer normal de 65535 tir.Negatif bir sayı alması durumunda ise bir yarısı -32768 ile diğer yarısı +32767 arasında olur,bunların nasıl bu değerleri aldığını görelim.Lutfen burayı iyi takip edin çünkü sayı sistemlerin de Binary sayı mantığını anlamanız size çok büyük kolaylıklar sağlayacak.</p>
<p>1-) 1-1-1-1-1-1-1-1 daima hesaplamaya sağdan başlıyoruz aynen onluk düzende olduğu gibi;<br />
1*1 - 1*2 – 1*4 – 1*8 – 1*16 – 1*32 – 1*64 – 1*128<br />
2 ve 2 nin katları şeklinde hesaplıyoruz<br />
1+2+4+8+16+32+64+128 = 255<br />
Çarpım sonuçlarını sadeleştiriyor ve topluyoruz sonuç =255<br />
Not: Unutmadan söyleyeyim sağdaki ilk rakamı hep 1 ile çarparız daha sonra kullanılan sayı sisteminin katları ile çarparız.Bu Onluk düzende de,Onaltılık düzende de aynıdır,değişmez.Mesela Onluk düzen hep şu şekilde gider 1-10-100-1000- 10000 gibi 10 sayısının katları şeklinde ilerler.İkilik düzende de aynıdır yani; 1-2-4-8-16-32 gibi 2 ve 2 ‘nin katları şeklinde gider.</p>
<p>2-) Peki şöyle bir şey olsaydı 00101100 yine aynı işleme tabi tutardık elbette , evet yapalım ;<br />
Dikkat sayının sağından başlıyorum<br />
0*1- 0*2 - 1*4 -1*8 - 0*16 - 1*32<br />
diğer sıfırları çarpmaya gerek yok çünkü sonuç sıfır olacaktır.<br />
0 + 0 + 4 + 8 + 0 +32 = 44<br />
sadeleştirip topladık sonuç = 44.<br />
Anlaşılması açısından 0*1 ve 0*2 yi ekledim yoksa bunları katmadan çıkan sonuçları toplayıp sonucu bulabilirsiniz.</p>
<p><strong>Onluk Sayıyı Binary’e Çevirme :</strong><br />
Evet arkadaşlar bunuda hemen bir örnekle anlatmadan önce şunu hatırlatayım ,sayımız zaten 1 ve 0 dan oluşuyor onun için bu sayıyı 2 ye böleceğiz ve bunu bulmak çok kolay olacak Ayrıca bir hatırlatma eğer tam bölünme oluyorsa 0 ,kalanlı bölünüyorsa 1 olarak yazılır çünkü bir sayı 2 ye ya tam bölünür yada kalanlı bölünür.Yukarıdaki sayımızın Binary karşılığını bulalım yani 44 sayının.<br />
44 / 2 0<br />
22 / 2 0<br />
11 / 2 1<br />
5 / 2 1<br />
2 / 2 0<br />
1 / 1 1 Kalan 1 sayısı aynen alınır.<br />
Bu sayıyı ters çevirip aldığımızda 101100 böyle bir sayı çıkar.Bunu yukarıda göstermiş olduğum şekilde hesaplarsanız sağlamasını da yapmış olacaksınız.Başka bir örnek;<br />
23 /2 1<br />
11 /2 1<br />
5 /2 1<br />
2 /2 0<br />
1 /1 1 Kalan 1 sayısı aynen alıyoruz çünkü 2 ye bölemeyiz.<br />
Bu sayıyı ters çevirip aldığımızda 10111 böyle bir sayı çıkar ki bunu da 1+2+4+0+16= 23 bu şekil de topladığınız zaman sonucun 23 olduğunu göreceksiniz.</p>
<p><strong>ONLUK SAYILAR (DECIMAL) :</strong></p>
<p>Bu sayı sistemini aslında hepimiz biliyoruz arkadaşlar.Gündelik yaşantımızda ,okulda, işte kısaca her yerde kullandığımız sayı düzeni.Ama ikili sayı sisteminin anlaşılması açısından kısaca bu sayı sistemine değinerek geçeceğim.Bu sayılarda kendi arasında 10 ve 10’un katları şeklin de ilerler.<br />
8452 sayısını ele alalım bu sayıda ne var?Aslında hiçbir şey yok normal bir sayı zatenJAnaliz edelim hemen ;<br />
Sağdan başlıyoruz -à 2 tane 1 var,5 tane 10 ,4 tane 100 ,8 tane 1000 var.Dikkat ettiniz mi; 1-10-100-ve 1000 diye gittik.Yani 2*1 + 5*10 + 4*100 + 8*1000 =8452 umarım ikilik sayı düzeni bu örnekle daha iyi anlaşılır.</p>
<p><strong>ONALTILIK SAYILAR ( HEXDECİMAL ):</strong></p>
<p>Bunu aşağıdaki gibi örnekle açıklayalım bir .exe dosyasına baktığımız zaman A harfinin karşılığını 65 değerinde değil de, 41 değerinde görürüz.Halbuki A ‘nın Ascii kod karşılığı 65 di.Peki bu neden böyle oluyor?</p>
<p>Bunun nedeni arkadaşlar bilgisayarın ilk çıktığı dönemlerde programcılar Binary kodlarla (ikili sayılar) çalışmak zorundaydılar.Çünkü bilgisayar bu dilden başka bir dil anlamıyordu.Düşünün bir kere 11001010 gibi bir sayı sistemi ile ne şekilde çalışabilir ve hatasız bir kod nasıl çıkarabilirsiniz.İşte bu durum da program uzmanları ortaya bir buluş atmışlar . 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ı 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ı.Bu durumda programcılar bir nebze olsun daha rahat çalışsın diye bu sayı sistemini geliştirmiş ve adına Yunan sözcüğü olan “hex” (6 için) ile bir Latin sözcüğü olan “decem” (10 için) birleşimiyle oluşan “hexdecimal – (hexdesimal)” ismiyle isimlendirmişler. Bu sayede taban 16 sistemine “hexadesimal” (onaltılı) sayı sistemi dendi.<br />
Böylece 1 ve 0 dünyasından kendilerini kurtarmış oldular .Dikkat edin kendilerini kurtarmışlar bilgisayarı değil.Dedik ya makineler sadece 1 ve 0 ‘ı anlar diye.<br />
İşte yukarıdaki resimde gördüğünüz 41 sayısıda “A” harfinin 16 lık sayı sistemindeki karşılığıdır.Böylece kodlar 2 sıralı halde ve düzgün bir görünüme kavuşuyor.<br />
ASSEMBLY ise Binary sayılarla olsun,Hexdecimal sayılar olsun bunların tümünün ,CPU yu görevlendirmek için oluşturdukları sayısal komutların sembolik karşılığıdır diyebiliriz.Çünkü her ne komut verirseniz verin bunların tamamı CPU ya bir sayısal değer olarak (1,0)gidecektir.<br />
Onaltılık sayı tablosu</p>
<blockquote><p>Hexadesimal</p>
<p>Rakam</p>
<p>Binary</p>
<p>Değeri</p>
<p>Ondalık</p>
<p>Değeri</p>
<p>Hexadesimal</p>
<p>Rakam</p>
<p>Binary</p>
<p>Değeri</p>
<p>Ondalık</p>
<p>Değeri</p>
<p>0</p>
<p>0000</p>
<p>0</p>
<p>8</p>
<p>1000</p>
<p>8</p>
<p>1</p>
<p>0001</p>
<p>1</p>
<p>9</p>
<p>1001</p>
<p>9</p>
<p>2</p>
<p>0010</p>
<p>2</p>
<p>A</p>
<p>1010</p>
<p>10</p>
<p>3</p>
<p>0011</p>
<p>3</p>
<p>B</p>
<p>1011</p>
<p>11</p>
<p>4</p>
<p>0100</p>
<p>4</p>
<p>C</p>
<p>1100</p>
<p>12</p>
<p>5</p>
<p>0101</p>
<p>5</p>
<p>D</p>
<p>1101</p>
<p>13</p>
<p>6</p>
<p>0110</p>
<p>6</p>
<p>E</p>
<p>1110</p>
<p>14</p>
<p>7</p>
<p>0111</p>
<p>7</p>
<p>F</p>
<p>1111</p>
<p>15</p></blockquote>
<p>Tabloda gördüğünüz gibi 1,2,3,4,5,6,7,8,9 ‘dan sonra A,B,C,D,E,F,10,11,12 diye devam ediyor.Onluk düzende bildiğimiz sayılarla hemen hemen aynı sadece araya 6 tane harf girmiş. Burada görüldüğü gibi onaltılık sistem her 16 sayı sonrası basamak atlatıyor. Ayrıca a,b,c,d,e,f olmak üzere 6 tane daha fazladan sayıya sahip. O zaman onaltılık bir sistemde değer 10 ise onluk sistemde o sayı 16 demektir. Yani 16 nın katları olarak artmaktadır.Kafanız karışmasın hemen bir örnekle gösterelim.</p>
<p>0Fh = 15<br />
10h = 16<br />
20h = 32<br />
30h = 48<br />
F4h = 244<br />
Açıkladığım gibi bu sayılarda 16 ve 16’nın katları şeklinde ilerliyor ,tıpkı Onluk düzende 10 ve 10 ‘un katları şeklinde ilerlediği gibi.Yukarıdaki örnekte dikkatinizi çektiyse ,soldaki rakamların sonunda küçük “h” harfi var.Bunu hesaplamalarda dikkate almayın sadece o sayının Hexdecimal bir sayı olduğunu gösteriri ki CPU bu sayıyı onluk düzendeki bir sayı gibi algılamasın.Normalde bundan sonra bu “h” harfini kullanacağımız için bu ne demek oluyor diye takılmayın. Assembler programlarında kullanılan sayılar şu şekillerde simgelenerek birbirinden ayrılırlar:</p>
<blockquote><p>1010b sonundaki “b” harfi Binary sayı olduğunu;<br />
2359d sonundaki “d” harfi Decimal yani onluk bir sayı oldugunu<br />
4FA1h sonundaki “h” harfi HexDecimal yani Onaltılık bir sayı olduğunu gösterir.</p></blockquote>
<p>- &#8216;d&#8217; harfi yada harfsiz bu bildiğimiz onluk sistemde demektir. Eğer bir kaynak kodunda sayının yanında (önceden bütün sayıların hex olacağını belirten .radix16 gibi bir komut kullanılmamışsa) hiçbir simge yoksa o sayı göründüğü değerinde bildiğimiz onluk tabanda bir sayıdır. Ama eğer onaltılık kurallarıyla yazılmış (a,b,c,d,e,f içerikli) ve yanında hiçbir işaret yoksa derleyici burada &#8216;illegal number&#8217; şeklinde bir hata mesajı verir.<br />
Şimdiye kadar görmüş olduğumuz sayı sistemlerini kısaca hatırlayalım;</p>
<blockquote><p>1-Binary (ikilik) Sayı sistemleri<br />
2-Onluk (Decimal)Sayı sistemleri ve<br />
3-Onaltılık (Hexdecimal) Sayı sistemleri.</p></blockquote>
<p>Öncelikle şunu belirtmem gerekiyor arkadaşlar ; onluk zaten biliyoruz ama onaltılık ve ikilik sistem mutlaka bilinmesi gerekiyor. Programlarınızda, denemelerinizde hep bu sistemler kullanılacak. Komutlar hep bu sistemlere göre çalışacak ve bazıları sadece bu sistemlerdeki değerlere göre hareket edecek. Bunun için bir assembler programcısının mutlaka bu sistemleri bilmesi ve kullanması gerekiyor.Aşağıdaki konuyla bu konuları daha iyi bir şekilde pekiştirip bitireceğiz…</p>
<p><strong>Onaltılık Sayıyı Onluk Sayıya Çevirme :</strong></p>
<p>Arkadaşlar Onaltılık (Hexdecimal) bir sayıyı ,Onluk (Decimal ) bir sayıya 2 şekilde çevirebiliriz.<br />
1.olarak aşağıda anlattığım şekilde çevirebilirsiniz.<br />
2.olarak da bununla kim uğraşır diyerek, Windows ’un hesap makinesini kullanıp çevirebilirsiniz J<br />
Ben yine de 1. olarak bahsettiğim şekliyle açıklayayım..Arkadaşlar yukarılarda ikili ve onlu sayı sistemlerini anlatırken birinci basamak her zaman kendi değerindedir demiştik.Burda da aynı kural geçerli yani sayı 0ah,0bh,0ch.. olsa bile onluk sisteme çevirilince birlik basamak olarak diğerlerine eklenir. Diğer basamaklarda aynı bildiğimiz matematik kurallarında olduğu gibi basamak çarpanı esas alınarak çarpılır. Nasıl ki 8452 sayısının 8*1000+4*100+5*10+2*1 olduğunu biliyorsak onaltılık sistemde de bu kuralın böyle olduğunu biliriz.Kısa bir örnekle acıklayalım;<br />
FA5h sayısını ele alalım ve analiz edelim.Burda ilk önce 5 sayısını 1 le ,A’nın (Onaltılık sistemde) sahip olduğu değeri 16 ile , F’nin (Onaltılık sistemde) sahip olduğu değeri de 16 ‘nın bir sonraki katı ile yani 256 ile çarpacağız.Devam edelim,<br />
Sağdan başlayarak yapıyorum yine ;<br />
5*1 + A*16 + F*256 şimdi A ile F nin yerlerine Hexdecimal değerleri koyalım<br />
5*1 + 10*16 + 15*256<br />
Yukarıda ki tabloda A’nın hex karşılığını 10 , F nin hexdec.karşılığını ise 15 olarak göstermiştik.Sonuçları toplayalım o zaman ,<br />
5 +160 + 3840 = 4005 olarak sonucu bulmuş oluruz.Biraz zor gibi görünebilir ama ben mümkün olduğu kadar sadeleştirip anlattım.Zaten 1 veya 2 deneme yaparsanız mantığı kavrarsınız arkadaşlar.Aşağıdaki katlara bakınca daha iyi anlayacağınızı ümit ediyorum….<br />
Onluk Sistem : Onaltılık Sistem :</p>
<blockquote><p>1 1<br />
10 16<br />
100 256<br />
1000 4096<br />
10000 65535</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://assembly.hepsiproje.org/?feed=rss2&amp;p=14</wfw:commentRss>
		</item>
	</channel>
</rss>
