C18'DE ASM

Başlatan HEXF2, 14 Ağustos 2007, 18:02:13

HEXF2

Normalde C18 içinde _asm _endasm ile ASM rutinleri kodlayabiliyoruz.Fakat ben şöyle bir istiyorum.Mesela C18'in delays.h dosyasında sadece fonksiyon prototipleri var.Bu fonksiyonlardan birini çağırdığımızda hop gidip asm uzantılı bir dosyadan kodları çalıştırıyor.Bende ASM rutinlerimi bir ASM dosyasında yazıp bunlar için bir HEADER hazırlayıp programlarıma bu HEADER'ı ekleyip fonksyionları burdan çağırmak istiyorum.Bunu nasıl yapabilirim.Biryerlerden Object dosyası filan bişeyler duydum ama anlamadım...

arslan74

Merhaba,

C derleyici asıl amacı c kodlarını derlemektir. derlemeden kastım C kodlarını makina kodlarına ceviriyor.

"delay.h" header dosayasıdır. bunula ilişki mutlaka bir "C" yada "obj" dosaysı vardir.

"Obj" dosyası "C" kodun derlemiş halidir. Obj dosyası derleyicinin anlacağı bir dosya bicimidir. Bizim yazdığımız C dosyasını, önce kendi anlayacağı Obj dosyasına dönüştürür. Sonra bu obj dosyalarını linkler programı birleşirerek HEX kodu üretir.

Selamlar

HEXF2

Hocam bu yazdıklarını, yani en azından C18 ile uğraşıyorsam, bir C derleyicisinin C kodu ürettiğini biliyorum  :? Aynı zamanda delays'ında bir header dosyası olduğunu biliyorum.Yaklaşık 7-8 senedir C'de kod yazıyorum.
İlgilendiğin için çok sağol ama sorduğum soruyu bir daha okur musun?Çok alakalı bulamadım verdiğin cevabı.Ben kritik işlemleri ASM ile yapmak ve bunu da yularıda belirttiğim şekilde yapmak istiyorum.

Dün şöyle birşey tespit ettim umarım yalnış değildir.Şimdi C18'de kod derlerken linker dosyasını ekliyoruz.Bu linker dosyası farklı dosyalara dağılmış fonksiyon,değişken adreslerini çözümlüyor falan filan.Yalnız başında

FILES c018i_e.o
FILES clib_e.lib
FILES p18f1230_e.lib

gibi bir tanımlama var.Microchip kendi hazırladığı kütüphaneler için lib uzantılı library dosyası hazırlamış.Bu dosyada ise (sanırım)örneğin delays.h dosyasında bulunan fonksiyon prototiplerinin falanfilan.asm dosyasında tanımlı olduğunu söylemiş.Derleyici derleme işlemini yaparken bu fonksiyon ile karşılaştığında lib'e de bakıyor heralde ??? Ben böyle birşey yapamazmıyım.Bir lib dosyası nasıl hazırlarım??

Böyle birşey bence çok güzel.Çok az poliformizm gibi oluyor  :D
Bir tek arayüz(Header dosyasındaki fonksiyon prototipleri)birden çok yöntem.

HEXF2

sanırım nasıl yapılacağını buldum aynen dediğim gibi yukarda.Bir proje oluşturup bu projede gerekli C ve H dosyalarını tanımladıktan sonra Project/Build Option/MPASM/C17/C18/Suite tabından derlemeyi lib olarak tanımlıyoruz.Sonra oluşan lib dosyasını Lib klasörüne :) Şimdi bunu ASM dosyaları içinde yaparsam süper olacak..

Ziya

mp3dragon hocamın C18 ile yazdığı mp3 player projesinde aradığın örnekleri bulacaksın. Assembly ile yazılmış alt programların C18'den nasıl çağırıldığını görebilirsin.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

arslan74

Merhaba,

Alıntı YapHocam bu yazdıklarını, yani en azından C18 ile uğraşıyorsam, bir C derleyicisinin C kodu ürettiğini biliyorum  Aynı zamanda delays'ında bir header dosyası olduğunu biliyorum.Yaklaşık 7-8 senedir C'de kod yazıyorum.
İlgilendiğin için çok sağol ama sorduğum soruyu bir daha okur musun?Çok alakalı bulamadım verdiğin cevabı.Ben kritik işlemleri ASM ile yapmak ve bunu da yularıda belirttiğim şekilde yapmak istiyorum.

Sayın HEXF2, Sizin C bilginiz ne düzeyde olduğunu bilmiyorum. Ancak yazdıklarına bakılırsa, sende C'nin temel taşaları tam oturmamış. Yanlız, "for" ve "if" komutundan program yaziyorsun. Aslında C'nin nasıl bir mantıkla çalıştını tam kavramamış durumdasın.

Eğer sen değişik cevrebirimler için C ile ayrı kütüphane hazırlayabiliyorsan, zaten aynı şekilde ASM komutlarından ibaret de bir kütüphane hazırlayabilirsin.

Alıntı YapFakat ben şöyle bir istiyorum.Mesela C18'in delays.h dosyasında sadece fonksiyon prototipleri var.Bu fonksiyonlardan birini çağırdığımızda hop gidip asm uzantılı bir dosyadan kodları çalıştırıyor.

Şimdi senin gözden kacırdığın şey şu sanırım. delays.h C'de bir bildirim bicimi vardır.

Eğer
#include <delays.h>


ise o zaman bununla ilişki diğer dosyalar (C yada Obj ) derleyicinin önceden tanımlı olduğu kütüphane klasörde olduğu anlamında dır.

Eğer
#include "delays.h"


Biçimde tanıtılmış ise o zaman bununla ilgili C yada Obj dosyasını kendin eklemen gerek.

Eğer sen böyle kütüphaneler yapış isen ve derleyicine yanlız, header dosyasını eklemek istiyorsan o zaman bu durumda iki şey yapabilirsin.
Birincisi kütüphanenin derleyicin sahib olduğu kendi kütüphane klasörüne atabilirsin. Bu durumda yeri önceden tanımı olduğu için aramayacak. Ancak bu işlem tavsiye edilmeyen bir yöndemdir. Derleyicinin kendi kütüphanesine mühadale ediyoruz.

Yada bu kütüphanelerin olduğu klasörü derleyicine tanıtman gerek. Derleyicinin ayarla bölümünde öyle bir ayar olması lazım.
Kütüphanenin derlenmemiş C dosyasından ibaret olması yada derlenmiş, Obj dosyası olması senin secimin. Eğer kütüphanenin kaynak kodlarını kimseye göstermek istemiyorsan Obj dosyası şeklinde kullanırsın, hatta bu şekilde bir kütüphaneni bir başkasına bile versen. Sadece senin fonksiyonları kullanabilecek. Senin kaynak kodlarını bilmeyecek vede mühale edemeyecek.

Selamlar

HEXF2

Yıllardır C, C# ile projeler geliştiriyorum ve C dilini iyi derecede biliyorum arslan74.Ayrıca C dili hakkında ne kadar şey bildiğimi bilmediğinizi söylediğiniz halde benim sadece if else kullanarak program yazdığımı belirtmenizi ve yazdığım soruyu anlamadan yorum yapmanızı sizin kıtlığınıza veriyorum.Yıllardır program yazan bir insana if else'den başka birşey bilmiyormuşsun demek ve bunu o adamın ne bilip bilmediğini bilmeden söylemek bana hakaret gibi geliyor.

Sorunumu çözdüm.Fakat bu kadar polimik yaşanmasının sebebi sanırım benim sorumu anlayış seviyesi yüksek insanlara göre yazmam.Nitekim Ziya arkadaşım ne demek istediğimi çok iyi anlamış ve incelemesemde C18 derleyicisi ile yazılmış bir proje dosyasını incelememi istemiş.Teşekkürler Ziya.

Şimdi her ne kadar sorunumu çözsemde sorumu sizin anlayabileceğiniz seviyede yazayım.

Ben ASM ile kodladığım asm uzantılı dosyalarımı MPLAB editöründe ve C18 derleyicisi ile hangi ayarları yaparak bir Library dosyamı oluşturur ve yine oluşturduğum header içinden nasıl çağırırım.

Bunu gerekli asm uzantılı dosyamı ve header dosyamı ekledikten sonra Project/Buil Options/Project/MPASMC18C17Suite tabından Build Library target radiobutonunu seçerek yapabiliyor muşum.Aynı zamanda C18 lib dosyalarını lib klasöründe her işlemci için ayrı ayrı tanımlamış.Bende proje dizinimde yani lib'in oluştuğu dizine PIC18f8720.lib dosyasını kopyaladım.Ardından bir bat yazdım ve bunun içinde mplib.exe'yi,
for %%i in (*.o) do mplib /r .\p18f8720.lib %%i ifadesi ile çalıştırdım.Böylece p18f8720.lib, oluşturduğum lib'in output dosyası ile tekrar derlendi.Sonra bunu ister projenizde kullanın local olarak isterseniz yine global alana yani lib klasörüne koyun.Local olarak kullanırsanız pejenizin Library section'ına bu lib'i eklemeniz gerek.

Ben bu yaptıklarımı yaklaşık bir saat kendi başıma uğraştımda buldum.Yani ben o anlattıklarınızın hepsini biliyorum arkadaşım.Sadece MPLAB da nasıl yaparım demek istedim.Ama kesşe sormasaydım yada keşke sen o engin bilgilerinle( :lol: ) beni boğmaya çalışmasaydın.Neyse yineden herşey için sağolun.Kendime geldim.Bundan sonra sorularımı her kesime göre yazarım.

HEXF2

Bu arada C dilini çok iyi bilen aslan74 arakadaşım.Ben kaynak kodlarımı dediğin gibi saklamak için sadece başkalarının HEADER'dan çağırmasını istediğim için Library dosyası oluşturmak istedim.Aynı Win32'deki API mantığı gibi.Sizin dediğiniz gibi Obj kullanmam çünkü Library kodu kullanmadığınız sürece programınıza eklenmez.Fakat Obj dosyası programın bir parçası haline gelir ve programı şişirir.İşte Obj ve Library birbirlerine benzeselerde aralarındaki önemli fark budur.

arslan74

Merhaba Sayın HEXF2,

Beni aydınlatığınız için size teşekür ederim. Şimdi benim size bir kaç sorum olacak. Asm kodlarını kullanmakta ki asıl amaç, programın daha hızlı çalışması için mi, daha az yer tutması mı yoksa, yoksa kodunu gizlemek için mi ?

Benim burada anlamadığı ufak bir nokta var, oda şu;
Alıntı YapAynı Win32'deki API mantığı gibi.Sizin dediğiniz gibi Obj kullanmam çünkü Library kodu kullanmadığınız sürece programınıza eklenmez.Fakat Obj dosyası programın bir parçası haline gelir ve programı şişirir.İşte Obj ve Library birbirlerine benzeselerde aralarındaki önemli fark budur.

Bunun mantığı nasıl oluyor?

Şimdi ben kodumu ASM olarak yazdıp bunu programda tanıtığımda. ASM kodunumu içinde bir cok fonksiyon olmasına rağmen kullandığım fonksiyonları programa ekleyecek, kullanmadıklarımıda ana kodun içine eklemeyecek, ama C kodu olduğu zaman bütün fonksiyonlar kullanılmasada hepsi koda dahil edilir, şeklinde bir söz anliyorum. Eğer öyleyse bu bana cok saçma geldi. Çünkü ben ASM bir sürü program yazdım ve ASM derleyicisinde öyle bir özellik görmedim. Eğer bu özellik C derleyicisinden geliyor ise, o zamanda bunun illa ASM kodu olması gerekmiyor, aynı şekilde bunu C koduylada yapılabilmesi lazım. Olayın tam olarak hangi mantığa dayanarak gercekleşiğini yazarsan beni daha iyi aydınlaşmış olursun.

Sonuçta burası kimin C bilgisi kimden yüsek olduğu bir yarşıma sitesi değil. Bilmediğiz, eksik kaldığımız konuları bilen bir birisinden cabuk ve doğru şekilde öğrenmek için bu foruma üyeyiz.


Önemsiz Not:
Kaç sene program yazarsan yaz, bir konuda bilmediğin yada bir konuyu senden daha iyi bilen mutlaka cıkar. Bu hepimiz için geçerlidir. Ben kendi şahsım adına senden benim öğreneceğim bircok bilgi olduğuna inaniyorum, ama aynı şekilde de benim senin bilmediğin birçok bilgiyi bildiğimi saniyorum, herkez her alanda branşlaşamaz.
Bizim sahib olduğumuz bilgi birikimiz, bir başkasının bizi kücük görmesiyle ne azalır nede bir başkasının yüceltmesiyle artar. Neysek oyuz. Öyle olmuyor ise bu bizim kişiliğimiz daha olgun olmamış olduğu anlamına gelir.
Bu tepki durumu genelde gençliğin verdiği delikandan gelir. Zaman gectikce insan kendini daha iyi tanımaya başlar sahib olduğu delikan biraz daha akıllanıb, oldunlaşmaya başlar. :)

Ziya

CCS'de çoklu compilation unit kullanmadığım için obje dosyaları link edilirken nasıl oluyor tam bilmiyorum. Tek compilation unit kullanırsanız istediğiniz kadar alt program yazın, bu alt programlar çağırılmadığı sürece link edilip hex dosyasına atılmazlar. Emin olmak için anlattığımı denedim.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

arslan74

Alıntı Yap
CCS'de çoklu compilation unit kullanmadığım için obje dosyaları link edilirken nasıl oluyor tam bilmiyorum. Tek compilation unit kullanırsanız istediğiniz kadar alt program yazın, bu alt programlar çağırılmadığı sürece link edilip hex dosyasına atılmazlar. Emin olmak için anlattığımı denedim.

Yani demek istediğin şumu: Her fonksiyonu ayrı bir dosya olarak yazarsak. O zaman derleyici çağırdığı fonksiyonun kodlarını programa ekliyor. Ama tüm fonksiyonlar tek bir dosyada toplanmış ise o zaman içinden herhangi bir fonksiyonu çağırdığımızda diğer fonksiyonlarda eklemiş oluyor.

Eğer o şekilde ise o zaman bu olay mantıklı ve anlaşılır geliyor. Bunun tam ayrıntısı nasıl oluyor? Bende Hi-tech de bir inceleyeyim, Bakalım becerebilecekmiyim.

Selamlar

Ziya

Alıntı yapılan: "arslan74"Yani demek istediğin şumu: Her fonksiyonu ayrı bir dosya olarak yazarsak. O zaman derleyici çağırdığı fonksiyonun kodlarını programa ekliyor. Ama tüm fonksiyonlar tek bir dosyada toplanmış ise o zaman içinden herhangi bir fonksiyonu çağırdığımızda diğer fonksiyonlarda eklemiş oluyor.
Hayır bu değil. Bütün fonksiyonlar tek bir dosyada da toplansa sadece çağırılanlar hex dosyasına eklenir, çağırılmayanlar eklenmez.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

HEXF2

aslan74 size biraz sert çıkışmışım kusura bakmayın.

Alıntı Yap
Benim burada anlamadığı ufak bir nokta var, oda şu;
Alıntı:
Aynı Win32'deki API mantığı gibi.Sizin dediğiniz gibi Obj kullanmam çünkü Library kodu kullanmadığınız sürece programınıza eklenmez.Fakat Obj dosyası programın bir parçası haline gelir ve programı şişirir.İşte Obj ve Library birbirlerine benzeselerde aralarındaki önemli fark budur.


Bunun mantığı nasıl oluyor?

Dostum oradaki "Aynı win32'deki gibi" kelimesi birönceki cümlenin devamı onu yukarıdaki yazıya karıştırma.Ama onuda şöyle ifade edeyim.
Win32'deki API gibi dememin sebebi şu.windows.h dosyasını incele.Bu dosyada sistem düzeyinde işlem yapacak birçok API mevcut.Peki bunların kodları nerde.İşte daha önceden C sentaksından derlenmiş kütüphanelerde.Program yazarken bu header içinde yazan fonksiyonları kullandığımız zaman derleyici seninde önceden bahsettiğin gibi <> alana gider bakar kodu alır, senin programına ekler ve derler.Yani biz o header dosyasını programımıza eklesek bile kullanmadığımız sürece kodlar eklenmez.Kullnırsak demin de dediğim gibi sadece kullandığımız fonksyion kodları programa eklenir.Ama bu dediğim kodlar kütüphane olarak derlendiyse.Nesne dosyası olrak derlenmiş ise biz header dosyasındaki kodu kullansak ta kullanmasakta o kod programa eklenir ve derlenir.Buda programı şişirir.
Kodları Win32'deki API mantığına benzetmemin bir sebebi bu iken diğer sebebi de şu.API dosyalarının bazıları jenerikdir.Örneğin WriteFile, ReadFile.Bu apilerden birini çağırdığınızda istek ilgili CIHAZ SÜRÜCÜSÜNE gönderilir.Yani fonksiyon aynıdır.Ama arkadaki kodlar cihaz'a göre değişir.Kendi cihazını tasarlamış bir kişi bu API'ler için sürücü yazar.Cihaz sisteme takıldığında ilgili sürücü belleğe yüklenir ve her sürücüsü yüklenmiş cihaza windows tarafından bir path verilir.İşte bu API'ler bu path bilgisine göre isteği gerekli sürücüye gönderir.API'ler bir arabirimdir. :D

Şimdi gelelim bana.Hocam sen ASM için takılıp kalma.Kod C'de olsa ASM'de olsa library olarak derlendiğinde header da tanımlı fonksiyon prototipleri üzerinden erişiriz bu kodlara.Daha sonra uygulamada köklü bir değişik yapmam gerekti diyelim.Ana programımda hiç bir değişiklik yapmadan kütüphanemi tekrardan derlerim ve ana uygulama dizinime yeni kütüphanemi eklerim.Ana kodlarım aynı header dosyasını kullanırken arkadaki kodlar değişir.

Misal bir header dosyamda LigthLed() diye bir fonksiyon prototipi var.Ben bunu ana programımda kullandığım zaman PIC'in porta'daki tüm ledleri yakıyor, 5 saniye bekliyor, ardından flash yapıyor.
Ben ilerde 5 saniye bekleme ve flash yapma işlemini kaldırmak istediğimde librarydeki kodlarımdan bu bölümü değiştirir tekrar derler uygulama dizinime eklerim.Ana uygulamada kod değişmez.O yine LightLed()dir ama işlem değişir.

Yani ASM kodlarını benim sadece önemli rutimlerim olduğu için library yapmak istedim.Bu C kodlarıda olabilirdi.Ben 18f8720 ile yapacağım bir uygulamada tüm kodlar 2MB'lık harici bir kalıcı Ram'dan çalıştırılacak.Bir kaç kişi ise bu devreye kod geliştiricek.Ama sadece benim verdiğim HEADER ve kütüphane dosyalarını kullanarak.Yani PWM'mi kullanmak istiyor benim header'da tanımlı fonksiyonları kullanacaklar.Sadece bir arayüz.Arka planı ben yazdım.....

Bu arada tabii ki insanların öğreneceği şey bitmez ben kimseyi aşağılamıyorum.Bana bu tüm bildiklerimi öğreten bu sıralar benim tavsiyemle bu sitede takılmaya başlayan "Jabba"'dır.Hem dostum hem hocam.Aynı zamanda son bahsettiğim projeninde mantığını o gösterdi.Library ve header hazırla dedi.Kendim bulayım nasıl yapıldığını şu MPLAB derleyicisinde dedim sizle kavga ettim..... :D

HEXF2

aslan74 size biraz sert çıkışmışım kusura bakmayın.

Alıntı Yap
Benim burada anlamadığı ufak bir nokta var, oda şu;
Alıntı:
Aynı Win32'deki API mantığı gibi.Sizin dediğiniz gibi Obj kullanmam çünkü Library kodu kullanmadığınız sürece programınıza eklenmez.Fakat Obj dosyası programın bir parçası haline gelir ve programı şişirir.İşte Obj ve Library birbirlerine benzeselerde aralarındaki önemli fark budur.


Bunun mantığı nasıl oluyor?

Dostum oradaki "Aynı win32'deki gibi" kelimesi birönceki cümlenin devamı onu yukarıdaki yazıya karıştırma.Ama onuda şöyle ifade edeyim.
Win32'deki API gibi dememin sebebi şu.windows.h dosyasını incele.Bu dosyada sistem düzeyinde işlem yapacak birçok API mevcut.Peki bunların kodları nerde.İşte daha önceden C sentaksından derlenmiş kütüphanelerde.Program yazarken bu header içinde yazan fonksiyonları kullandığımız zaman derleyici seninde önceden bahsettiğin gibi <> alana gider bakar kodu alır, senin programına ekler ve derler.Yani biz o header dosyasını programımıza eklesek bile kullanmadığımız sürece kodlar eklenmez.Kullnırsak demin de dediğim gibi sadece kullandığımız fonksyion kodları programa eklenir.Ama bu dediğim kodlar kütüphane olarak derlendiyse.Nesne dosyası olrak derlenmiş ise biz header dosyasındaki kodu kullansak ta kullanmasakta o kod programa eklenir ve derlenir.Buda programı şişirir.
Kodları Win32'deki API mantığına benzetmemin bir sebebi bu iken diğer sebebi de şu.API dosyalarının bazıları jenerikdir.Örneğin WriteFile, ReadFile.Bu apilerden birini çağırdığınızda istek ilgili CIHAZ SÜRÜCÜSÜNE gönderilir.Yani fonksiyon aynıdır.Ama arkadaki kodlar cihaz'a göre değişir.Kendi cihazını tasarlamış bir kişi bu API'ler için sürücü yazar.Cihaz sisteme takıldığında ilgili sürücü belleğe yüklenir ve her sürücüsü yüklenmiş cihaza windows tarafından bir path verilir.İşte bu API'ler bu path bilgisine göre isteği gerekli sürücüye gönderir.API'ler bir arabirimdir. :D

Şimdi gelelim bana.Hocam sen ASM için takılıp kalma.Kod C'de olsa ASM'de olsa library olarak derlendiğinde header da tanımlı fonksiyon prototipleri üzerinden erişiriz bu kodlara.Daha sonra uygulamada köklü bir değişik yapmam gerekti diyelim.Ana programımda hiç bir değişiklik yapmadan kütüphanemi tekrardan derlerim ve ana uygulama dizinime yeni kütüphanemi eklerim.Ana kodlarım aynı header dosyasını kullanırken arkadaki kodlar değişir.

Misal bir header dosyamda LigthLed() diye bir fonksiyon prototipi var.Ben bunu ana programımda kullandığım zaman PIC'in porta'daki tüm ledleri yakıyor, 5 saniye bekliyor, ardından flash yapıyor.
Ben ilerde 5 saniye bekleme ve flash yapma işlemini kaldırmak istediğimde librarydeki kodlarımdan bu bölümü değiştirir tekrar derler uygulama dizinime eklerim.Ana uygulamada kod değişmez.O yine LightLed()dir ama işlem değişir.

Yani ASM kodlarını benim sadece önemli rutimlerim olduğu için library yapmak istedim.Bu C kodlarıda olabilirdi.Ben 18f8720 ile yapacağım bir uygulamada tüm kodlar 2MB'lık harici bir kalıcı Ram'dan çalıştırılacak.Bir kaç kişi ise bu devreye kod geliştiricek.Ama sadece benim verdiğim HEADER ve kütüphane dosyalarını kullanarak.Yani PWM'mi kullanmak istiyor benim header'da tanımlı fonksiyonları kullanacaklar.Sadece bir arayüz.Arka planı ben yazdım.....

Bu arada tabii ki insanların öğreneceği şey bitmez ben kimseyi aşağılamıyorum.Bana bu tüm bildiklerimi öğreten bu sıralar benim tavsiyemle bu sitede takılmaya başlayan "Jabba"'dır.Hem dostum hem hocam.Aynı zamanda son bahsettiğim projeninde mantığını o gösterdi.Library ve header hazırla dedi.Kendim bulayım nasıl yapıldığını şu MPLAB derleyicisinde dedim sizle kavga ettim..... :D

HEXF2

aslan74 size biraz sert çıkışmışım kusura bakmayın.

Alıntı Yap
Benim burada anlamadığı ufak bir nokta var, oda şu;
Alıntı:
Aynı Win32'deki API mantığı gibi.Sizin dediğiniz gibi Obj kullanmam çünkü Library kodu kullanmadığınız sürece programınıza eklenmez.Fakat Obj dosyası programın bir parçası haline gelir ve programı şişirir.İşte Obj ve Library birbirlerine benzeselerde aralarındaki önemli fark budur.


Bunun mantığı nasıl oluyor?

Dostum oradaki "Aynı win32'deki gibi" kelimesi birönceki cümlenin devamı onu yukarıdaki yazıya karıştırma.Ama onuda şöyle ifade edeyim.
Win32'deki API gibi dememin sebebi şu.windows.h dosyasını incele.Bu dosyada sistem düzeyinde işlem yapacak birçok API mevcut.Peki bunların kodları nerde.İşte daha önceden C sentaksından derlenmiş kütüphanelerde.Program yazarken bu header içinde yazan fonksiyonları kullandığımız zaman derleyici seninde önceden bahsettiğin gibi <> alana gider bakar kodu alır, senin programına ekler ve derler.Yani biz o header dosyasını programımıza eklesek bile kullanmadığımız sürece kodlar eklenmez.Kullnırsak demin de dediğim gibi sadece kullandığımız fonksyion kodları programa eklenir.Ama bu dediğim kodlar kütüphane olarak derlendiyse.Nesne dosyası olrak derlenmiş ise biz header dosyasındaki kodu kullansak ta kullanmasakta o kod programa eklenir ve derlenir.Buda programı şişirir.
Kodları Win32'deki API mantığına benzetmemin bir sebebi bu iken diğer sebebi de şu.API dosyalarının bazıları jenerikdir.Örneğin WriteFile, ReadFile.Bu apilerden birini çağırdığınızda istek ilgili CIHAZ SÜRÜCÜSÜNE gönderilir.Yani fonksiyon aynıdır.Ama arkadaki kodlar cihaz'a göre değişir.Kendi cihazını tasarlamış bir kişi bu API'ler için sürücü yazar.Cihaz sisteme takıldığında ilgili sürücü belleğe yüklenir ve her sürücüsü yüklenmiş cihaza windows tarafından bir path verilir.İşte bu API'ler bu path bilgisine göre isteği gerekli sürücüye gönderir.API'ler bir arabirimdir. :D

Şimdi gelelim bana.Hocam sen ASM için takılıp kalma.Kod C'de olsa ASM'de olsa library olarak derlendiğinde header da tanımlı fonksiyon prototipleri üzerinden erişiriz bu kodlara.Daha sonra uygulamada köklü bir değişik yapmam gerekti diyelim.Ana programımda hiç bir değişiklik yapmadan kütüphanemi tekrardan derlerim ve ana uygulama dizinime yeni kütüphanemi eklerim.Ana kodlarım aynı header dosyasını kullanırken arkadaki kodlar değişir.

Misal bir header dosyamda LigthLed() diye bir fonksiyon prototipi var.Ben bunu ana programımda kullandığım zaman PIC'in porta'daki tüm ledleri yakıyor, 5 saniye bekliyor, ardından flash yapıyor.
Ben ilerde 5 saniye bekleme ve flash yapma işlemini kaldırmak istediğimde librarydeki kodlarımdan bu bölümü değiştirir tekrar derler uygulama dizinime eklerim.Ana uygulamada kod değişmez.O yine LightLed()dir ama işlem değişir.

Yani ASM kodlarını benim sadece önemli rutimlerim olduğu için library yapmak istedim.Bu C kodlarıda olabilirdi.Ben 18f8720 ile yapacağım bir uygulamada tüm kodlar 2MB'lık harici bir kalıcı Ram'dan çalıştırılacak.Bir kaç kişi ise bu devreye kod geliştiricek.Ama sadece benim verdiğim HEADER ve kütüphane dosyalarını kullanarak.Yani PWM'mi kullanmak istiyor benim header'da tanımlı fonksiyonları kullanacaklar.Sadece bir arayüz.Arka planı ben yazdım.....

Bu arada tabii ki insanların öğreneceği şey bitmez ben kimseyi aşağılamıyorum.Bana bu tüm bildiklerimi öğreten bu sıralar benim tavsiyemle bu sitede takılmaya başlayan "Jabba"'dır.Hem dostum hem hocam.Aynı zamanda son bahsettiğim projeninde mantığını o gösterdi.Library ve header hazırla dedi.Kendim bulayım nasıl yapıldığını şu MPLAB derleyicisinde dedim sizle kavga ettim..... :D