Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: z - 13 Kasım 2009, 16:01:07

Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 13 Kasım 2009, 16:01:07
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....
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: hasangurlek - 14 Kasım 2009, 00:59:30
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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: hasangurlek - 15 Kasım 2009, 04:53:26
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ı.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 15 Kasım 2009, 10:04:51
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 ....
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: MC_Skywalker - 15 Kasım 2009, 10:55:51
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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: Klein - 15 Kasım 2009, 14:33:39
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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 15 Kasım 2009, 16:01:24
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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: muhittin_kaplan - 15 Kasım 2009, 19:17:00
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
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 01:02:41
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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: KAZIMUGUR - 16 Kasım 2009, 03:41:47
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
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 16 Kasım 2009, 11:05:50
@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.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 16 Kasım 2009, 13:00:56
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
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 16 Kasım 2009, 14:28:37
@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ı. ;)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 16 Kasım 2009, 14:44:39
@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
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 14:51:57
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.....
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: gallavi - 16 Kasım 2009, 15:12:01
C deki taşınabilirlik sizinde önceki mesajınızdaki gibi asembler de A=B; ifadesinin bile farklı yazılması gereğinin çok çok ilerisindedir ama noktasına virgülüne dokunamdan taşımak tabiki söz konus değil PC ortamında bile
Birde benim dikatinizi çekmek istediğim konu proje boyutları asembler ile uğraşan arkadaşların yazdıkları en karmaşık ve uzun proje nedir. PIC için çokfazla bu sınır belli olmasada örneğin ARM gibi kod boyutunun çok uzun olduğu karmaşık işler yapan büyük projelerde bazen C nin bile yetersiz kalıp projeyi içinde çıkılmaz hale getirdiği onun yerine nesne tabanlı özelliklerinde dolayı C++ kodlarının yazılmasının nerdeyse zorunluluk olduğu düşünüldüğünde sanırım bu tarz uzun soluklu projelerden uzak duruyorlardır.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 16 Kasım 2009, 15:12:14
Evet XX_CİHAN_XX ulaşmak istediğim sonuçlar dan biri işlemcinin çalışmasına, programın adım adım yürütülmesi esnasında ne şekilde işlediğini bilerek hareket etmek. Daha doğrusu çekincelerimden biri bu (hani hesap makinesi kullanmaya alışırsınız ya)
Ben zaten C konusunda öğrenme zahmetine katlanamayacağım durumda görüyorum.(zaman olarak hazır değilim) ve mutlaka ASM yi aratmayacak şekilde bir C editörü kullanmayı epeydir düşünüyorum.
Dediğim gibi bazı çekincelerim var. henüz bu çekinceyi anlatabilimiş değilim.
Bilindiği gibi işlemciilerimiz. bir işi bir birim zamanda yapabiliyor. bir iş yapılırken diğer işi yapma yeteneği işlemcimizde yok o halde bu işi yani bir zaman dilimi içinde bir iş yaparken diğer bir koşulu da denetleme konusunda C dilinin nasıl davranacağını anlamaya çalışıyorum. Bu konuyu ASM nasıl davranacağını zaten biliyorum.
Ben bu konu başlığında konular ilerledikçe sorularıma cevap bulacağımı sanıyorum.
Bu vesile ile bende kafayı bozup zamansızlıkla ilgili sorunu arkaya atıp C ye giriş yapabilirim sanırım ama dediğim gibi C yi öğrenmeye harcayacağım zamanı, bu C olmadı ASM siz yapamıyorum diye bir duruma düşmek beni oldukça bozar.
Konu dağılmıyorsa bir yaşanmış örnek vereceğim.
Bu vereceğim örnekte lütfen PICBASIC kullananlar alınmasın ve cevap hakkı doğmasın. PICBASIC kullanmaya başladım eskiden bildiğim Qbasic bilgilerimden dolayı kolayca adapte oldum. Interrupt kullanmak istediğimde bir hüsranla karşılaştım. PICBASIC yapısı gereği GIE yi kapatıp kendisi satır aralarında kullanmak istediğimiz Interrup'un flağını sorguluyor ve reel bir Interrupt uyguşaması erçekleşmiyor.(program satırları da ayrıca uzuyor) hemen vazgeçtim. Şimdi ya C de de benzeri şekilde yetersiz bir koşul ile karşılaşırsam halim nice olur dedim ve ASM ye devam dedim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 15:38:10
@Gallavi

Haklısın ama şu sorgulamayı yapmalıyız.

Bir elektronikçi olarak elektronik devre mi yapıyoruz yoksa cep telefonunun görsel, sesli,  süslü püslü menülerinin, database uygulamalarının, sesle komut algılama sağlayan rutinlerinin ve telefonun codec yazılımlarının gömülü olduğu uygulamaları mı?

Ben burada elektronik devrelerin yerini alan denetleyicili temel uygulamaları konuşmak istiyordum.

Eğer C de yazılmış bir programı taşırken programın sağını solunu gıdıklıyorsak, üstü kapalı olarak C içine gömdüğümüz asm de yazılmış bazı rutinleri de gıdıklayabileceğimizi söylemeye çalıştım.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 16:26:28
Bir uygulama programını iki parçaya bölebiliriz.

1. Özü
2. Süsü

Uç noktalarda bir örnek verelim.

Vektör kontrollu 3 fazlı motor hız kontrol cihazını ele alalım.

Bu cihazın içindeki denetleciye gömülmüş programın özü, üretilen PWM sinyale senkron şekilde motor akımlarını ölçülmesi, Alfa Beta verilerinin oluşturulması, D/Q dönüşümlerinin yapılması, giriş hız verisiyle ölçülen yada hesap edilen hız verisiyle farkını alıp bunu PI yada benzeri kontrol algoritmasına sokulması ve daha sonra Ters D/Q dönüşümü ile ABC ye geçilmesi, bu değerlerle space vector algoritması yada sinusel modulasyon algoritmasının işletilmesi,  ardından PWM değerlerinin hesaplanması ve denetleyicinin duty değiştiren registerlerine yüklenmesidir.

Programın özüne, aşırı akım denetleyen yazılımlar yada kesmeler de eklenebilir.

Bunun dışında kalanlar ise işin süsleme kısmıdır.

Örneğin klavye ve LCD display üzerinden menüler vasıtasıyla parametrelerin okunması yada gösterilmesi, parametrelerin EEproma yazılması yada okunması, parametrelerin seri porta, USB ye yada CAN busa yazılarak uzaga tasınması, yanlıs girilen verilerde düdük öttürülmesi işin sanatsal kısmını oluşturur.


Aynı projede hem C hemde asm kullanarak program yazmaya başladıysak asm sever olarak süsleme sanatından uzak durmak gerekir.

C sever olarak da işin özünü oluşturan rutinlerden bazılarını asm yazıp yazmama konusunda sezgi ve şartlanmalardan arınmış olarak karar vermek önemlidir.

Bir üst hız seviyesinde denetleyici seçmek işin en kolay kaçamak yoludur.
Bu durumda ASM ile debelenmeye gerek kalmaz.

Fakat üreticiler bizleri bu kaçamak yola itelemekteler. Çünkü denetleyici fiyatlarını onlar belirliyorlar ve çoğu zaman 8 bit işlemci ile 16 bit işlemci hemen hemen aynı paraya alınabiliyor.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 16 Kasım 2009, 16:37:10
bigbey hocam,
İnanın iyiki C ye geçmişim diyeceksiniz. Beni biliyorsunuz asm yi sizden öğrendim ve 6 sene kullandım halada gerektiğinde C ile beraber kullanıyorum asm bırakılmaz :D
C ye geçmek demek bunca yıllarınızı verdiğiniz hakim olduğunuz bir dili bırakmak demek değil zaten.
BASIC te bahsettiğiniz olay hi tech c de yok :)
Ek olarak (Hi Tech C den bahsediyorum)
Kesme asm de neyse C de de o
pwm asm de neyse c de de o
usart asm de neyse c de de o
siz usart için asm de txcon a , txreg e  ve diğer tüm reglere ne yüklüyorsanız C de de aynı işlemi yapıyorsunuz ve arkaplanda aynı asm üretiliyor aynı işlem yine yapılıyor
BASIC yada CCS de gördüğünüz tonla özel fonksiyon sizin gözünüzü korkutmuş gayet doğal çünkü onlardan bende korkuyorum :D
Ama standart C, Hi Tech C öyle değil. ASM neyse orada bir donanımsal modülü kullanmak için ne yapman gerekiyorsa aynı işlemi C de yapıyorsun tek farkı MOV ile txreg e 10 yüklemiyorsun txreg = 10 diyorsun gibi... :)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: fatihkuzucu - 16 Kasım 2009, 16:48:13
Ben 2 söz söyliyeyim tam buradan....

Aynı paraya alınabilen 2 mcu arasında bariz performans farkı varken neden "asm de yazmak" gerek gibi düşüncelere kapılıyorsunuz. İşin özü hızlı ve güvenilir bitirmek ise daha iyi arabaya binmemek için neden bu kadar uğraş veriliyor.

Adamlar ayda su bulmak için yıllarını ve zamanını harcarken burada yazılım acısından en iyi olduklarını düşünen arkadaşlar; Asm ile ugrasırım sayfalar dolusu yazarım en iyisi budur diye tutturmanın manası nedir? Bu manasızlıkla ayda su bulma gibi hedeflere kafamızı kaldıramayacağımızı görmeniz gerek.

Hani beğenmediğimiz çin varya, kopyacı dandik ürün üretn çinli arkadaşlar uzaya çıktılar. Ayı gözlerine kestiriyorlar. Yanımızdaki iran neler yapıyor.  Bu ülkerleri örnek verdim çünkü en tepeden en aşapıya bir brokratik engellerle doldurmuşuz kafalarımızın içini. Sisteme yukarıdakilere saydıranlar bile aynı kalıptan çıktıklarını göremiyorlar. genlerimizde oynama yapmamız gerek.

En hızlısı en kolayı ve güvenililiri hangisi ise o kullanılır. Bu kolaya kaçma ve diğerlerinin becerilemeyeceği anlamına hiç gelmez. Kafalardaki katı kuralları yıkmak gerek.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 17:07:04
@Fatihkuzucu

Ben çocukken dönemin başbakanlarından birisi, TV ye çıkar ağır sanayi kuracağız ağır sanayide ilerleyeceğiz derdi.

Açık oturumlarda da bu siyasetçinin üstüne üstüne gidip ne gerek var dünyada bu iş çok ucuza yapılıyor biz pahalıya yapacağız da ne olacak vs vs dediler.

Halbuki bu tüm ülke çapında önemli bir hamle olacaktı. Çok eleştiri aldı. Proje ülke çapında değil de Konya da uygulanabildi. Bunda devlet desteği oldumu bilmiyorum.

Sonuç, ağır sanayide ülke olarak çok ileri gidemedik fakat Konya aldı başını gitti.

Halbuki ağır sanayi yarıiletken sanayinin de alt yapı taşları demekti.

Şu anda inanıyorumki Türkiye'de hiç bir şey Konya'dan daha ucuza daha iyiye yapılamaz.

Gelelim konumuza.

C dilinde program yazmak, eger 2'li sistem, matematik, mantık altyapınız yeterli değilse "el ..iyle gerdeğe girmek" gibidir.

ASM yazan herşeyi kendisi yapmak zorundadır. Çoğu zaman hazır kütüphane desteğinden mahrumdur.

Şimdi size soruyorum. Çok değerli C bilginizle bana sign magnitude gösteriminde işaret biti de dahil olmak üzere 4 tam biti, 252 tane kesirli biti olan sayının sinüs değerini hesaplayan fonksiyon yazabilirmisin?

Sayı hassasiyetini bu denli genişletmek ve standart dışına çıkarmamdaki amaç elbetteki seni C kütüphanelerinden mahrum bırakmak.

Konuyu buraya getirmek istemezdim ama evet bu soruyu C aşığı birisi sana soruyorum. Eğer yazarım dersen hemen bit uzunluğunu iki katına çıkartıp tekrar soracağım.

Bu programı asm aşığı bir arkadaş istenen herhangi bir bit uzunluğu için gözü kapalı yazar.

Ne demek istediğimi lütfen düşün.

Ağır sanayi örneği ile olan alakayı  kurdunmu?
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: fatihkuzucu - 16 Kasım 2009, 17:30:41
Siz olayları yanlış algılıyorsunuz bence.
Öncelikle ben C aşığı değilim. İstediğiniz koduda yazmayacağım.

Ağır sanayi kişilerin yada küçük firmaların yapamayacağı işlerin yapılabildiği bir sanayi dalıdır. Kolayca ağır sanayi işi ile uğraşılamaz. Emeğinin çok olduğu ile alakalı değil. Çok para gitmesi gerek, bilgili insanları yetiştirmek gerek. Uzun ve zorlu bir süreç. Yüzlerce, binlerce kişinin çalışması gereken bir toplu iştir.

Ağır sanayi= Asm diyorsanız  çok yanlış olur.  Burada yazılımdan bahsediyoruz. Klasik asembler yazılımı nasıl oluşur. Bir yazılımcı oturur baştan sonra tüm yazılımı yazar bitirir. Eğer assembler gibi bir kod yazılacaksa bir füzeyi 10 metre bile havalandıramazsınız. Bir füze havalandırmak için gerekli yazılımların hepsini assemblerda yazmaya çalışırsanız 100 senede bitirirsiniz herhalde.
Yok hedefte bir motor kontrolü ile basit bir makine elektronik donanımını yapılacaksa elbette yapar bir arkadaş. Burada insanların kapasitesi zekası öne çıkıyor.

İstemişsiniz bir formul. "O formulu nasıl cıkarılacagını bilmeyen bir yazılımcı, o kodu yazamazmı ?" demek istiyorsunuz ? Yoksa o kod C de yazılamazmı demek istiyorsunuz ?

Ağır sanayi= Bence bu konu ile alakalandırınca; en üst seviyede dilde yazan yazılımcıları ve donanımcıları bir araya toparlayıp bir füze havalandırıp tekrar düzgünce yere indirebilecek çalışmaları en kısa zamanda yapabilmek demektir.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: fatihkuzucu - 16 Kasım 2009, 17:43:31
Burada yazılımcılar olaya kişisel bakıyor. Ve fazla bencil fazla egoist davranıyor. Bir çok yazılımcı tanıdığım aynı bencillikte davranışlar sergiliyor. Sebebi türkiyede yazılım ile uğraşanların sayısının az olması. İhtiyacın da çok olması.

Bir işte ihtisaslaşmak küçük işlerde kişisel işlerde başarı getirebilir. Extreme örneklerde çıkabilir. Mesele buradanmı işe devam edileceğidir. Yoksa işlerin toplu olarak takımların insan guruplarının yaptığı noktadan mı yapılacağı ile çok alakalıdır.

Çoğunlukla yazılanlar, bir assembler kodunu kodu yazan kişi bile bir süre sonra tekrar okumaya kalktıgında bir anda okuyamadığı yönündedir.  Büyük hedefler var ise büyük hedeflere kişiler tek başına ulaşamaz. bir araya gelinip daha üst topluluklar kurulmalıdır. Burada C devreye giriyor. İnsanları bir araya getiriyor. Bir işi bir çok parçaya bölüyor. Bir çok fonksiyon yazılıyor kişiler ve firmalar tarafından. Bunların optimize olup olmadığı her zaman araştırılabilir. Ancak kod calısıyorsa optimize olup olmadıgının önemi sadece kodun derlendigi ortam için sınırları ne kadar zorladıgı ile ilişkilendirilebilir.

