C derleyiciler hakkinda

Başlatan bunalmis, 12 Ekim 2010, 12:22:49

z

Elimdeki derleyici en fazla 32 bit sayilarla calisabiliyor. Halbuki 128 bit verilerle calismam gerekiyor.

Temel aritmetik-karsilastirma-lojik islemleri icin fonksiyon yazmaya basladim.

Bu durumda ornegin C=A+B gibi toplama islemi icin  A ve B structurelarinin adresini  Add128 ismindeki fonksiyona parametre olarak gecip ardindan hesaplanan sonucun adresini geri donduruyorum.

Disasm ile yapilan islemlere baktigimda pek cok adres atama islemi yapildigini goruyorum.
Bu parametre aktarimi sonrasi adresleme islemleri asil fonksiyonu hantallastiriyor.

C derleyiciye 128 bit islem yaptirmak icin

Aynen 32 bit degiskenlerde oldugu gibi dogrudan C=A+B yazabilmenin yolu nedir?

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

Bir diger sorum da aynen asm yazimda oldugu gibi C de macro yazabilirmiyim?

Yukaridaki hantalliga bir cozum olarak Add128 adiyla bir macro yazip her toplama isleminde bu macroyu kullanmak
suretiyle stack uzerindeki fazlalik olarak gordugum adres islemlerinden kurtulmak.

C de Macro asm nasil yazabilirim?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#1
hocam bahsettiğiniz işlemi PC ile yapacağınızı varsayarak bignum kütüphanelerini denemenizi tavsiye ederim. Bu kütü
phaneler kriptografide oldukça yaygındır. Özellikle RSA gibi 512 bit ve üstü anahtar kullan algoritmalarda.

Bunların en yaygın bilinenlerinden biri;
http://www.shamus.ie/
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Yok bu islemi PC icin degil mikrocontroller cipler icin kullandigim derleyicilerde yapacagim.

Merak ettigim konu;

Derleyici C=A+B;  satiri ile karsilastiginda A ve B ye bakip 8 bitmi 16 bit mi 32 bit mi islem yapacagini anliyor ve ilgili kutuphaneden bu islemle ilgili asm kodlari ana kodumuza ekliyor.

Ben A ve B yi daha uzun tutup bu boyuttaki degiskenler icin hesaplama yapan kutuphaneyi kendim olusturmak istiyorum.

Derleyiciye bu nasil anlatilir?

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

Burak B

#3
SizeOf macrosu sizin C derleyici tarafından tanınıyorsa işinize yarar ;)

Mesela;
int A; ise ve sizin derleyiciniz integer değeri bir WORD olarak alıyorsa sizeof size 2 döndürür 2 byte yani :) buda 16bit eder malum. ayrıca derleyicinizin integer anlayışına göre kendinize bir 128 bitlik bir veri tipi tanımlamanız gerekecek.  Unutmadan 128 bitlik sayı azbuz küçük bir sayı değil hocam siz yine MIRACL a bir gözatın. Gömülü sistemlerdede kullanılabiliyordu bildiğim kadarıyla.

Şurayada bir gözatabilirsiniz;
http://www.woodmann.com/collaborative/tools/index.php/Category:BigNum_Libraries

https://cryptolux.org/Links_to_Embedded_Crypto_Implementations - BigDigits Library yazan kısım özellikle.

Birde MCU nuz kaç bitlik? Hangi derleyiciyi kullanıyorsunuz?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

mufitsozen

c derleyicileri icin bunun iki yolu var:

- Hangi derleyiciye bunu eklemek istiyorsaniz onun web sitesindeki eleman araniyor ilanlarina basvurup, orada ise girdikten sonra yeni bir degisken tipip icin o c compiler'i extend edip, parser, code optimizer/generator ve run-time kutuphanelere degisiklikleri eklemek.
- kullanacaginiz MCU icin kendi c compiler ve run-time librarylileri yazmak.

baska bir yolda kullanacaginiz MCU icin C++ compiler var ise (ki PIC icin var), operator overloading ozelligini kullanmak.

bignum vb kutuphaneleri kullanmak en kolay ve dogru yoldur c compilerlar icin.

eger compiler tasarimi ve araclari hakkinda bilginiz var ise domain-specific bir dil kullanarak, c'ye bir preprocessor yazarak bignum gibi bir kutuphaneyi (yada sizin yazacaginiz kutuphaneyi, yazacaginiz pre-processor ile ekleyebilirsiniz.

kolay gelsin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

Bunalmis Hocam,

