Benim işlemcim seninkini, benim C senin ASM yi döver.

Başlatan z, 13 Kasım 2009, 16:01:07

z

Yazacaklarım beni bağlar, yazdıklarım kendi birikim, deneyim ve düşüncelerimin bir sonucudur.

Başlıktaki gibi tartışmaları hemen hemen her forumda görmüşsünüzdür.

Evet bir işlemci diğerini döver. Bu çok normal çünkü Ferrari Murat 124 ü geçer.

500 Beygir gücündeki bir araç 60 Beygirlik bir diğer aracı her zaman geçemez. Bu da çok normal. Mesela Greyder Murat 124 u gecemez.

Peki 4 tonluk bir remorku 100 metre öteye Greyder mi yoksa Murat 124 mü en kısa zamanda taşır?

8Mhz lik 8086, 20Mhz lik PIC'i döver. Ama 8086 yı bu PIC'e dövdürtecekseniz bunu basit bir program testinde başarabilirsiniz.

Bu programa konu soru, bir pinden kim daha yüksek frekansda kare dalga çıkartacak  sorusudur.

Eğer bu iki yarışmacıya  kim daha hızlı sinus verileri hesaplayıp her bir hesap ardından bir pinin konumunu tersine çevirecek denirse dengeler derhal 8086 tarafına kayar.

Bir işlemcinin (denetleyicinin) gücünü (yeteneklerini) ne belirler?

CPU Clk ?
Bit uzunluğu?
Komut seti?
Kesmelere yanıt verme hızı?
Çevre birimlerinin çeşitliliği?
Güç tüketimi?
Bozucu etkilere dayanıklılık?

60Mhz ARM7 sülalesimi, 40Mhz TI DSP mi, 100Mhz 8051 mi, 8Mhz 8086 mı 80Mhz Propeller mi daha güçlüdür?

32Khz, 4 Bitlik bir işlemci yukarıdaki işlemcilerin hepsinin önüne geçip ezici bir pazar payı edinebilirmi?

Devam edecek....
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hasangurlek

Assembly hepsinin ağababasıdır ve böyle devam edecektir. Windowsun arka planında çalışan kodların çoğu assembly ile yazılmıştır. C ile bile bir seri portu, bir USB hubını bir disk sürücüyü kullanamazsınız. Ancak işletim sisteminin assembly ile yazılmış alt seviye fonksiyonlarını çağırır kullanırsınız. Bu  böyle olmasaydı ileri seviye dillerin derleyicileri asm kullanımına izin vermezdi. Binlerce dolara program satacaksın, sonra ücretsiz kullanılabilen bir dile destek vereceksin. Bu ne perhiz, bu ne lahana turşusu ? diye bir laf var. Demekki bazı durumlarda hala bu derleyiciler bir noktada tıkanıyor ve geliştiriciler yani para kazanma amacı güden ticari firmalar asm desteği vermek zorunda kalıyor.

Ben yaptım ! diyebileceğiniz bir GLCD li termometre, saat devresini istediğiniz dilde bir kaç günde yazar, havanızı atarsınız. Ama iş otomobillerdeki, iş makinalarındaki gibi kontrol kartlarında olduğu gibi donanım hakimiyeti ve hız gerektiren uygulamalara geldiğinde işler tıkanmaya başlar. Örneğin bir ABS fren kontrol kartı, elektronik ateşleme kontrolü, çekiş kontrol kartı, bir hidrolik basınç kartı. Siz C derleyicisinde ürettiğiniz kodlar içinde ADC ile uğraşırken veya FFT döngüsünde dolaşırken birkaç milisaniye içinde valfin poziyonunu değiştirmeye geç kalındığı için bir iş makinası pistonu hurdaya çıkartabilir. 6 silindir bir motor 8000 devirde enjeksiyonlardaki benzini ve ateşlemeyi keserek motoru korur. Dakikada 8000 devir ise 48.000 ateşleme demek. Her ateşleme arası ise 1250us. Bu süre içinde devri ölçeceksiniz, bir önceki aşamada emme manifoltuna verdiğiniz benzinin ve hava emiş valfinin açıklığına göre sağladığınız karışımın yanma sonrası eksoz manifoltundaki oksijen sensöründen değerini ölçüp karışım zenginmiydi fakirmiydi bakacaksınız ve herşeyden emin bir durumda karar verip 6 enjeksiyondaki benzin miktarını PWM ile, hava miktarını step motor ile yeni değerlere göre ayarlayıp ateşlemeye devam edeceksiniz yada benzini ve ateşlemeyi kesip, havayı tam açıp motoru koruyacaksınız. Ve bunların hepsini 1250 mikrosaniyelik bir zaman içinde yapacaksınız. 4.000 devirde ise bu süre 2500 us. Elektronik turboyu, intercoll ü, kompresör ü vs. daha işin içine katmadım.

Yaptığınız işe göre MCU, yaptığınız işe göre programlama dili. Tabi C, VB vs. ile kullanılabilecek bir sürü hazır DLL, SYS dosyaları varken işletim sistemine assembly ile sürücü yazmakta mantıklı değil. Tüm bunları ayrıntılı düşünmek lazım.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

hasangurlek

Haklısın FPGA çok daha hızlı ve güvenli ama seri üretim aşamasında kullanılmasına daha çok uzun zaman var gibi. Üreticiler yüzbin adet için pazarlık yaptıklarında bizim transistör aldığımız paraya MCU alıyorlar hemde programlanmış şekilde. Yıllardır emek verdikleri geliştirdikleri kodlarda zaten hazır durumda. Bu nedenle kısa zaman içinde kimse üretim yönetimini değiştirmeyi ve maliyetlerini artırmayı göze alamaz. Seri üretimlerde centler bile toplamda çok büyük meblağlar tutuyor.

Bu gidişle mikroişlemci fiyatları dahada düşecek. Türkiyede 15-20 liraya satılan aslı 3-4 dolar olan microchip in 8 bitlik son serisi 18 ler bile amatörler arasında demode oldu. Yabancı forumlarda 24,30 33 serisi 16 bitlik hatta 32 bitlik işlemciler tartışılıyor. Biz ise daha ne 12F615 i nede 18F4553 ü bulabiliyoruz. Microchipin en çok sattığı ürünlerden biri, yurt dışında bakkallarda bile bulunan :) MCP1541 bile yok.

Paralel çalışmaya gelince yeni MCU lerde yüksek ve düşük seviye kesmelerin isteğe göre ayarlanabilmesi buna bir derece imkan veriyor. Bir tarafta AD çevrim yapılırken diğer tarafta herhangi bir porttan bilgi gönderilebiliyor, başka bir tarafta eldeki datalar işlenebiliyor vs. Böyle olmasaydı otomotiv sektöründe FPGA kullanımı şimdiye kadar yaygınlaşırdı.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

z

FPGA ile paralel işlem zaten radar gibi yüksek hızlı sinyal işleme gerektiren uygulamalarında kullanılıyor.

Uygulamalar sınıflandırılacak olursa böylesine yüksek paralel işlem gücü gerektiren uygulamalar azınlıkta kalır.

Geçmiş yıllarda denetleyiciler günümüz denetleyicileri kadar zengin çevre birimlerine sahip değillerdi. Örneğin içinde PWM modülü ve Quadrature encoder barındıran denetleyici sayısı 1 yada ikiyi geçmezdi.

Bu durumlarda sorun genellikle ya ayrık devrelerle yada CPLD ile çözülürdü.

Şimdilerde istenen her hız seviyesinde ve karmaşılıkta denetleyici bulabiliyoruz.

Devam edecek.....

Denen yerden devam edelim.

Herhangi bir işlemciye güçlü diyebilmek için kriterlerimizin olması gerekir.

Hız açisindan bir saniyede, kayan noktalı sayılarla yapılabilen işlemlerin sayısı baz alınabilir.

Ancak, işlemcinin güçünden ziyade uygulamayı hangi işlemci sorunsuz çözer sorusuna odaklanmak gerekir.

Bir kaç işlemci üzerinde pek çok uygulama geliştirmiş bir kişi, çok az deneyimli bir kişiye kıyasla karşısına çıkan bir uygulama probleminde CPU seçiminde daha az sorun yaşar.

Çünkü deneyimleri daha önce kullandığı işlemcilerin bu işin üstesinden gelip gelemeyeceği hakkında kolaylık sağlar.

Ancak karşı karşıya olduğu yeni uygulama hakkında derin bilgilere sahip değilse geçmişteki tecrübeler hiç bir işe yaramayabilir.

Örneğin daha önce hiç motor kontrolü yapmamış bir kişi ilk kez motor kontrolü yapacaksa daha önce kullandığı işlemcilerin işlem gücünün bu projenin üstesinden gelip gelemeyeceğinde kolayca yanılabilir.

CPU seçiminde biz amatörleri sınırlayan durumlar,

CPU kolayca bulunabiliyormu?
Fiyatı ucuzmu?
Gerekli alet edevat (derleyici, debugger, programlayıcı vs) var ve ucuzmu?
Amatör gelişmelere açıkmı?

Devam edecek ....
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MC_Skywalker

Assmbler kullanılmadan önce bilgisayarlar direk opcode, operant vb. kullanılarak direk programlanıyordu. bunun zorluğun görülerek programlama için işaretleme dili geliştirme ihtiyacı doğmuştur.

komutların direk HEX karşılığı olup CPU düzeyinde programlama yapılmaktadır. Assembler yinede kolay bir dil olmayıp programlanan CPU ve çevre birimlerinin iyi tanınması gerekemekte idi.

daha sonra geliştirlen C dili ise assemble oranla dil olarak ifadeleri vardır. C tasarımı nedeni ile Assembler ile bir bütündü. Derleme yapıldığında,  assembler gibi direk hex/binary çıkışı üretmekte.

C dosyaları ve h başlık dosyaları ayrı ayrı derlenir en sonunda linker ile linklenip çalıştırla bilir dosya oluşturulur.

diğer üst seviye dilleri tam derleyici değildir. yorumlayıcı diyebiliriz. önce kod yourmlanıp derleyicinin türüne göre asm yada başka bir dosya oluşturulur bu dosya derlenip çıktı üretilir.

Klein

Artık işlemcilerde bin tane interrupt var. hiç öyle ASM  ile hız ayarı , hızlı kontrol yapılmıyor. Profesyonel devrelerde birçok iş donanımda halledilir. Yad da işlemcinin özel portları kullanılır. Eğer herşeyi loop'ta halletmek istiyorsanız, zaten kafadan kaybetmişsiniz demektir. Çünkü en yavaş donanımınız kadar hızlısınız demektir. Örneğin bir lcd göstergeye veri basıyorsunuz , lcd'nin veriyi almasını beklemek zorundasınız. Kodunuz istediği kadar hızlı olsun sizin hızınız = LCD nin hızı. Eğer interrupt , işlemcinin özel portları , işinize yarayacak donanımlar kullanmıyorsanız , istediğiniz kadar hızlı kodunuz olsun hiç bir işe yaramaz. Yok ben ikesmeleri de etkin kullanıyorum , ben pwm çıkarmak için pwm portlarını ya da donanımlarını , periyot ölçümü için o işe özel portları ve zamanlayıcıları , işe en uygun işlemciyi   kullanıyorum diyorsanız , zaten ozaman ASM , C hız farkı vs.. tamamen hikaye.   Eğer nanosaniyelerin önem kazandığı bir proje ile uğraşıyorsanız , zaten işlemcinizin giriş çıkış donanımlarırını o projeye göre seçmelisiniz. Hem asm kullanıp en hızlı olayım hem de bütün işi işlemcinin çekirdeğine yıkıp bütün işleri yazılımla halledeyim diyorsanız , şapkanızı önünüze koyup bir daha düşünün derim.

Hız yüzünden asm kullanıyorum, c kullanmıyorum diyen arkadaşlardan rica ediyorum. Lütfen ASM ile yaptığınız ve benim C ile yapamayacağımı düşündüğünüz bir projenizi gönderin. Bunu polemik yaratmak için söylemiyorum. Gerçekten merak ediyorum.

z

Tartışma C mi güçlü yoksa asm mi güçlü tartışmasına dönmemeli.

Konuyu başlatan olarak C nin ve asm nin güzelliklerine ileride değineceğim.

@Klein yazdıklarında sonuna kadar haklısın. C ile yazılmıs bir interrupt rutini asm ile duruma göre yüzlerce, duruma göre onlarca, duruma göre bir kaç makina saykılı daha da hızlandırılabilir.

Ancak bu kadarlık hız artışına ihtiyaç duyuluyorsa daha baştan işlemci yanlış seçilmiş demektir.

32 bite kadar matematik işlemler yapabilen C kütüphanesi ile 64 yada 128 bit aritmetik işlemler yapmaya kalktığımızda hız açısından çuvallarız. İşte bu noktada C nin gücününün önemli bir kısmını kütüphane fonksiyonlarından aldığını söyleyebiliriz. Fakat C, gücünü asıl disiplininden alır.

Asm kodlayıcı arkadaşların iyi kodlama yapabildiklerini iddia edebilmeleri için memory kullanımını çok iyi biliyor olmaları gerekir.

C, çok fazla ram ve çok fazla rom alanı istiyor düşüncesi yaygındır.

Halbuki bu çok doğru değildir. Kısa kodlarda evet C fazla alan istiyormuş gibi görünür.

Ancak uzun kodlamayı gerektiren çok uzun programlarda asm severlerimiz stack kullanımına hakim değilse assembly dilinde yazdığı kodun ihtiyacı olan ram alanı C den kat ve kat daha fazla olacaktır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Biri Kungfu Biliyor Diğeri Güreş,Biri Akido diğeri Jijitsu
Şimdi Bunların Hangisi birbirini döver ?
cevap duruma göre değişir. Yani hız gerekli ise Asm Kullanırım, Proje çabuk yetişecekse C kullanırım olmadı PBP,Yada SF kullanırım
İşlemcide Aynıdır Projeye göre, seçim yaparım Gerekirse 8051,Keil ve c üçlüsünü kullanırım projeye göre 18f4550 iş bence bilgi ve projenin gereksinimlerini kapsıyor

z

Yazım, gelen mesaj ve yorumlar üzerine biraz dallanacak.

Bu yazıda asm aşıklarından bir kaçını artık C de de kod yazmak üzere
iknaya çalışacağız.

ASM severlerimiz C ile yazılmış programın derlenmesi sonucu ortaya çıkan lst yada asm uzantılı dosyaları incelediklerinde dehşete düşerler.

Kendilerinin bu kodlardan çok daha kısasını yazacaklarını düşünürler.
Haklılar da. Gerçekten o program daha kısa yazılır.

Yukarıdaki mesajlarımdan birisinde C nin gücünü disiplinden aldığından bahsetmiştim. Bunu bir kez daha yineleyecek fakat sebebini daha sonraki yazılara saklayacağım.

Aslında lst file çok kabarıktır. ASM seviciler pek çok Assembler Directive den habersizdir. Çünkü bu directivelerle hemen hemen hiç işleri olmaz.
Bu nedenle lst dosyaya değil hex dosyaya disassembler ile bakılmalıdır.

ASM sever C karşıtlarını 3 gruba ayırabiliriz.

İlk grup asm bilir ve C yi karmaşık bulur, C öğrenmek için çaba harcamaz. Ancak asm de dilediği her programı debelene debelene yazar ve başarır.

Asm aşığı fakat C'nin hayranı biri olarak;

iki satır ile, asm seven arkadaşlara C nin neden sempatik olduğunu açıklayacağım.

Ramda, A ve B adlarında değişkenimiz olsun. A değerini okuyup B değişkenine atamak isteyelim.

işlemciniz ve derleyiciniz nedir bilmediğim için hayali bir işlemcimizin X registeri olduğunu, atama komutumuzun da ATA olduğunu varsayalım.

B=A işlemi için

ATA X,A
ATA B,X

dan oluşan iki satırlık kod B=A işlemini yapar.

Ancak kimi işlemcilerde ATA komutunun operandların dizilimi yukarıdakinin tam tersidir ve

ATA A,X
ATA X,B

yazımını gerektirir.

Bazı işlemcilerin mnemonik kodlarında ATA yerine MOV barındırır kiminde ise okuma için LD yazma için ST olmak üzere ayrılırlar.

Bu durumda B=A işlemi

LD A,X
ST X,B

yada

LD A
ST B

yada

MOV A,X
MOV B,X

Halbuki hangi işlemciyi kullanırsanız kulanın C de yazacağınız kod sadece ve sadece A=B; den ibarettir.

ASM yazımında işlemciden işlemciye değişen bu muazzam karmaşaya karşılık C de muazzam bir anlaşılırlık vardır.

A=B; Aya B içeriğini yaz demektir. O halde neden A yı CPU rege yaz ardından da CPU regi de B ye yaz diye uğraşıyoruzki? Siz zaten A=B; dediğinizde zaten derleyici asm de yaptığınız bu iki aşamalı işin aynısını yapacak. C bunu farklı yoldan mı yapacak sanıyorsunuz?

Eğer sık sık farklı firmaların çipleri ile uşraşıyorsanız  aynı anlama gelen fakat derleyicinin kızdığı farklı mnemonik kodları yanlışlıkla birbiri yerine kullanıyorsanız sık sık derleme hatası alırsınız. (Mesela birinde Mov diğerinde LD)

ASM ile 1 ay önce kendi yazdığınız kodları bile  anlamak için kodlara yoğunlaşmanız, satırları tek tek izlemeniz gerekir. Halbuki C de böyle bir çabaya gerek yoktur.

***********************************************************

Şimdi de, C benim yazdığım asm kodlardan daha uzun kod üretiyor diyen ve sırf bu yüzden C den uzak duran ikinci grup arkadaşlara C yi sempatikleştirelim.

Eğer C ye sırf bu sebepten dolayı uzak duruyorsanız sizleri C sever haline getirebiliriz.

char A3,B3;

void F1(void)
{
char A1,B1;
      A1=B1;
}

void F2(void)
{
char A2,B2;
      A2=B2;
}

void main(void)
{
     A3=B3;
}


program satırlarını derleyin ve hex kodlara disassembler ile bakın ve tek tek An=Bn atamalarının yapıldığı satırları bulun.

C derleyici, Ramda kaç byte kullanmış dikkat edin.
Bu programı siz asm ile yazsaydınız nasıl daha kısa yazardınız?

ASM aşığı olupta C den uzak duranlara çok basit bir kaç öneri.

Ön yargıları bir kenara bırakın ve;

Memnun kalmazsanız nasıl olsa diskten silip atabilirsiniz. Kendinize basit bir C derleyici temin edin.

En basit program yazımı için gerekli hazırlıklar nedir öğrenin.
(proje dosyası oluşturmak, CPU seçmek ana C program dosyasının içine girmek, compile etmek, asm ve lst dosyasına
girmek vs)

Bir süre için;

1. Asla ve asla statik değişkenler kullanmayın tüm değişkenlerinizi global alanda tanımlayın.

2. C nin tek bir kütüphane fonksiyonunu dahi kullanmayın

3. Cary, Zero, varsa Overflow flağını vs tüm CPU flagları unutun

4.  ASM den bildiğimiz

MOV yerine =
AND yerine &
OR yerine |
XOR yerine ^
NOT yerine ~
sağa kaydırma işlemi için >>
sola kaydırma işlemi için <<
eşitmi, büyükmü, küçükmü, pozitifmi negatifmi, sıfırmı testi için status registerinin bitlerini sınamak yerine
if komutunu kullanın.
Sakın ha sakın for, while tipi döngüler, switch tipi şartlanmalar kullanmayın lazım oldukça goto kullanın.

Bu kadarcık bilgi ile asm de yazdığınız tüm programları C de bu sembollerle bire bir yazabilir ve tıpkı kendi yazacağınız asm kodların aynının yada çok benzerinin C tarafından oluşturulduğunu hayretle görebilirsiniz.

Garanti veriyorum, C benim yazdığım asm kodlarının aynısını yazıyor diyeceksiniz.  

ASM bilginizin seviyesini ancak ve ancak C kullanmaya başladığınızda anlayacaksınız.

Peki incelediğiniz bazı C programların hex çıktıları neden sizden daha fazla kod kullanıyor?

Bunu ve yarım kalmış CPU güçleri üzerine konuşmaya devam edeceğiz.

Eğer ben asm aşığıyım, C nin anlaşılırlığı hoşuma gitti ve derleyicinin ürettiği kodlar benim yazdığım asm kodların çok benzeriymiş artık C ye geçmeye hazırım diyorsanız el kaldırın.

El kaldırın ki yazıların seyri değişsin. C ye geçmekle asm den kopmayacaksınız.

ASM severlerde bir ücüncü grup vardır ki onlar C de yazılmış programın asm de yazılandan daha yavaş olduğunu bu nedenle hızlı projelerin asm ile yazılması gerekliliğine inanmışlardır.

Nerede yanıldıklarını zamanı gelince göreceğiz.

Ancak asm ile limitleri zorlayarak C nin ulaşamayacağı hızlara nasıl çıkılırı da göreceğiz. Fakat bunun çok da anlamının olmadığını zira bir gram şeker alabilmek uğruna bir kilo keçiboynuzu yemek zorunda kalacağımızı, sırf asm severler olarak zekamızla PC yi yenerek istersek C den daha optimum daha hızlı koşan kod yazabileceğimizi göstereceğiz.

Ama bunu çok çok ileride ele alacağız.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

KAZIMUGUR

Bu mesaj dahil , bilgi haricinde , kompleksleri taşıyan mesajlar silinse , mesela , sadece @z düzlemindekiler kalsa çok güzel bir başlık olacak  .  :roll:

Mod Notu: BU MESAJ UYARI MAHİYETİNDE OLDUĞU İÇİN SİLİNMEDİ, KORUNDU

bigbey

@z Bir soru soracağım.
bir program düşünün 1 led, 1 sn aralıklarla yanıp sönüyor. Bu arada port A0 dan bilgi varmı diye de konrol etmemiz gerekli. Bilgi var ise led'i söndürüp bir satırda bekletelim. (SLEEP) bunu C olarak nasıl yazabiliriz.
bu tip bir işlevi C de yazıp hex dosyasını beraberce inceleyelim.
Ben C dilini kullanmayı istiyorum fakat C nin yazım kuralları biraz sıkıyor beni.
Tabi ki biraz alışıp sindirmek gerekli.
TA6R

XX_CİHAN_XX

Alıntı yapılan: "bigbey"@z Bir soru soracağım.
bir program düşünün 1 led, 1 sn aralıklarla yanıp sönüyor. Bu arada port A0 dan bilgi varmı diye de konrol etmemiz gerekli. Bilgi var ise led'i söndürüp bir satırda bekletelim. (SLEEP) bunu C olarak nasıl yazabiliriz.
bu tip bir işlevi C de yazıp hex dosyasını beraberce inceleyelim.
Ben C dilini kullanmayı istiyorum fakat C nin yazım kuralları biraz sıkıyor beni.
Tabi ki biraz alışıp sindirmek gerekli.

Öncelikle kıyaslama yapmak için çok ufak ve basti bir program olduğunu belirterek kodları vermek istiyorum.

#include	<pic.h>
	__CONFIG	(WDTDIS & XT);
#define		LED		RA1
#define		BUTON	RA0

unsigned char count = 61;
void main (void)
{
	LED = 0;
	TRISA = 1;
	OPTION = 0x85;	//tmr0 pre val 1:64
	TMR0 = 0;
	INTCON = 0xA0;
	while(1)
	{
		if(!BUTON)
		{
			T0IE = 0;
			LED = 0;
			SLEEP();
		}
	}
}	

void interrupt timer (void)
{
	count--;
	if(!count)	
	{
		PORTA ^= 2;
		count = 61;
	}
	T0IF = 0;
	TMR0 = 0;
}

43 word

LIST	P=16F84A
	INCLUDE	"P16F84A.INC"
	__CONFIG	_WDT_OFF & _XT_OSC
#DEFINE	LED		PORTA,1	
#DEFINE	BUTON	PORTA,0
SAYAC	EQU		0x0C
YEDEKW	EQU		0x0D
YEDEKST	EQU		0x0E
	ORG			0x00
	GOTO		START
	ORG			0x04

	MOVWF		YEDEKW
	SWAPF		STATUS,W
	MOVWF		YEDEKST
	DECFSZ		SAYAC,F
	GOTO		EXIT
	MOVLW		.61
	MOVWF		SAYAC
	MOVWF		.2
	XORWF		PORTA,F

EXIT
	CLRF		TMR0
	SWAPF		YEDEKST,W
	MOVWF		STATUS
	SWAPF		YEDEKW,F
	SWAPF		YEDEKW,W
	BCF			INTCON,T0IF
	RETFIE

START
	CLRF		PORTA
	BSF			STATUS,5
	MOVLW		.1
	MOVWF		TRISA
	MOVLW		0x85
	MOVWF		OPTION_REG
	BCF			STATUS,5
	CLRF		TMR0
	MOVLW		0xA0
	MOVWF		INTCON
MAIN
	BTFSC		BUTON
	GOTO		MAIN
	BCF			INTCON,T0IE
	BCF			LED
	SLEEP
	END

35 word

Arada 8 word lük bir fark var onunda 4 tanesi zaten C nin güvenlik açısından kesmeye girerken ve çıkarkan PCLATH ın konumunu yedeklemesinden kaynaklanıyor. Yukarıda da bahsettiğim gibi bu tarz ufak programlar ile C nin üniversalliğinin ve sağlamlığının, kısacası gücünün değeri anlaşılamaz. Şimdi buradan çıkan sonuçla asm C den 8 komut daha kısa kod üretti öyleyse ben asm ye devam edeyim düşüncesi son derece mantıksızdır. @z hocam daha güzel izah eder sanırım  :P
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

bigbey

@XX_CİHAN_XX,
Aslında ulaşmak istediğim cevap bu değildi.
burada 1 Saniyelik zaman dilimleri ile led flash yaparken porta0 dan istek geldiğinde programın başka bir rutine gitmesi gittiği rutinde de 300 milisaniyelik bir zaman beklemesi ve (bu arada ise porta1 den istek geldiğinde SLEEP olarak beklemesi.) ben SLEEP dedim kestim ama sorumun eksik olduğunu gördüm.
Daha doğrusu bir cevap arıyorum. bunu bulabilmek için soru soruyorum.
ASM programına baktım ama istediğim sonuç olmadı. ;)
TA6R

XX_CİHAN_XX

@bigbey hocam,
Ben bir önceki sorunuza göre kod yazmıştım şimdi istediğiniz bundan biraz daha farklı. Tabiiki bu şekilde de isterseniz kod yazıp mukayese edebiliriz ancak ben yine arada ciddi sayılabilecek bir fark olmayacağına eminim. Çünkü yukarıdaki iki kodu dikkatli incelerseniz asmdeki formatın nerdeyse aynısı olduğunu göreceksiniz...
Burada tam olarak görmek istediğiniz cevabın iki kodun kullandığı bellek miktarları arasındaki fark olmadığını sanıyorum çünkü böyle bir kıyaslama yapmak ve tek başına bu kıyaslamayı kriter olarak almak taktir edersiniz ki hiç doğru değildir.
Öyleyse burada görmek istediğiniz cevap tam olarak nedir? :D
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

z

Eğer ilgi olursa zaten çok basit bir programı hem C de hem asm de yazıp ardından kod ve kullanılan ram alanını mukayese etmeyi düşünüyordum.

Çoğunluğun takip edebilmesi için de 8 bit PIC serisi bir çip üzerinde konuşmak iyi olacak.

Diğer mesajların silinmesi konuyu başlatıp sürükleyen olarak açıkcası beni rahatsız eder.  Varsa karşıt görüşler, destekler görüşler, yanlış bilgiler konuşulmalı.

Bu arada asm ve C konusunda uzman olmadığımı söylemeliyim. Gevezelik etmeyi severim.
 
Ayrıyeten bu başlıkta tek amacımız asm severleri C ye yakınlaştırmak değil.

Tam tersini de yapacağız.

Asm severlerin çok benzeri C ciler, C ye kendilerini öyle bir kaptırmışlardırki katı C kurallarından ödün vermezler.

Neymiş efem taşınabilirlik kayboluyormuş.

Matematik ve lojik işlemlerin taşınırlığında hiç sorun yoktur. Hangi işlemciye geçersek geçelim A=B+C; gibi bir satır rahatça taşınabilir.

Fakat donanıma özgü rutinleri, kesme rutinlerini ne yapacağız? Biz muhasebe programı yazmıyoruzki.

Taşınabilir C ancak ve ancak donanımdan bağımsız programlar için yada PC de olduğu gibi işletim sistemi ve üzerine oturtulmuş ve değiştirilebilir donanıma ait driver yazılımlarla olur.

Denetleyiciler için yazılan bir C programı taşınamaz. Programı belli bir ölçüde taşıyabilir geri kalanı adapte etmeye çalışabiliriz.

Zaten hangi dili kullanırsak kullanalım yazdığımız programlara bir göz atın.

Program üç ana parçaya bölünebilir.

1. Denetleyici donanımına veri yükleyip veri okuyan program parçaları.
2. Bu ve diğer verileri kullanan donanımdan bağımsız program parçaları.
3. Kesme programına ait parçalar

Eğer bu 3 parçayı da kullanılan işmeciden bağımsız taşıyabilseydik ne güzel olurdu.

Fakat malesef sadece 2. bölüm taşınabiliyor.

Bu noktada sözü C severlerlere bırakıyorum.....
Bana e^st de diyebilirsiniz.   www.cncdesigner.com