Yani Optimize olmayan bir kod. Bir cok yerden toparlanmış fonksiyonlarla olusturulmus olsun. En sonucta işi düzgünce yapabiliyorsa sorun yoktur. Ama o kodu F877 sokamıyorsunuzdur. F452 ye sokarsınız. O olmadı 16 bit lere bakarsınız. Oda olmadı arm7 arm9 bakarsınız. Aralarında cok büyük fiyat farkları olmadıgını siz kendinizde belirtiyorsunuz. Zaten assembler ile ugrasanları en cok üzende budur.İşlevlerini kaybettiren yada daha az degerli olmasını sağlayan piyasa baskısı bulunmaktadır. Daha üst seviyeli diller çıkıp daha çok örnek fonksiyon yaygınlaştıkca bebeler bile bu işi yapabilmeye başlıyor. Bu iyimidir kötümüdür? Olayın tüm özü burada....
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 16 Kasım 2009, 18:13:49
Alıntı Yapİstemişsiniz bir formul. "O formulu nasıl cıkarılacagını bilmeyen bir yazılımcı, o kodu yazamazmı ?" demek istiyorsunuz ? Yoksa o kod C de yazılamazmı demek istiyorsunuz ?

Hayır hiç birini demek istemiyorum.

C içine asm gömme fikri ortaya atılınca C severlerin ayaklanmaması gerektiğini söylüyorum.

C de CPU flagları ile ilgilenmeye başlarsanız C anlayışının dışına taşar ve taşınabilir kod felsefesinden ayrılmış olursunuz.

Halbuki sorduğum soru bu flaglara bakmayı gerektiren rutinlerle yazılmak zorunda. Zorunda diyorum çünkü bu flaglara bakmak yerine C nin if komutundan medet umarsanız yazılan kod asm koda göre hızla şişmeye başlar. Hızlı olması gereken bir fonksiyonu C sevdasına yavaşlatamazsınız.

C kütüphanelerindeki fonksiyonlar en hızlı çalışacak şekilde yazılırlar. Bunlar hızlı olmalıdırki C programlar hızlı çalışsın.

Görüyorumki asm severler C ye, C severlerin asmye baktıından çok daha hoş görülü bakıyorlar.

Bu sadece sizin şu anda verdiğiniz tepkiye bakarak vardığım sonuç değil.

Ağır sanayiye gelince, 30 sene önce ağır sanayide atılım yapsaydık şimdilerde yarıiletken sanayide söz sahibi olacaktık.

Neyse İnşallah bir sonraki nesillere artık.

C de alt planda ne oluyor bitiyordan habersiz y=sin(x) hesaplatmak size nasıl bilmem ama bana çok garip geliyor.  

Forumda bir arkadaş C ile inanılmaz bir cihazın üzerindeki işlemciye kod  yazıyor ardından bir başka başlık altında Mos transistör ısınıyor ne yapabilirim diye soruyor.

Alsana kel alaka diyeceğin örnek. Şimdi nerden çıktı dimi bu...

Bu arkadaş şimdi asm ye dil uzatırsa olmaz tabiki.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 16 Kasım 2009, 19:17:46
Peki bir soru sormak istiyorum.
C deki kütüphane içeriklerini ASM de zaten oluşturmuş (Kullanma ihtiyacında olduklarımızı) ve gerektiğinde içeriklerine de değişen ihtiyaca göre modifiye ediyorsak ASM nin kullanılabilirliği cazip olmazmı?
Ayrıca editörümüz ne kadar iyi olursa olsun kişinin program yazma mantığı işin esas noktasını teşkil etmezmi.
Birde ben şahsen z=a+b dediğimde ne yaptığını bilmek istiyorum. C derleyicisi bi şekilde bu işlevi gerçekleştiriyor ama ben bunu nasıl yaptığını bilmiyorsam bu beni ilerleyen zamanlarda tedirgin ediyor.İpin ucun elimden kaçacağını sanıyorum.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 16 Kasım 2009, 19:20:21
en kısa yol en iyi bildiğin yoldur
ayağını yorganına göre uzat kış yakındır
komşunun tavuğu komşuya kaz gibi gelir

burada olay dönüp dolaşıp bir projeyi-işi bitirmeye-çıkarmaya gelir.

kim bir işi-projeyi elindeki bilgi ve imkanlarla kullanabildiği ekipmanlarla çıkarabiliyorsa onun için en iyi en değerli elindeki imkan ve ekipmanlarla birlikte bunları kullanabilme becerisi-kabiliyetidir.gerisi laf kalabalığıdır.

ama kanıtsanmış bazı gerçeklerde vardır.işlemcilerin kendi arasındaki üstünlükleri dillerin birbirine göre üstünlükleri gibi.

arm ve renesas işlemciler dsPIC ve PIC32 den daha iyiler kabul ediyorum
C# dilide C++ ve ansi C89 dilinden daha iyi bunuda kabul ediyorum

ama yalnızca kabul ediyorum bunlardan ansiC89 ve dsPIC ile PIC32 haricindekilerin bulunduğum konumda bana bir faydası yok demekki benim için en iyisi elimdeki imkanlar

benim açımdan yola dsPIC30F,PIC32 ile devam dil olarakda C# 'a zamanla geçiş asm renesas,arm yerinde güzel öyle kalsınlar.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 16 Kasım 2009, 19:32:30
dsPIC ler için bazı C derleyicilerini inceledim bunlarda Cpu flag ve işlemci modül konfigürasyon bitleri hazır olarak planlanmış düzenlenmiş olarak veriliyor bunlar banada garip geliyor.C30 ve C32 de bu işler diğer derleyiciler gibi kolay ve hazır sunulmuyor cpu flag larını ve müdüllerin konfigürasyon bitlerini tek tek elden geçirmeniz gerekiyor hazır bir kodda kullansanız yapılanlar bu derleyici için açık kod olarak ortada duruyor.
asm yi bilmiyorum daha alt düzey 8 bitlik 16F ve 18F serilerinide bilmiyorum ama kullandığım dille ve derleyiciyle kullandığım işlemciye asm kadar etkin ve hızlı kodlar yazdığıma inanıyorum.
çünkü yazdığım kodları derlediğimde asm komut kümesinide gözden geçirir ve gerekli gördüğüm yerde c kod yazımıma müdahale eder ve tekrar düzenlerim C nin bit bazında makine diline yakın komutları ile işaretçi ve adres oparatörlerinide genelde kullanırım bunların bazı yerlerde asm dönüşümü daha uygun görünüyor gözüme.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 16 Kasım 2009, 19:47:42
Ben ASM ile C'yi bir örnekle benzeştireceğim. Bilmem ne kadar uyacak.
5*9=45 tir değilmi? cevap_ evet
9+9+9+9+9=45 tir değilmi? cevap_ evet
aslında C editörü de nihayetinde ASM olarak dönüşüm yapıyor yani yukarda bahsettiğimiz işlemi arka planda oluşturuyor.(işin hammaliyesini üzerine alıyor)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: hasangurlek - 16 Kasım 2009, 20:03:41
z hocam senin yazılarını gerçekten büyük bir zevkle okuyorum ve bu bölümünde devamını bekliyorum.

Yazmayı unuttuğunuz birde benim gibi cinslerin oluşturduğu bir gurup var ki, amacım kesinlikle kimseyi küçümsemek veya yargılamak veyahut kendimi övmek değil. Amacım arkadaşlarımızın düşünme boyutunu biraz ilerletmek. Lütfen üyelerimiz bunu kötü bir biçinde algılamasın. Bu başlığı kirletmek istemediğim için konuyu ayrı bir başlık altında yazmayı uygun gördüm. Kısaca bu ekstra guruptan bahsetmek gerekirse dedim ve buraya yeni bir başlık açtım. (https://www.picproje.org/index.php/topic,26715&highlight=)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: gallavi - 17 Kasım 2009, 08:24:49
Alıntı Yap
C# dilide C++ ve ansi C89 dilinden daha iyi bunuda kabul ediyorum

C# C++ dan daha iyi bi programlama dilideğildir. Bence :)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 06 Aralık 2009, 14:48:10
Biraz yavaşladık ve ortalığı karıştıralım.

Asm balık tutmayı bilmeyenlere pratik olarak balık yemeyi öğretir.

Yeni bir işlemci için C derleyicisi geliştiren bir grup düşünün. Bu grup içinde asm bilmeyen birini düşünebilirmisiniz?

Bir derleyicinin hatalarını bulmak için derleyicinin asm kodlarına bakmak gerekir.

Bir program hatalı çalışıyor ve sebebi anlaşılamıyorsa,

Zamanlama açısından kritik bir fonksiyon yazılacaksa,

Kütüphane fonksiyonları ile kullanılamayan bir donanım için etkili bir kod yazılacaksa

ASM kaçınılmazdır.

Acaba C nin standart kütüphaneleri hangi dille yazılıyor? Gerçekten merak ettim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 06 Aralık 2009, 15:13:20
yazdıkların eminim doğrudur ben asm yi hiç bilmiyorum ne olduğunun kavramı hakkında bilgim var ama asm ile işlemci üzerine program yazmayı bilmiyorum yola ANSI C89 ile çıktım ve zamanla C bilgimi arttırıp C++ 'ıda atlayıp direkt C# daldım.C# da şu anda beklemede kaldı zamanla pc üzerinden görsel yazılımlar yazarım diye birde işlemcilerin gelecekteki çok çekirdekli yapısının derleyicisini C# olarak gördüğüm için bir ara eğitimini alıp ufak bir giriş yaptım diyebilirim.C den iyi anlayan biri için C# öğrenimi karmaşık gelmese gerek.ama birden öğrenilecek diyede bir şey yok uygulama ve hataları ayıklama vede zaman şart.

işlemci olarakda microchip firmasının dsPIC30F ve PIC32 haricindeki işlemcileri bilmem ticari olarakda hep dsPIC30F lerle çalışma yaptım bu zmana kadar benim gözüme kestirdiğim kendi işlerimde dışarıya aldığım ve yaptığım işlerin tamamında dsPIC30F serisi bana yettide arttı bile denilebilir bu işlemci ailesi ile yaptığım işlerimdeki bir takım uzamalar ve gecikmelerin nedenide ne bu işlemcileri programladığım C nin suçu nede işlemcinin suçu, suç benim yazılım ve donanım eksikliğimdendir.buda bilirsiniz zamanla deneyim ve tecrübeyle araştırmayla risk almakla aşılır derler

evet asm bilmediğim açık ortada elden bir şey gelmez ama çok şey kaybedeceğimi sanmam

bazen benimde çok tekrarlı kullandığım komut ve fonksiyonlarımı özel bir matematiksel hesaplamalar sıralamalı işlemlerimi kütüphane dosyası şeklinde kaydettiğim olur ve programı derlerken "*.h" şeklinde kod sayfama ilave edip derlediğim olur ama hepsi C üzerinden kod yazımla olur.asm ile değil ama derlediğim programlarımın asm kod üretimlerinede bakarım gözüme çarpan risk gördüğüm noktaları telafi aderim ama C30 derleyicisi zamanla geliştirildiğinden eskisi gibi müdahalelerim yok denecek kadar az aslında müdahele etmiyorum diyebilirim bunu asm yi bilmeden nasıl yapıyorum işlemcinin 84 komutlu asm yazım kelimelerinin yaptığı gecikme saykıllarını kataloğundan bilerek.

z,

zaten ben derleyicimin hazır olarak kullandığım kütüphane dosyalarımın içini bir şekilde göremiyorum siz görebiliyormusunuz varsa bir yöntem görmek istediğim kütüphane dosyaları var aslında orası ne ile yazılı bakmış da oluruz hem.

derleyici olarak Microchip C30 (16 bit dsPIC30F işlemcisi için), C32 (32 bit
PIC32 işlemcisi için) kullanıyorum.

nasıl görürüz hazır kütüphane fonksiyonlarının içini varmı bir yöntemi ben göremiyorum.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 06 Aralık 2009, 15:45:25
Bırakın interneti, kitabın bile bulunamadığı dönemlerde mağara duvarlarına hayvan resimleri kazırken sıkça örneğini vediğim y=sin(x) fonksiyonunu ecnebiler nasıl hesaplamış diye merak ederken


void main()
{
   .asm {
              nop
              nop
              nop
              nop
              nop
              nop
            }

   y=sin(x);

   .asm {
              nop
              nop
              nop
              nop
              nop
              nop
            }
}


gibi kod parçacığını derleyip exe üretir ardından da debug bilmemne.exe
yaparak asm kodların arasına dalardık.

Daha sonrada 5..6 tane nop arasına sıkışmış satırı bulup call edilen yeri saatlerce günlerce izlerdik.

Aynı işlemi sen de disasm ile yapabilirsin.

Ama neyseki günümüzde resimleri mağara duvarlarına değilde kağıda hatta bilgisayarda çiziyoruz.

İnternette yok yok.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 07 Aralık 2009, 15:40:59
Ben de C bilmeyen ve ASM kullanan biri olarak. Hep C öğrenmek istemişimdir. Fakat Bu güne kadar ASM ile kendi ihtiyaçlarımı karşılayacak kütüphaneyi oluşturduğum için ASM bana hiç zor gelmiyor.
Bana göre ben de mutlaka iyi düzeyde C editörünü iyi kullanan biri olmalıyım diye düşünüyorum.
Şimdi bir soru var aklımda; Acaba,

C de bir işlem yapsak. Örnek;
A=PORTC   ; A değişkenine portcyi atayalım
B=PORTD   ; B değişkenine portcyi atayalım
Z= 15 x A   ; Z değişkenini oluşturalım
Y= 12 x B   ; Y değişkenini oluşturalım
bu tip bir yazılımıda C derleyicisi nasıl davranır merak ediyorum.

kullandığı satırları hex dosyasından disassembly yapıp ASM yazılım mantığı ile karşılaştırmak isterim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 07 Aralık 2009, 17:52:53
bu kodların Microchip dsPIC30F serisi için C30 dan asm dönüşüm kodlarını çok merak ediyorsan ve istoyorsan hemen derler ve buraya yapıştırıım ama bu C30 kodların ASM30 daki karşılığının çok farkedeceğini sanmam hatta kılesik bir ASM30 kullanıcısından daha öz çalışan kısa bir kod verirsede şaşırmam.

sizden anladığım siz ASM yi iyi derecede biliyorum bununla işlerimi zaten kalıplaştırdığım için rahatça zorlanmadan yapıyorum demenize karşın ama C yide illa öğrenmeliyim diye bir istekde bulunuyorsunuz.

tam aksine ben ASM nin mümkünse yüzünü bile görmek istemiyor hatta
ilaveten insana yakın dillerden delphi/pascal - basic dillerine bile göz atmıyorum gerek yok çünkü benim bu işin eğitimini aldığım çevreden ve işin profesyonellerinden gördüğüm bu.

geleceğin çok çekirdekli 32-64 bit endüstriyel mikro işlemcilerinin programlanacağı dil C temelli diller C++ ve C# olacak.gelişmeler ve yatırımlar bu alanda.

bir ara asm olmadan işlemci programlanmaz işin mantığı temeli kavranmaz ilk okulu bitirmeden ortaokula başlanmaz tarzı lafları çok dinleyip hiç takmamıştım kararımdan son derece memnunum
birde milleti dinleyip 16-18F serisi ile asm üzerinden işe başlasaydım yanmıştım.hemde cayır cayır.

ama bundan 7 sene önce ve daha eskisi olsaydı dsPIC ve C30 derleyicisinden bahsetmek ne mümkündü mecburen ozaman eski tarz çalışmala devam edecektik.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 07 Aralık 2009, 18:15:27
@azimli,
Herhangi bir yarıştırma durumu yok. sadece nasıl bir mantıkla işi yapacağını merak ettim. hangi seri olursa olsun. hex dosyasından inceleme yapmak için söylemiştim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 08 Aralık 2009, 00:27:53

#include <pic.h>
__CONFIG (WDTDIS & XT);

unsigned char a, b;
unsigned int z, y;
void main (void)
{
a = PORTA;
b = PORTB;
z = a*15;
y = b*12;
}



:10000000012805089300060892000F30960097011A
:10001000130894009501E7230C309600970112080D
:0800200094009501E72300287C
:1007CE0098019901141CF12B160898070318990A21
:1007DE00170899070310960D970D0310950C940C9E
:1007EE0015081404031DE92B190895001808940028
:0207FE000800F1
:02400E00F93F78
:00000001FF


Alıntı yapılan: "HI-TECH C PRO for the PIC10/12/16 MCU family  V9.65PL1
"

Program space        used        45

NOT: Çarpma sonucu 16 bit olarak kaydediliyor.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 08 Aralık 2009, 10:16:51
Alıntı yapılan: "bigbey"Ben de C bilmeyen ve ASM kullanan biri olarak. Hep C öğrenmek istemişimdir. Fakat Bu güne kadar ASM ile kendi ihtiyaçlarımı karşılayacak kütüphaneyi oluşturduğum için ASM bana hiç zor gelmiyor.
Bana göre ben de mutlaka iyi düzeyde C editörünü iyi kullanan biri olmalıyım diye düşünüyorum.
Şimdi bir soru var aklımda; Acaba,

C de bir işlem yapsak. Örnek;
A=PORTC   ; A değişkenine portcyi atayalım
B=PORTD   ; B değişkenine portcyi atayalım
Z= 15 x A   ; Z değişkenini oluşturalım
Y= 12 x B   ; Y değişkenini oluşturalım
bu tip bir yazılımıda C derleyicisi nasıl davranır merak ediyorum.

kullandığı satırları hex dosyasından disassembly yapıp ASM yazılım mantığı ile karşılaştırmak isterim.


C ve asm için basit bir soru,
Z= 15 x A için A'yı 4 kez sola kaydırır(16A) ve 1 tane A çıkarır. Aynı asm'deki gibi.
Y= 12 x B için B'yi 3 kez sola kaydırır(8B) sonra 8B/2 ile toplar.
Sadece birkaçtane shift işlemi
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 08 Aralık 2009, 12:10:42

#include <pic.h>
__CONFIG (WDTDIS & XT);

unsigned char a, b;
unsigned int z, y;
void main (void)
{
a = PORTA;
b = PORTB;

z = a<<4;
z -= a;

y = b<<3;
y += y>1;
}



:10000000012805088F0006088E0092009301031056
:10001000920D930D0310920D930D0310920D930DFD
:1000200012089000130891000030110202300319E9
:10003000100200300318013090070318910A0028BD
:02400E00F93F78
:00000001FF


Alıntı yapılan: "HI-TECH C PRO for the PIC10/12/16 MCU family  V9.65PL1"
Program space        used      32

:)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: Erol YILMAZ - 08 Aralık 2009, 12:38:10
C dilini insanlar pek anlamamış diye düşünüyorum...
C ile ASM rekabet halinde olan diller değil.

C den gereksiz yere çekiniyorsunuz,
C kod yazımını kolaylaştıracak ve
Düşündüğünüz "özel yöntemler" var ise bunları yapmanıza da izin verecektir.

Çünkü C orta seviyeli kültürümüze saygılı,
gelenek ve göreneklerine bağlı hoş bir programlama dilidir.

2 komut arası delayms(10);  yazan "coder" kılıklı insanlara bile müsamaha
gösterecek kadar yumuşak huyludur.

İyi kullanmayı bilene AT olur, YOL olur, AŞ olur :P

Kısacası C iyidir :D
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 08 Aralık 2009, 15:15:04
Asm ve C ikisini birlikte bilen ile sadece C bilen arasındaki fark
@Cihan arkadaşımızın örneği gösteriyor. Bu aradaki fark çok küçük bir program içinde böyle büyük programlarda bukadar olmaz ama sadece matematiksel işlemler farkı artırır. Ama bunun içinde asm kullanılmaz. Asm sadece kritik yerlerde kullanılmalı. Sadece aradaki mantık farkını göstermek istedim.

Sadece C bilenlerin yöntemi:


void main (void)
{
  a = PORTA;
  b = PORTB;
  z = a*15;
  y = b*12;
}

Program space used 45



Asm + C bilenlerin yöntemi


void main (void)
{
  a = PORTA;
  b = PORTB;

  z = a<<4;
  z -= a;

  y = b<<3;
  y += y>1;  
}

Program space used 32



Asm temeli bence gerekli ama asm'de uzman olmak gerekmez. Bu benim gibiler için geçerli değil, zamanında asm'den başka seçenek yoktu ve
asm için çok uzun zaman harcadım. En sonunda asm içinde herşeyi macroya döktüm sonra baktım ki C zaten bir çeşit macro, sonra C'yi öğrendim.  
Asm ile 8K altında olan işlemcilere/projelere isteyen yazabilir ama zaman kaybı olur bence. 8K üzerindeki işlemciye /projeye asm ile mesela 10000 satır program yazarsa bence vakti çok bolmuş derim. Bu söylediklerim 8bit için geçerli 16-32bit için konuşmaya gerek yok.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 15:38:24
Evet çok doğru, C, asm deki macro yazımın gelişmiş hali diyebiliriz.

Asm  severler macro yazım sayesinde esneklik kazandıklarını iddia ederler ve haklılar da.

Örneğin

32 bit toplama rutinini bir kere yazdıktan sonra

ADD32 macro a,b,c gibi bir tanımla

a,b değişken adresleri gönderildiğinde toplanmış sonuç c içinde hazır olur.

Bu da satır satır kod yazmaya gore muthiş bir kolaylıktır.

Fakat bu kolaylık C deki

c=a+b; yazımının getirdiği konforla kıyaslanamaz bile.

Yalnız asm yazma işlemini 8 bitle sınırlayamazsınız.  16 ve 32 bit işlemcilere binlerce satır kod yazılacak projelerin işlemcisi diye  bakmamak lazım.

16 ve 32 bit işlemciler bir çırpıda 16 yada 32 bit üzerinde işlem yapan işlemci demektir. Adam 8 bit işlemci ile 4 byte veriyi asm rutinle toplayacağım diye göbeği çatlıyor buna rağmen kod yazmadan çekinmiyorsa 32 bit işlemcide bunu tek satırda bitirecek demektir.

Bu arada asm severlerden eemkutayın 32 gozlu yazılımını daha asagıya indirecek varmı?

Fakat eemkutayın burda yaptığı üçkağıt asm bilmekle alakalı değil.

Programı hangi işlemci için derlediniz?

Daha önce vurgulamıştım. Elektronikçi adam muhasebe programı mı yazacak kontrol programımı.

Eğer muhasebe programı yazacaksa ve asm kullanıyorsa fazla eşelemeyin kendi haline bırakın.

Yok kontrol amaçlı, 32 bit işlemciye asm kod yazıyorsa vardır bildiği. Laf söylemeyin.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 08 Aralık 2009, 17:40:04
Alıntı yapılan: "z"
Yalnız asm yazma işlemini 8 bitle sınırlayamazsınız.  16 ve 32 bit işlemcilere binlerce satır kod yazılacak projelerin işlemcisi diye  bakmamak lazım.

Fakat eemkutayın burda yaptığı üçkağıt asm bilmekle alakalı değil.

Bu arada asm severlerden eemkutayın 32 gozlu yazılımını daha asagıya indirecek varmı?

Yok kontrol amaçlı, 32 bit işlemciye asm kod yazıyorsa vardır bildiği. Laf söylemeyin.


z kardeş, yukarıdaki sözlerine cevaben yazıyorum, sen öncelikle benim sitemi gezip, tamamladığım projeler bölünümü ve mesleki geçmişimi okuyup daha sonra yazdıklarımı okusaydın ve cevap yazsaydın eminim aynı cümleleri kullanmazdın. Kulaktan duyma bilgilerle yorum yapanlardan değilimdir.

Çünkü  STM32(arm cortex m3) ve LPC21xx serisi (ARM7) sadece C ile PIC16/PIC18/PIC24/dspic30 serine asm ve C ile "endüstriyel projeler" yapmış kişiden bahsediyorsun.

Orada amacım, asm + C dili bilenlerin C derleyicisine müdahale ederek asm'ye çok yakın kod ürettirmesini göstermekti. Programınızı siz istediğiniz yolla yapabilirsiniz.

Şimdi ben sorayım, aynı derleyici , C dili kullanarak(C içinde asm yok)  , değişkenlerin büyükleri sabit kalmak şartıyla ve aynı işlemci kullanılarak asm çıktısı 32satırdan daha az program yazabilir misin?

Kutay
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 17:49:22
Alıntı YapYalnız asm yazma işlemini 8 bitle sınırlayamazsınız. 16 ve 32 bit işlemcilere binlerce satır kod yazılacak projelerin işlemcisi diye bakmamak lazım.

Dedim ve kusura bakma bizde gerçeklerden bahsediyoruz.

Kullandığın işlemciyi ve derleyiciyi söyle biraz kafa yoralım. Bakarsın 32 satırın altına iner yada evet bunun sınırı 32 satırmış deriz.

Peki C içinde neden asm kullanılmasını yasakladın?
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 08 Aralık 2009, 18:13:31
Alıntı yapılan: "z"
Alıntı YapYalnız asm yazma işlemini 8 bitle sınırlayamazsınız. 16 ve 32 bit işlemcilere binlerce satır kod yazılacak projelerin işlemcisi diye bakmamak lazım.

Dedim ve kusura bakma bizde gerçeklerden bahsediyoruz.

Kullandığın işlemciyi söyle biraz kafa yoralım. Bakarsın 32 satırın altına iner yada evet bunun sınırı 32 satırmış deriz.

Peki C içinde neden asm kullanılmasını yasakladın?

Merhaba,

Çünkü 16bit ve 32bit işlemciler genellikle 16K-512K aralığında değişir, 16K demek asm ile yaklaşık 16000 satıra kadar program yazılabilir demektir. Bence bunu asm ile yazan zaman israfı yapmıştır. Kendini boşuna kasmış demektir. Bu arada 16bit ve 32bit için bir kaç tane asm örneğini sitemde görebilirsin. Asm'yi sadece 16bitlerde delay ve kritik adc okumalarında kullanıyorum, gerisi için gerek yok.

Derleme işlemini ben yapmadım XXX_Cihan_XXX arkadaş yapmış ondan  kopyaladım. İlkyorumumda bu yazıyor. İşlemci ismini ondan alırsın.

Asm'yi engelledim çünkü ben C ile asm karşılaştırması yapmadım sadece C bilen ile (asm+C) bilen karşılaştırması yaptım. Yani C'ye asm mantığı ile yaklaşmaktan yoksa asm komutları kullanmaktan değil. Asm kod kullanacaksan C'nin özelliği kaybolur, taşınabilirlik özelliği, ozaman bu kodlar hiç bir işime yaramaz, aynı işlem için 8bite ayrı, 16bite ayrı, 32bite ayrı kod mu yazacağız yani?
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 18:59:08
eemkutay

Projelerini ve yeteneklerini konuşmayacağız.  Programcılık illaki romu dolduran kodlar yazmak değildir. Senin uygulamaların uzun uzun kod yazmayı, benim uygulamalarım mikrosaniyelik ana döngüleri  gerektirir.

Bu durumda romu 512K olan çipi değil de 8K bilemedin 16K olanı seçer ve içine 512 Byte kod atarım geri kalanı boş kalır.  Çünkü rom uzunluğu farklı, işlemcinin bit uzunluğu farklı konulardır. Kodun kısaysa işlemcin de 8 bit olmalı denilemez. Zira hızlı kod, ya hızlı işlemcide yada bit uzunluğu yüksek işlemcide koşturulabilir. Hala yavaş kalıyorsa hızlı ve bit uzunluğu yüksek işlemcide. Oda olmadı donanımda. Eğer 16 yada 32 bit işlemcileri 16...512 K kod alanından dolayı seçiyorsan yanlış yapıyorsun.

C yi bilenlerin yazdığı kod dediğin örneği acemiler yazar.
Tabiki, burada çarpma uğruna yapılan matematik oyundan bahsetmiyorum.

Eğer amaç kod uzunluğunu yada işlem sürelerini düşürmekse o zaman  taşınabilirlik uğruna ASM kullanım özgürlüğü kısıtlanamaz.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 20:08:37
Neyse devam edelim.

C guzeldir, anlasilirdir, tasinabilirdir.

ASM hamalliktir, anlasilirligi zordur fakat hiz isteyen uygulamalarda vazgecilmezdir.

ASM kodlamada sinir yoktur. C de sinirlar getirilir.

Iste en buyuk fark buradadir.

Her ne kadar GOTO varmis gibi soylense de aslinda elinizden alinmistir.
C de bu komutu kullanmayin derler. Halbuki C library icindeki asm kodda catir catir kullanilmistir. Cunku bu yasak asm ye değil C kullanicisinadir.

ornegin


... fonk1()
{
  ....
  ....
  goto Aradan_gir
 .....

}

.... fonk2()
{
  ....
  ....
Aradan_gir:
 .....

}

yapamazsiniz.

Halbuki asm yazimda boyle bir yasak yoktur ve bu yazim ciddi  kod kisaltmalari minik hiz arttirimlari yapar.

Macrolar microlardan olusur.

ASM icinde


           CALL  XXX
            ......

XXX:      ........
            ........
            POP AX
            JMP YALLAH


diyebilirsiniz.

C de bunlar denenirse kaza yapilir.

Bunlar asmde tehlikeli oyunlardir. Fakat Hiz zaten tehlikelidir.

C ye anlasilir, gorselligi cok iyi ASM yazimdir diyebiliriz. Cunku ASM ye cok yakindir. Sadece yaziminiza bazi sinirlamalar getirir.

Gerci benzer sinirlar Procedure  tarzi asm yazimda da karsimiza cikar.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 08 Aralık 2009, 20:46:15
@z,
evet anlaşılması gereken konulara değinmişsin,Son karşılaştırmanıza katılıyorum.
Kendi düşüncem olarak C + ASM kullanılması verimlilik ve sonuç açısından güzel olacağı düşüncesindeyim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 22:25:49
Hiz hiz diyoruz da bunun bir adi sani tanimi olmali.

Yavas islemler.
Hizli islemler.
Cok hizli islemler.
Hiz limitindeki islemler diye kendimizce bir siniflandirma yapalim.

Belli bir zaman diliminde muhakkak tamamlanmasi gerekirken, acil kesmelere de bu arada cevap verilmesi gereken isler hizli islemlerdir.

Ornegin donanim kaynaklarinin neredeyse tamaminin aktif oldugu, interruptlarin havada ucustugu, bekletilmemesi gereken kesmelerin muhakkak cevaplandigi, bekletilebilir kesmelerin ilk firsatta cevaplanmak uzere pas gecildigi uygulamalari gosterebiliriz. Bu uygulamalarda islemcimizin tum isleri tamamlayip aylak kaldigi is olsa da yapsam dedigi zaman araliklari mevcuttur.

Kisaca 40 tilkinin 40nin da kuyruklarini birbirine deydirmeden kucucuk odada dolastirildigi uygulamalardir.

Bu hizin altindaki uygulamalarda islerin aheste aheste yurudugu, kodlar arasina bolca gecikmelerin konulabildigi uygulamalara yavas islemler diyebiliriz. Bu uygulamalari asm ile yazmanin hemen hemen hic bir mantigi yoktur.

Ornek vermek gerekirse sirali otomasyon isleri.  Bol grafikli gorsel programlar. Uzaktan kumanda uygulamalari gibi.

Yogun islem gerektiren bilimsel hesap makinesi uygulamasi bile bu yavas sinifa sokulabilir.

Eger hizli islemler yukaridaki tilki uygulamalari ise cok hizli ve hiz limitindeki uygulamalar neler olabilir?

Bunlari da sonra ele alalim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 08 Aralık 2009, 22:34:54
Alıntı yapılan: "z"eemkutay

Projelerini ve yeteneklerini konuşmayacağız.  Programcılık illaki romu dolduran kodlar yazmak değildir. Senin uygulamaların uzun uzun kod yazmayı, benim uygulamalarım mikrosaniyelik ana döngüleri  gerektirir.

Bu durumda romu 512K olan çipi değil de 8K bilemedin 16K olanı seçer ve içine 512 Byte kod atarım geri kalanı boş kalır.  Çünkü rom uzunluğu farklı, işlemcinin bit uzunluğu farklı konulardır. Kodun kısaysa işlemcin de 8 bit olmalı denilemez. Zira hızlı kod, ya hızlı işlemcide yada bit uzunluğu yüksek işlemcide koşturulabilir. Hala yavaş kalıyorsa hızlı ve bit uzunluğu yüksek işlemcide. Oda olmadı donanımda. Eğer 16 yada 32 bit işlemcileri 16...512 K kod alanından dolayı seçiyorsan yanlış yapıyorsun.

C yi bilenlerin yazdığı kod dediğin örneği acemiler yazar.
Tabiki, burada çarpma uğruna yapılan matematik oyundan bahsetmiyorum.

Eğer amaç kod uzunluğunu yada işlem sürelerini düşürmekse o zaman  taşınabilirlik uğruna ASM kullanım özgürlüğü kısıtlanamaz.

Orada anlattıklarımı sen anlamamışsın ama mutlaka anlayanlar çıkacaktır, yolun açık olsun
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 08 Aralık 2009, 22:44:07
Anlat o zaman.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 09 Aralık 2009, 01:51:46
Alıntı yapılan: "z"Neyse devam edelim.

C guzeldir, anlasilirdir, tasinabilirdir.

ASM hamalliktir, anlasilirligi zordur fakat hiz isteyen uygulamalarda vazgecilmezdir.

ASM kodlamada sinir yoktur. C de sinirlar getirilir.

Iste en buyuk fark buradadir.

Her ne kadar GOTO varmis gibi soylense de aslinda elinizden alinmistir.
C de bu komutu kullanmayin derler. Halbuki C library icindeki asm kodda catir catir kullanilmistir. Cunku bu yasak asm ye değil C kullanicisinadir.

ornegin


... fonk1()
{
  ....
  ....
  goto Aradan_gir
 .....

}

.... fonk2()
{
  ....
  ....
Aradan_gir:
 .....

}

yapamazsiniz.

Halbuki asm yazimda boyle bir yasak yoktur ve bu yazim ciddi  kod kisaltmalari minik hiz arttirimlari yapar.

Macrolar microlardan olusur.

ASM icinde


           CALL  XXX
            ......

XXX:      ........
            ........
            POP AX
            JMP YALLAH


diyebilirsiniz.

C de bunlar denenirse kaza yapilir.

Bunlar asmde tehlikeli oyunlardir. Fakat Hiz zaten tehlikelidir.

C ye anlasilir, gorselligi cok iyi ASM yazimdir diyebiliriz. Cunku ASM ye cok yakindir. Sadece yaziminiza bazi sinirlamalar getirir.

Gerci benzer sinirlar Procedure  tarzi asm yazimda da karsimiza cikar.

Bu zaviyeden yaklaışrsan armutta da karpuz tadı yoktur. Örenkte verdiğin yöntem c dilinin doğasına aykırı henüz c dili ile ciddi uygulamalar geliştirmediyseniz lütfen kodunuzu gözden geçiriniz. C dilinde global ve local alanlar mevcut bu da programcıya büyük kolaylıklar sağlar siz örneğinizde bir local alandan diğerine ulaşmaya çalışıyor ve bunu yaparken local alanlarda kullanılan bir komut olan goto ile çalışıyorsunuz sorun asıl bu anlayışın ta kendisidir. C dilinde asm de olduğu gibi her satırın kesin bir numarası yoktur bu goto değimi bu yüzden çalışmaz c de herşey değişkenler ve fonksiyonlar üzerinden yürütülür. Hep, asm nin üstün olduğunu ve gizli özellikleri olan bir mitoloji dili olduğunu savunuyorsunuz fakat c zaten asmyi son hadde kullanır. Ayrıca c dilinin sağladığı milyon kolaylık yanısır pointer kavramını inceleyiniz derim asm bunu yapmak ne mümkün demiyeceğim fakat 30 kat fazla çalışmak ne mantıklı derim. Son olarak üzerine yüzlerce makale yazılan "readability" kavramına değinmek isterim türkçe karşılığı okunabilirlik olan bu kavram yazılan kodun ne kadar anlaşılabileceği ne kadar düzenlenebileceği gerekirse bakım onarım debug işlemleri hızı ile ilgilidir. 50000 satır asm kodunda debug yapmaktansa mikrobiyoloji okurum kafam rahat olur :) .

Sonuc olarak amacımız spor yapmak ise buyrun asm ile kafa kırınız fakat profesyonal uygulamar yapmak isterseniz c ,c++, c# konularında yardım edebilirim.

Bazı arkadaşlar demişlerki windowsun arka planında çalışan sözde prof uygulamalar asm ile iş yaparlarmış yok artık. Seri porta ulaşmak için asm lazım mış yok devenin sağ kulağı seri porta veri yazma işlemi aslında tamamen pc'nin veri yolunda adres ve ve veri bilgisini yazmaktır o kadar yani pic te portb=22 gibi bişi tabi hangi adres sorusu gelirse cevap serial port driver inf file. Windows asm ile yazıldı diyen arkadaşlara da linux os sinin(ücretsiz) kaynak kodlarını indirerek kodlarının c++ ile yazıldığını hatta gcc (ücretsiz) ile derlendiğini görerek işin doğrusunu kapabilirler.

C yavaş tır diyen ve otomobil örneği verenler ise çok yanılmaktadırlar kod doğru yazılırsa hızlı çalışır c ye hakim biri aynı programı c de yazar ve asm den hızlı hale getirir ve klavyesine sağlık arkadaş demiş ki interruplar var artık doğru demiştir artık iş asm ile amele kodu olayından çıktı artık uygulamalar event system, multithreading software interrupt.... gibi alt yapılar üzerinde çalışmakta. Keza şu an bu yazıyı okumakta olduğunuz pc de de bir işlemci var ve c ile yazılmış bir platform üzerinde olarca kat uygulamadan sonra çalışan internet explorer yardımı ile bu siteye girmektesiniz ayrıca antivürüs , onlarca service, bir sürü os rutinleri belki winamp çalışmakta varmı bir aksilik yavaşlık felan demekki neymiş dil değil dili kullanan odakta imiş, dil araçmış isteyen istediğini kullanırmış.

Herkeze iyi geceler.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: muhittin_kaplan - 09 Aralık 2009, 02:21:42
Konu "OOP" olup olmamakta sıkışacak gibi görünüyor.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 09 Aralık 2009, 03:18:29
Birçok fikrinize katılıyorum ancak buna değil.
Alıntı yapılan: "lojikmemo1"
C yavaş tır diyen ve otomobil örneği verenler ise çok yanılmaktadırlar kod doğru yazılırsa hızlı çalışır c ye hakim biri aynı programı c de yazar ve asm den hızlı hale getirir...
Burada hızlı kod yazmak ayrı bir konudur ve dediğiniz gibi C ye hakim olmakla doğrudan alakalıdır ancak c ile asm den daha hızlı kod yazmaktan bahsedilince olay çıkmaza girer.
Çünkü C dilide derlendikten sonra nereye döner? Tabiiki asm ye.
Hal böyleyken asm den hızlı kod yazmaktan söz etmek bana göre mümkün değildir.
C dilinde yazdığım bir kodun asm karşılığını incelediğimde ben bunu asm ile kendim yazsam en az 5-10 satır daha kısa yazabileceğim rahatlıkla görebiliyorum.

Ek olarak şunada katılmıyorum.
Alıntı yapılan: "lojikmemo1"
Ayrıca c dilinin sağladığı milyon kolaylık yanısır pointer kavramını inceleyiniz derim asm bunu yapmak ne mümkün demiyeceğim fakat 30 kat fazla çalışmak ne mantıklı derim.
Asm dilinde de pointer kavramı vadır ve sandığınız kadarda zor değildir.

Burada asm ile C yi doğrudan kıyaslamak hele hele C, asm den daha hazlıdır demek mümkü değildir. Tersi söylenebilsede uzun vadeli programlarda programın şişmesinden kaynaklanan algoritma hataları asm de daha fazla baş göstereceğinden dolayı büyük çaplı asm kodlarında programcı bazlı yavaşlık durumu oluşabilir.
C nin disiplininden dolayı C de böyle bir durum daha az yaşanır ki bunlar  tabiiki doğrudan programcı ile alakalı performans durumlarıdır. Buradan C, asm den daha hızlıdır sonucu çıkarılamaz.
Çünkü bu bir mantık hatası olur zira yazdığımız C kodu belirli bir kalıplar içersinde asm ye çevriliyordur. Biz bu kodu doğrudan asm ile hiç bir kalıba girmeden yazabiliyorsak Ancak asm, C den daha hızlı olabilir diyebiliriz.

Kişisel görüşüm bu nedenlerden dolayı asm yi iyi bilmek ve C yi bu şekilde kullanmaktan yanadır. Hatta hassas işlemleri doğrudan asm ile yapmak şüphesiz hız açısından oldukça faydalı olacaktır.
Onun dışıda C nin bütün niğmetlerinden faydalanmak gerekir elbette.
Sizinde dediğiniz gbi artık oturup sayfalarca asm kodu yazmak işkenceden başka birşey değildir. C nin disiplini, okunabilirliği, taşınabilirliği, güçlü mimari yapısı ve mükemmel kütaphanesini doyasıya kullanmak ve hız konusunda C nin sınırlarını aşmak istediğimiz nokalarda da asm nin tadını çıkarmak bana göre mükemmel olacaktır
 :)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 09 Aralık 2009, 03:56:11
Alıntı yapılan: "XX_CİHAN_XX"Birçok fikrinize katılıyorum ancak buna değil.
Alıntı yapılan: "lojikmemo1"
C yavaş tır diyen ve otomobil örneği verenler ise çok yanılmaktadırlar kod doğru yazılırsa hızlı çalışır c ye hakim biri aynı programı c de yazar ve asm den hızlı hale getirir...
Burada hızlı kod yazmak ayrı bir konudur ve dediğiniz gibi C ye hakim olmakla doğrudan alakalıdır ancak c ile asm den daha hızlı kod yazmaktan bahsedilince olay çıkmaza girer.
Çünkü C dilide derlendikten sonra nereye döner? Tabiiki asm ye.
Hal böyleyken asm den hızlı kod yazmaktan söz etmek bana göre mümkün değildir.
C dilinde yazdığım bir kodun asm karşılığını incelediğimde ben bunu asm ile kendim yazsam en az 5-10 satır daha kısa yazabileceğim rahatlıkla görebiliyorum.

Ek olarak şunada katılmıyorum.
Alıntı yapılan: "lojikmemo1"
Ayrıca c dilinin sağladığı milyon kolaylık yanısır pointer kavramını inceleyiniz derim asm bunu yapmak ne mümkün demiyeceğim fakat 30 kat fazla çalışmak ne mantıklı derim.
Asm dilinde de pointer kavramı vadır ve sandığınız kadarda zor değildir.

Burada asm ile C yi doğrudan kıyaslamak hele hele C, asm den daha hazlıdır demek mümkü değildir. Tersi söylenebilsede uzun vadeli programlarda programın şişmesinden kaynaklanan algoritma hataları asm de daha fazla baş göstereceğinden dolayı büyük çaplı asm kodlarında programcı bazlı yavaşlık durumu oluşabilir.
C nin disiplininden dolayı C de böyle bir durum daha az yaşanır ki bunlar  tabiiki doğrudan programcı ile alakalı performans durumlarıdır. Buradan C, asm den daha hızlıdır sonucu çıkarılamaz.
Çünkü bu bir mantık hatası olur zira yazdığımız C kodu belirli bir kalıplar içersinde asm ye çevriliyordur. Biz bu kodu doğrudan asm ile hiç bir kalıba girmeden yazabiliyorsak Ancak asm, C den daha hızlı olabilir diyebiliriz.

Kişisel görüşüm bu nedenlerden dolayı asm yi iyi bilmek ve C yi bu şekilde kullanmaktan yanadır. Hatta hassas işlemleri doğrudan asm ile yapmak şüphesiz hız açısından oldukça faydalı olacaktır.
Onun dışıda C nin bütün niğmetlerinden faydalanmak gerekir elbette.
Sizinde dediğiniz gbi artık oturup sayfalarca asm kodu yazmak işkenceden başka birşey değildir. C nin disiplini, okunabilirliği, taşınabilirliği, güçlü mimari yapısı ve mükemmel kütaphanesini doyasıya kullanmak ve hız konusunda C nin sınırlarını aşmak istediğimiz nokalarda da asm nin tadını çıkarmak bana göre mükemmel olacaktır
 :)


ilk olarak sanılanın aksine c kodu derlenince asmye dönme zorumluluğu yoktur istenirse derleyici (tabi bu derleyiciyi üreten firmaya göre değişir) asm çıktısı verebilir. Aslında executable yada hex dosyaları decopile edilince zaten asm çıktısına ulşılır bu dediği .net için geçerli değildir .net kendine özgü asm çıktısı üretir ve hiç bir zaman .net derleyicisi çıktıları olan exeler exe değildir bunları run time de jit derler falan falan.

ikincisi c tabikide hızlıdır sebebi ise şudur. Bir proje yapılmaya başladndığında kullanılan programlama diline göre kurulan algoritma basitleşebilir ve daha kolay bir kod ile yapılabilinmesi akıledilebilir yani algoritma gelişebilir sonuçta asm de olmayan hazır kütüphaneleri yazmak yada düzenlemek için harcanan zaman algoritma üzerinde harcanır ve daha zekice bir program yazılabilir kastedilen budur. Pointer meselesi asmde var denmiş zaten orada olmasa c de hiç olmaz fakat kullanımı tabikide zor olacaktır normal bir pointer belki kolaydır fakat pointer pointers pointer işlemi için 3 boyutlu düşünmek asm dili ile biraz zulumdür.
bunlara ek olarak dizi işleme fonksiyonel programlama global ve local değişken ve alanlar bitwise ve bytewise oparatörleri biraz üst seviyeye çıkarsak oop de bulunana method namespace class miraslık kod gizliliği falan gibi liste uzar.. bu gibi yüksek işlemleri için tek satır asm koduna gerek yoktur zaten bir çok proglama dilinde de yasak sayılır. sayılır dedim sebebi şudur mesela .net platformunda yönetilmeyen kodlarda kullanılabilir fakat bu tavsiye edilmez bu tür kodlar hafızanın herhangi bir bölgesine .net in katı kurallarını kullanmadan erişip bazı manyaklıklar yapabilirler (dizi sonunda ramdan taşma) ayrıca bu kodlar .net in çöp toplayıcısı niğmetinden de yoksundur bu tip dez avantajların olduğu kodlama türü olan unmanaged kodda asm kullanılabilir artık ne yapılacak ise fakat görüldüğü üzere astarı yüzünden pahalı olmaktadır. şunuda açıklamdan geçemeyeceğim yüksek seviyeli dillerde kesinlikle koda dayalı bir hız söz konusu değildir yani kod işleme sistemine göre bir hız olsa idi her program her bilgisyarda değişik hızda açılır kapanır örneğin photoshop açılırken gösterilen splash ekranı bir pcde 3 saniye diğer pcnin işlemcisi hızlı olduğu için 1 saniye gösterilir ve gerzek bir durum ortaya çıkardı. Aslında herkezin bildiği batak oyunu vb6 ile yazılmış onu kodlaya arkadaş muhtemelen kart dağıtılırken gecikme işlemini Stimer yerine kod ile yapmıştı zira yukarıda bahsettiğim gibi farklı pc lerde farklı hızlarda çalışmakta idi.
Kısace günümüz koşullarında asm kullanımı önmüştür (elektornikte halen yoğun bakımda diyelim) hele pc de bu iş milyonda bir durumunda gibidir o birlik rakamda zaruretten değil programcının tercihidir dediğim gibi bu tip uygulamalarda tüm zamanlamalar HWtimer ve SWtimer ler iş kanalları ve parçacıkları nam-ı diğer threats, servisler ve tabi bunların sonucu olan event sistemi üzerine kuruludur. Siz hiç pc kodunda delay fonksiyonu gördünüzmü göremezsiniz çünki pc de herşey bu even system üzerine kuruludur tıpkı insanlar gibi etki tepki olgusu vardır butona dokunursunuz pencere çıkar hatta cd yi takınca otomatik çalışsın diye autorun.inf yazarız çünki her şeyin bir tetiklemesi lazımdır.

Son sözüm hala asmnin tartışılması beni hen güldürdü hem üzdü bugün bunu yerine keçke oop olan c# .net tartışılsa hafızayönetimi veya donanımsan işlemler üzerine sorular sorulsa keşke.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 09 Aralık 2009, 09:53:44
C nin disiplinli bir dil oldugunu vurgulamistim. Ardindan C de yapilamayacak yasak islemlerden de bahsettim.

ASM de bu tur sinirlarin olmadigini soylemem suc sa kusura bakmayasin.

Global ve lokal degiskenlerin bir arada islendigi fonksiyondan bir baska fonksiyona ara kacis yapma sansim varsa bu bana o kodlamamda avantaj saglayacaksa ayagima gelen bu sansi geri cevirmem ve asm de ben ziplarim.

Call ettigim yeni satirda isim bittiginde isime geliyorsa cagrildigim yere geri donmem kendime yeni bir hedef kod belirlerim.

Bunlar asmnin ozgurlukleridir.

Bunlarin getirisi nedir dersen bunlari zekanla kendin goreceksin.

Bana uzun uzun kodlama gerektiren uygulamalara ciddi uygulama yada profesyonel calisma demeyin.

Elbezi de, kazak da orgudur. Fakat minicik bir dantel senin kocaman ceketinden daha profesyonel daha ciddi olabilir.

Bana C# yada PC uygulamalarini ornek gosterirseniz ben de size gulerim.

Biz mikrolarda kod gelistiriyoruz. Eger 32 bit mikro ile elektronikcilik amaci disinda kod gelistiriyorsaniz o uygulamanin benim gozumde degeri yoktur.

Aynen cep telefonunda ses iletimi, IRDA vs disinda kalan uygulamalar gibi.

Cep telefonu elektronik bir cihaz olsada elektronikciyi ilgilendiren kismi artik azinliktadir. Asil kodlama bilgisayar yazilimcilarinin alanina girmektedir.

Ben hic bir zaman bilgisayar yazilimcisinin yapacagi kodlamalari asm ile yazmali onlari hizlandirmali demem.

Bizim derdimiz elektronik devre yazilimi. Bu noktaya odaklanin. Yoksa armutta karpuz tadini arayan siz olursunuz.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 09 Aralık 2009, 10:13:34
C ve asm ile yapilan kodlamayi tuglalarla yapilan duvar orme calismasina benzetebiliriz.

C nin elinde buyuk buyuk tuglalar vardir. Asm nin elinde kum taneleri.

C duvari bir koseden baslayip diger koseye kadar cok hizli doser.

Eger satir satir ASM ile kodlayan bu duvari dosuyorsa isi gercekten cok zordur. Kan ter icinde kalir.

Ama tam duvarin bitimi olan kose var ya o kose, C orda cuvallar. Elindeki tuglalar kose icin fazla buyuk kalmistir. Orda atin ...ne kelebek kondurur.

Ama asm nakis isler gibi gec de olsa o koseyi sanatci edasiyla orer ve duvari bitirir.

Gercekte C ile duvari orup karsimiza cikan koseleri asm ile yamamak isin dogrusudur.

Buradaki duvarin PC lerdeki gibi buyuk duvar olmadigini tekrar vurgulayayim.

Bu ornege de soz soyleyecekseniz benim C asm konusunda yazmama gerek kalmaz.

Kaldiki ben C yi basindan beri kotuleyen taraf olmadim. ASM yi de yuceltmedim.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 09 Aralık 2009, 10:24:57
Asm'de uzman biri C'den daha az asm komut çıktısı veren program yazar. Dolayısıyla asm C'den hızlıdır ama bu göreceli kavramdır, asm'de uzman kişiden bahsettim.

Asm'de uzman olmayan, orta halli bilgiye sahip kişiye göre ansi C derleyicileri daha az asm komutlarıyla program yazabilir. Özellikle matematiksel işlemlerde veya pointer gerektiren durumlarda. Çünkü C derleyicilerinin asm macrolarını yazan veya hazırlayan adamlarda asm'de çok uzmanlaşmış insanlardır.

Benim fikrim ise, asm'ye en yakın olan C'yi kullanmak yani C'yi öyle kullanacaksınız ki backround'unda hangi asm komutlarını attığını biliyormuş gibi. Ama mecbur kalmadıkça asm kullanmamak, sadece kritik yerlerde kullanılabilir.

Yukarıda basit bir örnek verdim. Bunun nasıl yapılacağı hakkında.

X=Y*15;        // burada herşeyi C derleyicisi yapar,
X=(Y<<4)-Y; // Burada ise  C derleyicisine ne yapması gerektiğini sen
                   // söylersin


Bu yapıya asm sadeliğinde C denir. Bu sadece bir örnek, öğrenmek isteyenler için, asm'den C'ye geçecekler için fikir olsun diye.

Kutay
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: XX_CİHAN_XX - 09 Aralık 2009, 11:07:37
@z hocam çok güzel izah etmişsiniz durumu. Kesinlikle katılıyorum.
@eemkutay hocam sizede aynı şekilde katılmaktayım. Bende asm de C ye geçmiş birisiyim ve çoğu zaman dediğiniz gibi asm sadeliğinde kod yazmaya çalışıyorum ve üretilen asm kodlarınıda sürekli inceleyip ne şekilde kod ürettiğini iyice kavramaya çalışıyorum. Bu bana neredeyse asm sadeliğinde kod yazma imkanı sağlıyor gerçekten.
Yine dediğiniz gibi tuğlanın büyük kaldığı noktaları kumla doldurmam gereken yerlerde de asm ye geçip işimi görüyüyorum.

Şu konuda da haklısınız taşınabilirlik ve okunabilirlik açısından mümkün olduğunca az asm kullanmak gerekir. Ama asm nin zorunluğu olduğu yerlerde de kullanmaktan kaçınmamak gerekir diye düşünüyorum.
Bu sayede asm sadeliğinde, kaliteli ve hızlı bir kod üretebiliyoruz.

@lojikmemo1 hocam, @z hocam çok güzel söylemek istediklerimi izah etmiş hep PC tabanlı örnekler vermişsiniz oysaki burada konuşulan C nin hedefi mikrolar içindir. Biz duvar örmekten bahsederkin siz saray yapmaktan bahsetmişsiniz :)

Saygılar, sevgiler.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 09 Aralık 2009, 12:27:47
Zaman zaman gecmis yazilara bakip acaba hatali bir sey mi yazmisim, neden ustume gelinmis yada neden birilerinin ustune gitmisin diye konulari tekrar tekrar okurum.

Birbirimizle yuz yuze gelmeden yazi dilinde tartismak gercekten zordur.

Arkadaslardan birisi demiski;

C dilinde asm de olduğu gibi her satırın kesin bir numarası yoktur bu goto değimi bu yüzden çalışmaz c de herşey değişkenler ve fonksiyonlar üzerinden yürütülür.

Adresleme etiketlerinin kesin degerleri derleme asamasinda belirlenmez.
Bu Cde de asmde de boyledir. Kesin degerler birlestirme asamasinda yapilir ki bu bizi baglamiyor.

C de her satirin kesin bir numarasi yoktur cok yanlis bir iddiadir. Her bir komutun her bir verinin yerlestigi yerin kesin ve kesin bagil degeri bellidir ve  bir sonraki asama olan birlestirme asamasina bu degerler referans edilir.

Goto ile gezinmek C de tehlikelidir. Cunku goto pek ala stacka atilmis verileri staktan cekmeden ezik gezinmelere neden olabilir. Eger C nin altinda hangi kodlamanin yapildigini bilmiyorsaniz goto komutu kaza yapmakla es anlamlidir ve bu nedenle kullanilamaz.

Halbuki asm de gerekirse staga veriler atilip sonrada ret komutu ile gezinilebilir.

Bu tur numaralara ihtiyac duyup duymamak ilgi alaniniza bagli.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 09 Aralık 2009, 23:29:15
Alıntı yapılan: "z"Zaman zaman gecmis yazilara bakip acaba hatali bir sey mi yazmisim, neden ustume gelinmis yada neden birilerinin ustune gitmisin diye konulari tekrar tekrar okurum.

Birbirimizle yuz yuze gelmeden yazi dilinde tartismak gercekten zordur.

Arkadaslardan birisi demiski;

C dilinde asm de olduğu gibi her satırın kesin bir numarası yoktur bu goto değimi bu yüzden çalışmaz c de herşey değişkenler ve fonksiyonlar üzerinden yürütülür.

Adresleme etiketlerinin kesin degerleri derleme asamasinda belirlenmez.
Bu Cde de asmde de boyledir. Kesin degerler birlestirme asamasinda yapilir ki bu bizi baglamiyor.

C de her satirin kesin bir numarasi yoktur cok yanlis bir iddiadir. Her bir komutun her bir verinin yerlestigi yerin kesin ve kesin bagil degeri bellidir ve  bir sonraki asama olan birlestirme asamasina bu degerler referans edilir.

Goto ile gezinmek C de tehlikelidir. Cunku goto pek ala stacka atilmis verileri staktan cekmeden ezik gezinmelere neden olabilir. Eger C nin altinda hangi kodlamanin yapildigini bilmiyorsaniz goto komutu kaza yapmakla es anlamlidir ve bu nedenle kullanilamaz.

Halbuki asm de gerekirse staga veriler atilip sonrada ret komutu ile gezinilebilir.

Bu tur numaralara ihtiyac duyup duymamak ilgi alaniniza bagli.

Her eleştiriyi kendinize hakaret sayacaksanız konu açmayın diyebilirmiyim:)

Cde satır numarsı yoktur tabiki aslında bu durum oop nin temelleri sayılır ama bakınız eski bir dil olan qbasic de vardır yanlış hatırlamıyorsam goto line komutu kullanabilmektedir ama gelin görünki qbasic artık işe yaramıyor.

Size katılmadığım noktalardan biri de asm de stack üzerinde işlem yapmanın kolay olduğu gibi bir yanılgıya düşmenizdir. asmnin eriştiği her bölgeye c de erişir zaten öyle olmasa dünya kadar insan bu dili kullanmaz. Ayrıca madem c bu kadar eksik (sizin tabiriniz) neden bu kadar kullanıcı sı var ve çok ileri projeler üretilebiliyor acaba?
Siz çok dar alanda asm kullanabilirsiniz ama c hakimiyeti olan herkez PHP,JAVA,C,C++, belki Pascal ile uygulama yapmak için çok çok 2 hafta uğarşır. Amacımız biz elektonikçiyiz sadece mikro programlar geçeriz mantığından kurtulmak lazım biz komple sisteme çözüm getiremeyeceksek zaten her zaman bişiler yarım kalır kanısındayım. Açıklık getirelim isterseniz mesela bir ethernet uygulaması yaptınız pcye bağladınız işiniz bitti mi ? ağ ayarlırın ayarlamaktan tutun modem switch gibi ekipmanları kurmaya kadar bir sürü kurulum vardır bunlar için bilgisayar servisi mi çağırıyorsunuz ki ben sadece mikro programlar geçerim diyebiliyorsanız daha detaya inelim mesela ethernet uygulamasında sıcaklık bilgisini ekrana (iexplorer sayfasına) 5 saniyede bir basmanız icab etmekte ne yapacaksınız etherneti kontrol eden mikro içine javascript komutlarını string olarak gömmeyecemisiniz bitmedi ayrıca javasicript server varible hakkında da bilgi sahibi olmanız gerekecek bunlar pc programcısını işi derseniz zaten size de gerek yok zira bu projede ne yaptınız sorunun cevapı çok minik olacaktır.
Kısace artık bir sürü teknoloji birbirine girdi iyi de oldu fakat hala asm de asm diye tutturmanın manası yok. asm düşmanı değilim sonuçta asmye en yakın dili kullanmaktayız fakat artık asm nin hantallığını kaldıracak bir ortam yok. 2 yıl önce yazdığım (özel bir firma için) kayan yazı uygulamasıdan abartmıyorum 5,200 satır c kodu vardı asm çıktısı ise 30,000 satır bittiğinde bir çok değişikli gerketi kolayca yaptık ama c dosyasının bile yüzünü görmek istemezken asm dosyası açıp düzenleme yapmak zulumden başka nedir. Bir ara kendi c derleyicimi yazmaya çalışıyordum (pic mikro için) onu da c ile yazmaya başlamıştım c ile birnoktaya gelmişti hatta üniversite yıllarında PLC tasrlayıp minik bir bölümünü çalıştımayı başarmıştım bunun bilgisayar ve mikro tarafını da c ile yazmıştık daha neler neler.
Neyse burda  ... yarışına girmek manasız ben kendi bakışaçımdan arkadaşlara özellikle yeni arkadaşlar tavsiyeler de bulunmak istedim yani amacım son derece pozitif idi kimseyi kırmak değildi.
İsteyen istediği ile yapsın fakat kullanıcı ürünün kalitesine bakar gerisi onu bağlamaz.

Hayırlı geceler.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 10 Aralık 2009, 01:43:12
ASM de stack uzerinde oynamanin nesi zor anlamadim. Haa dersenizki bana PIC 16 serisinde oyna kolaysa C de sen oyna derim.

C de, bir zamanlarin basic dilinde oldugu gibi satir numarasi yoktur ama Goto ile dallanacagin noktaya label verdiginde artik bir satir numaran vardir.  O da o etiketin adres degeridir.

Boyle bir numara yok bu nedenle goto kullanilmaz demene cevap yazmistim.

Cunku aynen soyle dedin.

Alıntı YapC dilinde asm de olduğu gibi her satırın kesin bir numarası yoktur bu goto değimi bu yüzden çalışmaz c de herşey değişkenler ve fonksiyonlar üzerinden yürütülür.

Network vs vs kismindaki yazdiklarin bizi konumuzdan uzaklastiran yeni durumlar. Daha onceki yazinda PC deki yazilimlarini ornek vermen uzerine PC yazilimlari ile ilgilenmiyor microlarla ilgileniyoruz cevabini verdik.

C ile compiler yazmaya calismissin. Ona kalirsa bende asm ile simulator yazdim. Benim yazilim da 64K lik bir com dosya oldu.

ASM adamina gore zor yada kolaydir. Burada sozu edilen adam CPU dur.

Eger hizla ilgili bir sikintin oldugunda islemci degistirmek icin cok gec kaldiysan forumda danis mevcut C kodlarina asm eklemende seve seve yardimci oluruz ve %99 ihtimalle hiz sorununu cozeriz.

Benim asm ile isim olmaz diyorsan o zaman buradaki tartisma ile isin olmamali.  Bir baska baslik altinda asm icermiyen C konusu acarsan orada C uzerine diledigin konulari tartisiriz. Ama bu baslik altinda değil.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 10 Aralık 2009, 12:20:38
PIC32 işlemcisine C32 derleyicisi varken neden ASM ile program yazılır.
Ve bir avantajı varmıdır?

Günümüzde bir avantajı olacağını sanmam.

Bu işlemciyi nasıl olsa C32 üzerinden programı yazıp derliyoruz diye herşeyide hazır C32 fonksiyonları ile halldelim demek de hatalı olur.

İşlemcinin register ve konfigürasyon ayarlarına hakim olmak gerekir.
Bunları hazır C32 fonksiyonları ile yazıp geçmek işin kolayına kaçmak ve bir sorunla karşılaştığımızda suçu C32 ye atmak olur.

goto benzeri fonksiyon içi ve fonksiyon dışı herhangibir yere dallanma komutlarının C içinde olması demek onları kullanabiliriz manasında değildir.Bu komut kullanılarak yazılmış bir C kodunu derleyip ASM karşılığına baktınızmı hiç.

Bence endüstriyel mikro işlemcide C üzerinden programlamada goto dallanma komutu kullanımı büyük bir hatadır.

Ve kullananın C bilgisin yeterliliğinden şüphe ederim.

Kullandığı mikro işlemcinin Interrutlarının ve işe özel modüllerinin kullanımından bi haberdar olup kılasik eski mantıkla dijital değerlendirme ve bekletmelerle iş yapanında vede komut gecikmelerini hala hesaplamaya çalışanında günümüzde hem C hemde mikro işlemci bilgisinden şüphe ederim.

Elimizde nasıl olsa C var diye düşünür ve işi pro basic ve paskal derleyicisi mantığında kullanırsak büyük hatalar yaparız belki bu hatalar çok büyük olamaz ama hata hata dır ve göz göre göre yapılmaz.

nasıl olsa C derleyicisi kodları ASM ye dönüştürüp işlemciye atıyor diye düşünmekde bu yönden ASM yi olmazsa olmaz bir temelmiş gibi görmekde anlamsız o zaman ASM ninde altı dönüştürülüyor ve işlemciye öyle atılıyor derler bazen.

kolay kullanılabilirliği açısından insana yakın ve uzak olan programlama dillerinden bahsedilir burda C insana yakınlıkda ASM nin hemen üzerinde daha yakın olarak gösterilir.ama C ilede ASM nin etkinliğinde hızında seri işleyen işlemcinin mimarisine en uygun kodların yazımıda mümkün olsun diye mikro işlemci programlamada C var ve iyiki var olmasa ne yapardık veya en azından kendi adıma ne yapardım.

yine söylüyorum C ile ASM den daha etkin kod yazımı onu kişnetene bağlıdır.

nasıl olsa programı C ile yazıyorum diye işin cıvığını çıkarmaya da gerek yok her şeyi ve her yan donanımın kullanımını hazır C fonksiyonlarının argümanları üzerinden ve yapılan işe gereksiz kütüphane dosyaları ile kotarmak abeste iştigaldir.bunu yapanlar C ile programlar yazıp çiziyorum deme rahatlığından da bi haberdardır.git pro basic ve paskalla
yaz daha iyi.

günümüzde Microchip dsPIC ve PIC24 , yada PIC32 lere bakıldığında çok çeşitli C derleyiciler var

örneğin GCC,Hitech,Mikro C ve benzerleri bunlarla hiç Microchipin kendi C30 veya C32 derleyicilerini kıyasladınızmı?

bence en etkin olanı kendi yazdığı gibi geliyor her şeyi hazır sunmayıp ASM karşılığında C kodları kullanımını öngörüyor ve yönlendiriyor diğerlerinde her şey hazır hele GCC ve MikroC gibi özel derleyiciler kestane kebap C diye bunların hazır sunduğu kütüphane ve fonksiyonları kullanıp sonra ASM ile kıyaslamaya girilirse ASM yi bilemem ama C bazında hatalar yapılmış olur düşüncesindeyim.

bunlara ben geliştirilmiş C yazım metodlu basic ve paskal derleyicileri demeyi daha uygun görüyorum.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 11 Aralık 2009, 00:38:45
Alıntı yapılan: "z"ASM de stack uzerinde oynamanin nesi zor anlamadim. Haa dersenizki bana PIC 16 serisinde oyna kolaysa C de sen oyna derim.

C de, bir zamanlarin basic dilinde oldugu gibi satir numarasi yoktur ama Goto ile dallanacagin noktaya label verdiginde artik bir satir numaran vardir.  O da o etiketin adres degeridir.

Boyle bir numara yok bu nedenle goto kullanilmaz demene cevap yazmistim.

Cunku aynen soyle dedin.

Alıntı YapC dilinde asm de olduğu gibi her satırın kesin bir numarası yoktur bu goto değimi bu yüzden çalışmaz c de herşey değişkenler ve fonksiyonlar üzerinden yürütülür.

Network vs vs kismindaki yazdiklarin bizi konumuzdan uzaklastiran yeni durumlar. Daha onceki yazinda PC deki yazilimlarini ornek vermen uzerine PC yazilimlari ile ilgilenmiyor microlarla ilgileniyoruz cevabini verdik.

C ile compiler yazmaya calismissin. Ona kalirsa bende asm ile simulator yazdim. Benim yazilim da 64K lik bir com dosya oldu.

ASM adamina gore zor yada kolaydir. Burada sozu edilen adam CPU dur.

Eger hizla ilgili bir sikintin oldugunda islemci degistirmek icin cok gec kaldiysan forumda danis mevcut C kodlarina asm eklemende seve seve yardimci oluruz ve %99 ihtimalle hiz sorununu cozeriz.

Benim asm ile isim olmaz diyorsan o zaman buradaki tartisma ile isin olmamali.  Bir baska baslik altinda asm icermiyen C konusu acarsan orada C uzerine diledigin konulari tartisiriz. Ama bu baslik altinda değil.

Eyvallah sağol ama ben asm ile de çok iyi program yazabiliyorum ayrıca şu diller de de program yazabiliyorum problem olursa bende size seve seve yardım edebilirim. Asp.net,php,asp,java,javascript,html,c,c++,visualc(ve borlandc builder), c#.net bir ara da perl pascal gibi dillerle de çalışmıştım.
Zaten c ile kod yazarken hız problemi oluyor ve sen bunu yine c ile çözemiyorsan kusura bakma sen c programcısı değil henüz sempatizanısın sayılır.
Ethernet örneği bizi konudan uzaklaştırmaz ancak senin eksikliğinin ispatı olur zira ethernet uygulamasında da pic mikro var hadi buyur yaz bakalım sadece asm ile javasicript.
Stack üzerinde oynaması zor derken kastettiğimiz bunu derleyici kontrolüne bırakmak lazım müdahaleler debug ile zor bulanabilen hatalara nadiren de olsa sorun açabilir.
Seni modası geçmi asm ve değişime kapalı kişiliğin ile başbaşa bırakıyorum iyi geceler.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: muhittin_kaplan - 11 Aralık 2009, 01:14:14
böyle iyi
bir basic ci :D (oda nasıl oluyorsa) olarak asm ile c nin birbirine girmesi iştahımı kabartıyor :S
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 11 Aralık 2009, 01:31:15
Alıntı yapılan: "muhittin_kaplan"böyle iyi
bir basic ci :D (oda nasıl oluyorsa) olarak asm ile c nin birbirine girmesi iştahımı kabartıyor :S

Benzer bir münakaşayı basicle de yapabiliriz bir ara :D:D ama basic asm kadar dayanamaz hakkını yemeyelim :)
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 11 Aralık 2009, 12:32:16
Eger hizla ciddi anlamda isimiz olmasaydi asm ye hic ama hic bulasmamiza gerek kalmaz C ile hatta asm gibi C ile tikir tikir kodlarimizi yazardik.

Butun dunyada, C  kolayliktir, hizli kodlama icin avantajdir anlasilirdir hiz gerektiginde asm ye gecmek sarttir deniyor ama bunu ben dedigimde C ustamiz (!) aksini iddia ediyor. Eminimki bir bildigi var.

Lojikmemo gercekten merak ettim. Hiz konusunda ne tip projeler yaptin da C de bu kadar kendine guveniyorsun?

Eger varsa bildigin bir seyler bize ogret ve C icinde asm yi kokten terkedelim.

Yap bize bir iyilik. Cunku asm yazim gercekten yorucu.

--------------------------

Hep hizi vurguluyor ve bunu onplana cikartmaya calisiyorum. Lakin hiz anlayislarimiz arasinda en azindan aramizda 10 kat fark var diye dusunuyorum.

Asagidaki yaziyi okuyun. Herne kadar mikrolar yerine hizin onemli oldugu dsp ler uzerine bir yazi olsa da C - asm konusunda tarafsiz bir yazi ve su ana kadar yazdiklarimla da bire bir ortusuyor.

http://dspguide.com/ch28/5.htm
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: fatihkuzucu - 11 Aralık 2009, 13:11:34
Bu konu başlıgının amacı hangisi daha iyi ve o kullanılacaksa; verdiginiz linkte c nin daha iyi oldugu teraziden ortaya cıkmıs durumda. Ama siz teraziye değil sadece sizi destekleyen cümlelere odaklanacaksanız, size ne kadar anlatılsa hiç bir işe yaramaz.
Dünyada en zor şey insanların kafasındakileri değiştirmektir.

Not= Terazideki hesap düşük maliyet için yapılmış. MCUlar arasındaki fiyat farkları cok az olduğundan daha iyi mcuya gecme daha rahat ele alınsa idi oradaki C ağırlığı cok daha fazla olurdu.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 11 Aralık 2009, 13:38:22
Koca yazidan anlaya anlaya teraziyi mi anladiniz? Onu da yanlis anlamissin.

Terazinin yanindaki yaziya gore;

C asm ye kiyasla esnek ve program gelistirme asamasi hizlidir.

Hizli kosan uygulamalarda , ASM daha iyi performans sergiler ve daha az az hafiza ister.

Sonucta da daha dusuk maliyet.

Terazi resmi, C nin Hizli gelistirme ve esneklik acisindan ASM den daha agir bastigini soyluyor, resimde ince espiri de var. Performans konusunda ASM kolu yukari cikmis.

Ben kendi isime gelen cumle yada kelimeleri secmedim.

Eger tarafsiz bir karsilastirma yerine asm ye yandas yazi secseydim vay halime.

Bu baslik altinda daha cok sey yazacaktim. Yazilarimda  ileride yazacagim diye aralara notlar dusmustum. Bunlara deginemedik.

Verdigim linkteki yazinin onunde ve arkasinda da yazilar var onlara da goz atin.

Son cumlelerim sunlar.

1) ASM ye bosu bosuna baglanmayin. Derhal C ye gecin.

2) Hiz konusunda sikintili rutinleri C ile kasmaya calismayin derhal o kisimlari inline asm ile yazin.  Ya da birlestirme asamasinda asm ile yazdiginiz obj bloklari ekleyin.

3) Tasinabilirlik zirvasina kafayi takmayin. Cunku bugune kadar zaten asm ile yaziyordunuz ve tasima derdiniz yoktu. C ile program gelistirme zamani cok azaldigi icin 10 bin satiri bile yeni bir islemci icin bir kac gunde yazarsiniz. Zaten cut copy var.

Benim gibi gelismelere kapali ve bagnaz fikirli birinin daha fazla yazmasi uyelerimize haksizlik olacak.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 11 Aralık 2009, 14:24:42
Eski bir asm'ci olarak, C içinde asm kullanılabilecek yerler:

1) delay için
2) çok dar pulsleri adc ile okumak için gerekebilir
3) matematiksel işlemler

Bu gibi durumlarda işlemci yavaşsa C içinde asm komutları kullanılabilir.
İşlemci hızlı ise timer kurarsın olur biter veya adc hızlı işlemcide hızlı olur.
STM32'de 12bit adc mesela 1us'de convert edebiliyor.

Matematiksel işlemler için ise şimdiki işlemcilerin nerdeyse hepsinde
donanımsal çarpma ve bölme yapılarına sahipler.
Yani yine programın %98'ini C oluşturur, programın performans'ını programcı tecrübesi ve derleyici kalitesi belirler.

Önemli bir konu olarak yine işlemcilerde C optimizasyonu göre işlemci dizayn ediyorlar. Picproje E-dergi 2'de dspic ile ilgili kısımda bunu açıklamıştım. Detay'lı bilgiyi oradan alabilirsiniz. Yani register yapılarını C'ye göre dizayn ediyorlar ve asm komutları C'ye uygun komutlar.  Yani üreticilerde C'yi referans alıyor.

Ayrıca C ile 1 haftada yazılacak program, asm ile 1 ayda yazılabilir. Yani C ile 4 proje bitirirken asm ile yanlızca 1 proje bitirebilir diyebiliriz. Hemde C programlarını yazan programcı (asm+C) biliyorsa ve elektronik donanım bilgisi iyiyse sırf asm ile yazan kadar az program memory kullanır.

C'de yazılacak asm sadeliğinde C programını,  microchip, atmel, renesans, ST, NXP, texas ... gibi tüm üreticilerin 8bit,16bit,32bit işlemcilerinde çok ufak değişiklerle ve yine asm ile program yazmış gibi çıktı alabilirsiniz.

Asm ile ise PIC16'da yazdığını PIC18'e bile uyduramazsın değilki diğer firmaların işlemcilerine.

KUTAY
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: azimli - 11 Aralık 2009, 14:26:17
8 bitlik bir endüstriyel mikro işlemciden bahsediyorsak yada pic serisinin 16-18F serilerinden bunlarda en yüksek hız 40MHz. komut yürütme 10Mips dir burda asm hız açısından c den iyi dir denebilir doğal olanda bu zaten bu işlemcilerin üretildiği dönemlerde bu çiplerin kullanımı asm üzerinden tasarlanmıştı sonradan c derleyicileri çıktı 18F belki c ye daha yatkın olabilir ama 16F ler zorlama ile c üzerinden programlanmaya çalışılıyor diyebilirim benim gördüğüm doğrusuyla yanlışıyla bunlar

gelelim dsPIC30F-33F ve PIC24 lere bu serilerin hızları 120 ve 160 MHz. olarak üretiliyor işlemcileri geliştirilmiş ve 16 bitlik kapasitede komut yürütme hızları 30-40 Mips genelde bölünmüş bu hız üzerinen tek saykılla bir komut işlerler

ve bu işlemcilerin üretildiği dönemde 2003 den sonrası diyebiliriz ve 2006 ya kadar geliştirildiler c ile programlam ön plana çıkarılıp c ile programlama temelleri üzerine kuruldular ama eskiden beri bir asm kullanıcısıda var hemde azımsanmayacak çokluda ne yapacak microchip firması asm desteğini kaldıracakmı hayır bu onnun için dezavantaj olur bu firmaların dini imanı para ama parayı kazanmak içinde manyak argeleri var mecbur adamlar asm desteğini devam ettirmekte

bu şuna benziyor pc lerde dos desteği dönemlerini hatırlayın dos olmadan windows olmaz hikayeleri falan hatta önce dos öğretirlerdi çok değil daha 5-6 sene öncesine kadar şimdi ne komik geliyor değilmi o kara ve mavi ekranlar noldu bu hipoteze?

aslında 8 bit ve 16 bit mikroları kendi arasında yalnızca hız açısından kıyaslamakda çok hatalı bence hız açısından 8-16 bit arasında 4 kat fark oluyor gözüksede gerçekde uygulamada bu daha fazla çıkar hız mimariler arasında yalnızca kristal darbe / komut işlem süresi ile kısıtlı değildir

bir sonraki seri 32bit PIC32 lere bakın 80MHz. ve 2 kıristal darbesiyle bir komut işletiyor ama 32 bit mamariden ve geliştirilmiş yapısından dolayı bir alt seriden daha hızlı bundada C ve C++ ile program yazımı gözetilerek geliştirilmiş bir mikro ama asm daha henüz kaldırılmış yabana atılmış değil

mplab editörünü kullananlar zannediyor c ile kod yazdığımda derlediğimde asm karşılığınıda görüyorum demek asm olmazsa olmaz yok böyle bir şey gün gelecek ara dosya çevrimi olmadan direkt hex kod dönüştürülecek asm kodlarını görmeyeceksiniz bile c den derleme ile asm kodlar gözüküyor asm vazgeçilmek demek hikaye işlemci versiyonu ve kapasitesi yükseldikçe c vazgeçilmez asm vazgeçilebilirdir.

ortalama hız kıyaslaması açısından;

16 bitlik mimarideki 33F ve 24F serisine bakalım komut yürütme hızı 40milyon/sn.

ortalama 1000 komut/satırlık bir program yazdık diyelim bir komut yürütme süresinide çok fazlasıyla 16 saykıl olarak görelim.

1000X16 = 16000 eder 40milyon/16000 = 2500 eder

demekki biz bu işlemcilere 1000 satırlık bir komut yazdığımızda ve her bir satırın 16 saykıllık bir zamanda işlendiğini düşünürsek (400 nano saniye zamanda) bizim progaramımız bir döngüde takılmıyor ve seri olarak devamlı aynı işi yapıyorsa saniyede 2500 kere bu programı işler.hız çok üst sınırlarda yani yabana taılacak tarzda değil.az muz bir hız değil yani.iş yaptırabilene artarda yeter bile.fazlasını zekat fitre sadaka olarak bile verebilir

ama siz C-C++ bilgisinden bihaberdar işlemci çalışma mantığından ve onun iç modüllerinden bi haberdarsanız işlemci modülleri ve interruptları ile işleri kotarmak yerine kılasik mantıkla nop while(1); gecik(); bekle();
komutları ile işlerinizi yapmayı planlıyor ve yürütüyorsanız bırakın 40mips hızı 140mips olsa bile yetmeyebilir.


dsPIC,PIC24 ve PIC32 den bahsediyor olsak;

C yi iyi kullanan birisi kullandığı işlemcinin özelliklerinede hakimse asm ye sıfır ihtiyaçla işlerini yapabilir.hemde asm hızıyla.belki asm kullanıcısı bırakın çabuk program yazıp geliştirmeyi vede okunabilirliği belki c kadar hızlı bir programda yazamaz.

burda kıyaslamayı asm ve c uzmanı olarak iki kişi ile yapıldığını ve işlemcinin donanımsal özelliklerine hakim olunduğu düşünülsün.

bunu bir ara denedim c de hızlı okunaklı kod yazılmasını asm ye karşı herkes kabul eder ama hızınında yüksek olduğunu kendi çapımda kanıtladım bir çok komutta c karşılığı asm dede aynı saykılı tutuyor hatta bazı kodlarda asm yi geçebiliyor.

diyelim tamam asm c den hızlı ve hızın ön plana çıktığı bir uygulama yapılıyor.işlemci zaten çok hızlı ne yapacaksınki bir bloğun %10 %15 daha hızlı çalışanını yapıpda o uygulamada çok gerek görürsen kullanırsın farklı bir donanım işin görülür

ama yok öyle hızlı olduğu falan asm nin c den daha fazla o günler geçti 2006 dan sonra üretilip geliştirilen 16 bit 30-40 mips hızlı microchip işlemcileri için bunlar direkt C30 ve C33 C24 üzerinden programlansın diye geliştirilen çipler.

80-90 komut kümeli asm yi  eski kullanıcılar alınmasın darılmasın diye koyuyorlar ne yapsın adam çipi satıp evine ekmek parası götürecek.

yarışa hazır olanlar varsa yarışalım! Microchip dsPIC30F serisi motor kontrol güç konversiyon end. mik. işlemcileri üzerinden varmısınız?

asm kullanıcısına komut kümesi 84 tür ben C30 kullanacağım.

kıyaslamayıda işi bilen form yöneticilerine ve üyelerine bırakalım.

tekrar ediyorum Microchip 16 ve 32 bit seri bir çiple program yazıp geliştiriyorsanız Microchip'in C derleyicileri olmazsa ikinci sırada HiTech'in C derleyicileri vazgeçilmez birer araçtır vede ücretsizdir.

kılasik çok özel olmayan bir kaç uygulamalardada sırf donanımsal bir çalışma gereken yerler dışında FPGA işlemcinin pabucunu dama atamaz atar diyende edebiyat yapmış olur.

FPGA ile Microchip işlemcileri kıysalanmaz daha hızlı ve 2-4 çekirdekli  
32-64 bit mikro işlemcilerde vardır FPGA bunlarla kıyaslanabilir.

FPGA denildiği kadar süper bir donanımsal yapı olsa içerisinde işletim sistemi veya bir takım uygulamaları çalıştırmak için mikro işlemci oluşturulmaz ve günümüz süper bilgisayara istemleri FPGA li olurdu.

diyorlarki çok pahalı o yüzden olmuyor her malın bir alıcısı vardır ürünü görelim para hazır ama sırf FPGA ile pc işi kotarılamıyor illa işin içine mikro işlemci yongası giriyor.

şu anda 32-64 bit tek çekirdekli bir nano saniye hızlarda komut yürüten endüstriyel mikro işlemciler var

bunların daha sonra 64 bit 4-8-16 çekirdek olacaklarını gözünüz kesiyor ve derleyici olarakda bu işlemcilerde C# öngörüldüğünü aklınız kesiyormu hızı şimdi FPGA ile kıyaslayın bakalım kapı mantığıyla silisyum germanyum teknolijisinin geldiği nokta ve bu çiplerde 1,1 volt eşik gerliminin varlığı kesin ve inilebilen minimum çip nano kalınlıkları belli daha nesi geliştirilecek FPGA lerin bir iki yeri işlemciler niye çok çekirdeğe geçti hızları daha fazla niye arttırılamadı teknolojisi müsait değilde ondan daha yüksek hız ve işlem kapasiteleri tek çekirdekle artık olmadığından dolayı.

gelecekte işlemciler çok çekirdekli ve C# derleyicili olacak ve kanımca çok çekirdekli olması programlamasını karıştırmayacak bu çekirdek iş yükü dağılımını derleyici halledecek biz yine tek çekirdek gibi 64 bit mimarisi üzerinden işlerimizi yürüteceğiz.

herkese iyi çalışmalar.

Not: Rütbe çok yazana veriliyorsa bu yazıdan sonra herhalde binbaşı olur um 4. (. 4 den sonra geliyorsa üncü diye okunur askeriyede yazman gerekir tabiki yazmassan cezası 40 katır ve sopadır) yıldızı alırsak
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: fatihkuzucu - 11 Aralık 2009, 14:52:11
Alıntı yapılan: "z"Koca yazidan anlaya anlaya teraziyi mi anladiniz? Onu da yanlis anlamissin.

Terazi tam dedigim gibi çalışıyor. Sizin bakmak istediğiniz yer farklı. Yada görmek istedikleriniz. Tüm bu yazılardan alınmış olabilirsiniz ama bazı konularda gelişmeye kapalısınız. Bu sizin araştırmacı yanınız olmadığını yada tümden yeniliklere kapalı olduğunuzu göstermez. Pek çok kişiden daha fazla araştırdığınızı görmemek için benimde gözlerimi kapalı tutuyor olmam gerekirdi...

There is also a way you can get the best of both worlds: write the program in C, but use assembly for the critical sections that must execute quickly. This is one reason that C is so popular in science and engineering. It operates as a high-level language, but also allows you to directly manipulate the hardware if you so desire.

Bu yazının özeti yukarıdaki cümlelerde var. Bunun anlamını da burada pek cok kez dile getirdiler.

eemkutay mesela güzel bir örnek (aşağıda) vermişti. Ve sürekli arada asm ile müdahalelere izin verildiğinden bahsediliyorken işi uzatmanın hiç bir anlamı yok.  Fazla iş yoksa asm ile devam edebilirsiniz. Ama işler projeler cok ise bu sekilde devam edilemez.

Alıntı yapılan: "eemkutay"

X=Y*15;        // burada herşeyi C derleyicisi yapar,
X=(Y<<4)-Y; // Burada ise  C derleyicisine ne yapması gerektiğini sen
                   // söylersin


Bu yapıya asm sadeliğinde C denir. Bu sadece bir örnek, öğrenmek isteyenler için, asm'den C'ye geçecekler için fikir olsun diye.

Kutay
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: bigbey - 11 Aralık 2009, 16:08:31
Alıntı yapılan: "z"Son cumlelerim sunlar.

1) ASM ye bosu bosuna baglanmayin. Derhal C ye gecin.

2) Hiz konusunda sikintili rutinleri C ile kasmaya calismayin derhal o kisimlari inline asm ile yazin.  Ya da birlestirme asamasinda asm ile yazdiginiz obj bloklari ekleyin.

3) Tasinabilirlik zirvasina kafayi takmayin. Cunku bugune kadar zaten asm ile yaziyordunuz ve tasima derdiniz yoktu. C ile program gelistirme zamani cok azaldigi icin 10 bin satiri bile yeni bir islemci icin bir kac gunde yazarsiniz. Zaten cut copy var.

Benim gibi gelismelere kapali ve bagnaz fikirli birinin daha fazla yazmasi uyelerimize haksizlik olacak.
Kendinize haksızlık yapmayın. İsteyen herkes fikrini burada söyleyebilir. Gayet güzel bir konu devam edip gidilsin. ne güzel tartışılıyor.
Alıntı yapılan: "eemkutay"Eski bir asm'ci olarak, C içinde asm kullanılabilecek yerler:

1) delay için
2) çok dar pulsleri adc ile okumak için gerekebilir
3) matematiksel işlemler

KUTAY
Aynı şekilde katılıyorum. Gerisi teferruat. :lol:
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 11 Aralık 2009, 22:38:31
Alıntı YapLojikmemo gercekten merak ettim. Hiz konusunda ne tip projeler yaptin da C de bu kadar kendine guveniyorsun?

Tanısan tartışmazdın :) şaka bir yana ticari açıdan açıklamama doğru değil ama emin ol asm yi bilmeme rağmen c ile çözebilmekteyim bu c yi kullanabilme açısından derinleşmekle ilgili ayrıca c dili yukarıda bahsettiğim diğer dil, yapı, tekonlojilere yelken açmana izin verir. Var git sen asm ile yaz ben doğru bildiğimiz söylemek le yükümlüyüm vesselam.
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: muhittin_kaplan - 12 Aralık 2009, 01:45:57
@azimli
merak ettim c++ ve c# ile nasıl MCU programlanır ? varda ben mi bilmiyorum acaba
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: muhittin_kaplan - 14 Aralık 2009, 09:08:53
Alıntı yapılan: "muhittin_kaplan"böyle iyi
bir basic ci :D (oda nasıl oluyorsa) olarak asm ile c nin birbirine girmesi iştahımı kabartıyor :S
Okadar Yabana Atmayın Basic i, Swordfish diye bir derleyicisi var. Hatta Flaş da bile taşınabiliniyor. Taşınabilir yani :D
Başlık: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: lojikmemo1 - 15 Aralık 2009, 00:22:57
Alıntı yapılan: "muhittin_kaplan"
Alıntı yapılan: "muhittin_kaplan"böyle iyi
bir basic ci :D (oda nasıl oluyorsa) olarak asm ile c nin birbirine girmesi iştahımı kabartıyor :S
Okadar Yabana Atmayın Basic i, Swordfish diye bir derleyicisi var. Hatta Flaş da bile taşınabiliniyor. Taşınabilir yani :D

Hakkaten o derleyici çok şahane biraz mikrobasic i adırıyor ama neyse :)
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 21 Ağustos 2011, 18:37:01
Bu konuyu tekrardan uyandırmanın vakti geldi.

C ile dilediğim mikroya dilediğim programı yazabiliyorum. Aynı programı ASM ile yazarsam ASM kodum jet gibi uçuyor, C ile yazdığım ise nal topluyor.

Burada iki durum var.

İlki,  C'de hızlı koşan kodlama yapmayı beceremiyorum.
İkincisi ise, C asla ve asla ASM kadar hızlı koşabilecek kod üretemez.

Bu iki durumdan ilki kesinlikle doğru. Fakat, ikinci durumun daha doğru olduğuna inanıyorum.

Diyeceksiniz ki bu işler inançla olmaz. Ben de diyorum ki hodri meydan. Bana bunu basit bir örnek üzerinde ispatlayın.

İşlemcimiz: ARM Cortex M3
Derleyicimiz: Keil uvision 4.XX

Sorum.

Nerede ve nasil tanimlandiginin hic bir onemi olmayan a0, a1, a2, a3 8 bit, a4 ve a5 ise 16 bitlik değişkenlerdir.
0x40004000 adresinde 32 bitlik registerimiz bulunmaktadir.

Bu registerden okunan 32 bit verinin low byte'ı a0'a yerleşmek üzere, 32 bit verinin 4 adet 8'li bileşeni sırayla a0,a1,a2,a3 içine yazılacaktır.
Sözkonusu 32 bitlik registerden ikinci kez bir okuma daha yapılacak ve bu kez okunan verinin low 16 kısmı a4'e, high 16 kısmı ise a5 içine yerleşecektir.


Programimiz asagidaki gibi olacak.

void Fnk1()
{
//   Soruya cevap kodlariniz burada.
}

int main()
{
volatile char b0,b1,b2,b3; // Boyle yazilacak
volatile short b4,b5;      // Boyle yazilacak
volatile unsigned int i;

   InitCPU(); // Nasil yazdiginiz beni alakadar etmez

   Led_On() ; // Nasil yazdiginiz beni alakadar etmez

   for (i=0;i<0xFFFFFFFF;i++)
       {
         Fnk1();
         b0=a0; // Bu atama burada olsun da nasil atarsaniz atayin.
         b1=a1; // Bu atama burada olsun da nasil atarsaniz atayin.
         b2=a2; // Bu atama burada olsun da nasil atarsaniz atayin.
         b3=a3; // Bu atama burada olsun da nasil atarsaniz atayin.
         b4=a4; // Bu atama burada olsun da nasil atarsaniz atayin.
         b5=a5; // Bu atama burada olsun da nasil atarsaniz atayin.
       }
   Led_Off(); // Nasil yazdiginiz beni alakadar etmez
}

Asm kadar hızlı koşacağını iddia edeceğiniz C kodlarınızin basari olcusu = 1000 / (Ledin yanik kalma suresi(sn) * CpuClk(MHz)) 

Basari olcusunun degeri ne kadar buyukse yaziliminiz o kadar super demektir.

Ornegin lediniz 100ms de sonduyse Cpu frekansiniz 50Mhz ise 1000 /(0.1*50) den puaniniz 200 cikacaktir.
100ms lik sonucu 80Mhz islemcide elde ettiyseniz 1000/(0.1*80) den puaniniz 125'e dusecektir.

Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: Kadir Can(16F84) - 21 Ağustos 2011, 18:44:51
Hocam işi bayağı ilerletmişsiniz. :)
Bu hodri meydana cevap veren olursa zevkli ve öğretici bir yarışma izleyeceğiz.
Yalnız siz kıyaslamak için gereken ASM kodlarını vermemişsiniz.
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: ErsinErce - 21 Ağustos 2011, 20:08:13
union {
struct{
unsigned char a0;
unsigned char a1;
unsigned char a2;
unsigned char a3;
} cbyte;
struct{
unsigned short a4;
unsigned short a5;
} cshort;
}ersin __attribute__((at(0x40004000)));

b0=ersin.cbyte.a0; // Bu atama burada olsun da nasil atarsaniz atayin.
        b1=ersin.cbyte.a1; // Bu atama burada olsun da nasil atarsaniz atayin.
        b2=ersin.cbyte.a2; // Bu atama burada olsun da nasil atarsaniz atayin.
        b3=ersin.cbyte.a3; // Bu atama burada olsun da nasil atarsaniz atayin.
        b4=ersin.cshort.a4; // Bu atama burada olsun da nasil atarsaniz atayin.
        b5=ersin.cshort.a5; // Bu atama burada olsun da nasil atarsaniz atayin.


fonksiyona gerek yok hocam asm kodları aşağıdaki gibi çıkıyor ama adreslemeyi tam yapamadım galiba iftardan sonra araştırırım

    94:                  b0=ersin.cbyte.a0; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D06 4822      LDR      r0,[pc,#136]  ; @0x08000D90
0x08000D08 7805      LDRB     r5,[r0,#0x00]
    95:          b1=ersin.cbyte.a1; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D0A 7846      LDRB     r6,[r0,#0x01]
    96:          b2=ersin.cbyte.a2; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D0C 7887      LDRB     r7,[r0,#0x02]
    97:          b3=ersin.cbyte.a3; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D0E F8908003  LDRB     r8,[r0,#0x03]
    98:          b4=ersin.cshort.a4; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D12 8800      LDRH     r0,[r0,#0x00]
0x08000D14 FA0FF980  SXTH     r9,r0
    99:          b5=ersin.cshort.a5; // Bu atama burada olsun da nasil atarsaniz atayin.
0x08000D18 481D      LDR      r0,[pc,#116]  ; @0x08000D90
0x08000D1A 8840      LDRH     r0,[r0,#0x02]
0x08000D1C FA0FFA80  SXTH     r10,r0
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: camby - 21 Ağustos 2011, 22:40:31
Bunalmış hoca , Cortex M3'e Assembly mi yazıyorsun ?
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: arslan74 - 22 Ağustos 2011, 02:00:59
Merhaba,

@cynetron arkadaşımız güzel bir örnek vermiş ancak ufak bir eksik var gibi. struct içinde tanımlı 32bit değişken yok.


typedef union {
struct{
unsigned char a0;
unsigned char a1;
unsigned char a2;
unsigned char a3;
} cbyte;
struct{
unsigned short a4;
unsigned short a5;
} cshort;
unsigned long degisken_32bit;
} karisim_32bit;  //


kod içinde bu değişkeni tanımlayıb kullanacak.

Oda söyle olabilir.



karisim_32bit degiskenler; // istenirse değişkeni belirli bir adrese tanımlanabilir.

void Fnk1()
{

  degiskenler.degisken_32bit = okunan32bit; // ataması yapıldığında diğer bütün değişkenlere otomatik atama yapılmıştır.

}


Böyle kodla yapıldığında ASM hızlı mı olur, orası tartışılır. Ama kesin olan şudur ki; Okunaklılık, anlaşılırlık ve taşınabilrlik acısından tartışmasız bu şekilde yapılması gerekir. Hele 32 bit bir işlemcide bu atamanın hızı gözardı edilebilinir. 8 bit bir işlemcide 32 bit atama yapabilmek için 4 defa atamak yapmak gerekir oysa 32 bit bir işlemci tek atama ile yapabiliyorsunuz. Ama değişkenlerin uzunluğu 32 bit olarak saklanıyorsa ve bu 32bit sadece tekbir adres temsil ediliyorsa yani içindeki 8bitlere adresle erişemiyorsak bu seferde 8bit atamarı yapmak zorlaşacak. 32bit işlemciler hiç çalışmadığım için bu ayrıntıyı tam olarak bilemiyorum. Kullananlar bu ayrıntılı acıklar ise sevinirim.

Kolay gelsin.


Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 22 Ağustos 2011, 02:40:52
Alıntı yapılan: arslan74 - 22 Ağustos 2011, 02:00:59
.... 8 bit bir işlemcide 32 bit atama yapabilmek için 4 defa atamak yapmak gerekir oysa 32 bit bir işlemci tek atama ile yapabiliyorsunuz. Ama değişkenlerin uzunluğu 32 bit olarak saklanıyorsa ve bu 32bit sadece tekbir adres temsil ediliyorsa yani içindeki 8bitlere adresle erişemiyorsak bu seferde 8bit atamarı yapmak zorlaşacak. 32bit işlemciler hiç çalışmadığım için bu ayrıntıyı tam olarak bilemiyorum. Kullananlar bu ayrıntılı acıklar ise sevinirim.....

ARM CM3 islemciler icin cevabini vereyim.

32 bitlik veri 4 bytelik alani isgal ediyor.

Ornegin

0x20000000 adresine  8   bit veri yazarsaniz verinin adresi 0x20000000 olur ve 1 byte kaplar. 0x20000000
0x20000000 adresine  16 bit veri yazarsaniz verinin adresi 0x20000000 olur ve 2 byte kaplar. 0x20000000  0x20000001
0x20000000 adresine  32 bit veri yazarsaniz verinin adresi 0x20000000 olur ve 4 byte kaplar. 0x20000000  0x20000001 0x20000002  0x20000003

Fakat;

8 bitlik verileri herhangi bir adrese yazabilirken, 16 bitlik verileri sadece cift adreslere yazabiliyorsunuz.
32 bit verileri ise sadec 0 ve 4 un katlari adreslere.

Aksi takdirde bazi asm komutlarla bu verilere ulasilmak istenirse exception denen durum olusur. Bu yuzden C derleyici verinin uzunlguna gore gerekiryorsa  bos alanlar birakarak veri adrelerinde hizalama yapar.

Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: arslan74 - 22 Ağustos 2011, 02:50:11
Merhaba,

Yanı bu durumda veriler Flash ve RAM de byte byte saklanıyor tıpki PC de olduğu gibi. O zaman union kullanmak gercekten cok avantaj getirecek. O zaman 32bit uzunuğundaki registerler hangisi oluyor. 32bit registerden 8 bit registere atama yapıldığında bu atama sanıl gercekleşiyor?

Bu kısım aydınlandığında Cok daha iyi optimum kod yazılabilinir.

Kolay gelsin.
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 22 Ağustos 2011, 03:36:29
Alıntı yapılan: arslan74 - 22 Ağustos 2011, 02:50:11
Merhaba,

Yanı bu durumda veriler Flash ve RAM de byte byte saklanıyor tıpki PC de olduğu gibi. O zaman union kullanmak gercekten cok avantaj getirecek. O zaman 32bit uzunuğundaki registerler hangisi oluyor. 32bit registerden 8 bit registere atama yapıldığında bu atama nasil gercekleşiyor?

Bu kısım aydınlandığında Cok daha iyi optimum kod yazılabilinir.

Kolay gelsin.

ARM islemcide CPU registerleri (accumulator benzeri registerler) 32 bit. Birde cevre birimi registerleri var. Bunlardan bazilarida 32 bit.

32 bitlik bir CPU registerinin icerigini isterseniz 8 bitlik alana, isterseniz 16 bitlik alana isterseniz 32 bitlik alana yazabilirsiniz. Bunlarin her biri ayri asm kodu ile gerceklestirilir.

Eger 8 yada 16 bitlik alana 32 bitlik cpu registerleri uzerinden yanlis bir komutla aktarim yaparsaniz, 8 yada 16 bitlik verinin saklanacagi hedef adresini takip eden adreslerdeki verileri ezersiniz.

Eger pespese adreslerde 8 bitlik 4 ayri degiskeniniz varsa bunlardan ilkinin adresini kullanarak 4une birden 32 bit veriyi tek komutla yazabilirsiniz. (Endian tipini gozardi etmemek kaydiyla)

C yi ne kadar iyi bilirseniz bilin, yukarida sordugum soruda buyuk basari puani saglayacak  C kodlamasini, derleme sonunda uretilmis asm kodlarina baktiginizda, bu kodlari anlamadan yapamazsiniz.

C, editor icindeki gorunen kodlarin yakisikli, sade ve anlasilir olmasini saglar. Kod yalinligi konusunda Asm nin yeri ayridir.

C programim, saf asm ile yazilmis koda kiyasla sadece mikrosaniyeler mertebesinde yavas denilirrse, ortalikta fazlalik kodlar var demektir.
Cunku kucucuk bir program parcaciginda  fazlalik oluyorsa, buyuk program parcaciklarininda da buyuk fazlaliklar olacak demektir ve bunlar kodlarin belirgin sekilde yavaslamasina neden olur.

Bazi uygulamalarda, bazi program parcaciklarinda olusacak zaman kayiplarina tahammul olmaz. En basitinden int rutinleri. Tabiki extrem durumlardan bahsediyorum.
Hic kimse, bana muhasebe programini asm ile yazdiramaz.

Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: arslan74 - 23 Ağustos 2011, 10:33:14
Merhaba,

Sayın @bunalmis vermiş olduğumuz yapıyı kullanma şansınız oldumu? ASM göre arasındaki farkı daha iyi kısyas yapmış oluruz.

Ben daha 32bit lere gecmediğim için şimdilik deneme şanşım yok.

Selamlar
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: z - 23 Ağustos 2011, 13:20:25
Verdiğiniz yapıyı denemedim.

Fakat yapının daha önce verdiğim şekilde olması önemli. Yani;

void Fnk1()
{
//   Soruya cevap kodlariniz burada.
}

int main()
{
volatile char b0,b1,b2,b3; // Boyle yazilacak
volatile short b4,b5;      // Boyle yazilacak
volatile unsigned int i;

   InitCPU(); // Nasil yazdiginiz beni alakadar etmez

   Led_On() ; // Nasil yazdiginiz beni alakadar etmez

   for (i=0;i<0xFFFFFFFF;i++)
       {
         Fnk1();
         b0=a0; // Bu atama burada olsun da nasil atarsaniz atayin.
         b1=a1; // Bu atama burada olsun da nasil atarsaniz atayin.
         b2=a2; // Bu atama burada olsun da nasil atarsaniz atayin.
         b3=a3; // Bu atama burada olsun da nasil atarsaniz atayin.
         b4=a4; // Bu atama burada olsun da nasil atarsaniz atayin.
         b5=a5; // Bu atama burada olsun da nasil atarsaniz atayin.
       }
   Led_Off(); // Nasil yazdiginiz beni alakadar etmez
}

Soruyu soran olarak, soruyu çözeceklere, buradaki b değişkenlerini  structure yapısında kurmamaları için daha en baştan onları main içinde char tipinde ayrık değişkenler olarak tanımladım. A nın nasıl tanımlandığını size bırakmıştım.

Fnk1'de fonksiyon olarak dışarda özellikle tuttum. Bunu ana programın içine aldığınız takdirde otomatik olarak Call ve Return işlemi yapan asm komutlarını kaldırmış ve en azından 2 komut kısalma yapmış olursunuz. Bu da başarı puanınızı artıran bir durumdur.

İlerleyen dönemde  bir porttan kare dalga üretiminde kod uzunluğunun frekansa olan etkisi üzerine ara konu açacağım.
Bu konu altında C nin asm'ye kıyasla daha fazla kod üretmesinin band genişliğimize olan etkisini ve bu etkinin hangi durumda etkisini yitirmeye başladığını inceleyeceğiz.

@Aslan74

Bu devirde ARM kiti olmayan bir elektronikçi düşünemiyorum.






Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: ErsinErce - 23 Ağustos 2011, 17:49:29
b tipi değişkeni ellemeden direk a yı structure olarak tanımlamıştım ve belirtilen bölgeye yerleştirmiştim,
tabi ki call return clock kaybına yol açar ve sistemi etkiler ama bunun önüne geçmek içinde C de inline fonksiyonlar mevcut

ayrıca @arslan74 hocam union içine harici bir 32 bit daha koymaya gerek yok, eğer 32 bitlik bir giriş yapmıyorsak,
structure boyutları 32 bit olduğundan linker o alanı 32 bit olarak ayıracaktır
Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 23 Ağustos 2011, 23:29:32
Alıntı yapılan: arslan74 - 22 Ağustos 2011, 02:50:11
Merhaba,

Yanı bu durumda veriler Flash ve RAM de byte byte saklanıyor tıpki PC de olduğu gibi. O zaman union kullanmak gercekten cok avantaj getirecek. O zaman 32bit uzunuğundaki registerler hangisi oluyor. 32bit registerden 8 bit registere atama yapıldığında bu atama sanıl gercekleşiyor?

Bu kısım aydınlandığında Cok daha iyi optimum kod yazılabilinir.

Kolay gelsin.

Merhaba,

32bit işlemciler byte byte veri saklıyor ve program counter, hafızaya byte yazılırken 1, half word yazılırken 2 ve word yazılırken 4 adım atlar.  Dolayısıyla 32bit için 4 byte yazar ve PC+=4 olur.

Dediğin gibi Union yapı işlemcinin çalışma performansını etkilemez çünkü zaten işlemci byte erişimli. Ve örneğini verdiğin union 8bit,16bit,32bit erişimi çalışıyor. Hatta senin verdiğin yapıda eksik denebilir, istenirse içine 1 bit erişimde eklenebilir.
   

Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: iyildirim - 24 Ağustos 2011, 00:11:08
Alıntı yapılan: eemkutay - 23 Ağustos 2011, 23:29:32
32bit işlemciler byte byte veri saklıyor ve program counter, hafızaya byte yazılırken 1, half word yazılırken 2 ve word yazılırken 4 adım atlar.  Dolayısıyla 32bit için 4 byte yazar ve PC+=4 olur.

Dediğin gibi Union yapı işlemcinin çalışma performansını etkilemez çünkü zaten işlemci byte erişimli. Ve örneğini verdiğin union 8bit,16bit,32bit erişimi çalışıyor. Hatta senin verdiğin yapıda eksik denebilir, istenirse içine 1 bit erişimde eklenebilir.

eemkutay,

Burayı pek anlamadım.
ARM serilerini pek bilmem, ama bildiğim kadarı ile 16-32bit işlemcilerin veri yolu da 16-32bit. PC nin 1 veya 4 ilerlemesinden ziyade 32bitlik registerin içeriğinin değişkene, RAM'e aktarılması tek bir clock süresinde olmuyormu?. 
Bu durumda union kullanımı ile tek tek komutlar çalıştırmak yerine tek bir komutla 32 biti tek bir clock süresinde aktarabiliyoruz diye biliyorum.  Tek şartı da 8 bitlik 4 değişenin bellekte ardışık olarak yerleştirilmesi. 4 ayrı komut çalıştırmak yerine 1 komut çalıştırmak neden performansa etki etmesin.



Başlık: Ynt: Benim işlemcim seninkini, benim C senin ASM yi döver.
Gönderen: CLR - 24 Ağustos 2011, 00:45:17
Alıntı yapılan: iyildirim - 24 Ağustos 2011, 00:11:08
Alıntı yapılan: eemkutay - 23 Ağustos 2011, 23:29:32
32bit işlemciler byte byte veri saklıyor ve program counter, hafızaya byte yazılırken 1, half word yazılırken 2 ve word yazılırken 4 adım atlar.  Dolayısıyla 32bit için 4 byte yazar ve PC+=4 olur.

Dediğin gibi Union yapı işlemcinin çalışma performansını etkilemez çünkü zaten işlemci byte erişimli. Ve örneğini verdiğin union 8bit,16bit,32bit erişimi çalışıyor. Hatta senin verdiğin yapıda eksik denebilir, istenirse içine 1 bit erişimde eklenebilir.

eemkutay,

Burayı pek anlamadım.
ARM serilerini pek bilmem, ama bildiğim kadarı ile 16-32bit işlemcilerin veri yolu da 16-32bit. PC nin 1 veya 4 ilerlemesinden ziyade 32bitlik registerin içeriğinin değişkene, RAM'e aktarılması tek bir clock süresinde olmuyormu?. 
Bu durumda union kullanımı ile tek tek komutlar çalıştırmak yerine tek bir komutla 32 biti tek bir clock süresinde aktarabiliyoruz diye biliyorum.  Tek şartı da 8 bitlik 4 değişenin bellekte ardışık olarak yerleştirilmesi. 4 ayrı komut çalıştırmak yerine 1 komut çalıştırmak neden performansa etki etmesin.

Merhaba,

Arm asm içinde isterse 8bit isterse 32bit işlem yapabiliyor.  Hepsi 1 clock cycle istiyor, istr 32bit yazsın isterse 8bit. Yani sen yanlış anlamışsın 32bit yazmak için 4 clock cycle gerekmiyor sadece pc'ye 4 ekleniyor. 8 biti de tek hamdede yazıyor, sadece içeri de 32bite donanımsal maskeleme yapmışlar ve 8bit, 16bit yazıp okuyabiliyor.