dusununce bir yol daha buldum, kendi domain specific pre-processor yazacagina, bir yol daha var. Ama hosuna gidermi bilmem,

C++ ilk ciktiginda ve daha tam standard haline gelmemisken, cfront diye bir onisleyici c++ kodunu alip, ansi cye cevirir, sonrada c compiler ile compile ederdi 1990dan onceleri :-)

eger bulabilirsen cfronf 2.x, 3.x gibi pre-processorlar, c++ syntax ile program yazmana izin verir boylece function ve operator overload yaparak kendi kutuphanelerini vb isin icine katarsin, yanliz cfront implementasyonu name-mangling denen fonksiyon vb isimlerini carpittigi icin programlari c seviyesinde debug etmek icin cfront-> c degisimine cok iyi hakim olman gerekir.

Neyse buda bir yol, eger daha fazla ugrasayim dersen.

iyi calismalar.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

#6
Dediklerinizden anladigim;

"Elinizdeki C derleyicinin tanidigi degisken uzunluklarin disina tasmak istiyorsaniz derleyiciyi degistirin."

Eger boyle ise ugrasilacak bir sey değil. Bu durumda elemanter fonksiyonlari asm ile yazip kullanmakdan baska care kalmadi.

@ByteMaster

Derleyicim 32 bit (TI CCS 3.3)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

bu kendi bignum benzeri fonksiyon ve tiplerini yapmakla ayni

yani:

a=a+b; yerine a=addbig(a,b);
a=b-c; yerine a=subbig(b,c); gibi seyler yazman lazim.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

arslan74

Alıntı yapılan: bunalmis - 12 Ekim 2010, 14:33:25
Dediklerinizden anladigim;

"Elinizdeki C derleyicinin tanidigi degisken uzunluklarin disina tasmak istiyorsaniz derleyiciyi degistirin."

Eger boyle ise ugrasilacak bir sey değil. Bu durumda elemanter fonksiyonlari asm ile yazip kullanmakdan baska care kalmadi.

@ByteMaster

Derleyicim 32 bit (TI CCS 3.3)


Merhaba, Kullandığınız derleyicisinin C++ derleyici olması gerek. Onunla deneme yapmanızı öneririm. Zira C++ kod yazdıktan ve Avantajlarını gördükten sonra C 'ye geri döneceğinizi sanmiyorum. Cünkü C++ olup C olmayan bir cok özellik var. İlk aklıma gelen Fonksiyon ve operatör overloading, gelişmiş sınıf yapısı, exception handling özelliği, Templateler gibi bir sürü ek özellikler var. Eğer İşlemciniz yüksek kapasiteli bir işlemci ise C++ kesinlikle doğru tercih olacaktır.

Selamlar

z

#define AA asm(" NOP")

Taniminda, AA gorulen yere derleyici NOP asm kodu ekliyor.

AA yerine alt alta iki tane NOP eklensin istersek nasil tanim yapariz?

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

JKramer

#define AA asm(" NOP");\
                  asm(" NOP");

Olmazsa tanımları {} arasına almayı denersiniz.

Burak B

Hocam sayı büyük olunca stack veya memory alanı işgali artıyor. Kullanılacak sayı 128 bit olunca C++ bile olsa durum değişmeyecektir. Bu PC için bile böyle. Günümüz PC işlemcileri 64bit olduğundan 264 üzerinde hesap yapmaya kalkınca işler çok değişiyor. Heleki bu işaretsiz bir sayı olmak zorunda aksi halde (264 /2 ) - 1 (+1) aralığında olabiliyor. FPU işlemleri bunu aşabiliyor yada MMX SSE gibi komut setleri ancak bunlarda tam sayılar değil. Ancak buda biryere kadar. Diğer yandan Gömülü sistemler söz konusu olunca 8,16,32 bit MCU lar söz konusu olduğu için integer veri türüyle yapabilecekleriniz sınırlı oluyor. En azından istediğiniz hızda. Sayının büyüklüğü 232 yi geçince mecburen bahsettiim kütüphanelerden birini kullanmak zorunda kalıyorsunuz. Bunu asm de kendinizde yazabilirsiniz; hazır da kullanabilirsiniz. Seçim size bağlı. Ancak deneyimlerime dayanarak hazır bir kütüphane kullanmanızı tavsiye ederim.(Tabi bir güvenlik donanımı yapmıyorsanız. Eğer böyle birşey yapıyorsanız. Hazır kütüphane kullanmak güvenlik yönünden zayıflığa yolaçar.)

Kısaca. Derleyiciyi değişmenin bir faydası yok. Bignum kütüphanesi kullanın.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle