CCS C Ön İşlemci Komutları, C programlarının derlenmeden önce çalıştırılan komutlarıdır. Ön işlemci komutları, # işaretiyle başlar ve genellikle kullanılanlar #include, #define, #ifdef, #endif gibi komutları içerir. Bu komutlar, programın derlenmeden önce çalıştırılmasını sağlar ve programın çalışmasını kolaylaştırır. Örneğin, #include komutu ile başka bir dosyanın içeriği programın içine dahil edilebilir. #define komutu ile ise sabit değerler tanımlanabilir.
Hafıza Kontrol Komutları
C dilinde hafıza kontrol komutları, programda bellek yönetimi için kullanılır. Bu komutlar, programın bellekteki verileri doğru bir şekilde yönetebilmesini ve bellekteki hataları tespit etmeyi sağlar. Örnek olarak:
- malloc() : Dinamik bellek almak için kullanılır.
- calloc() : Dinamik bellek almak için kullanılır ve bellekteki tüm değerleri sıfıra eşitler.
- realloc() : Daha önceden alınmış olan dinamik belleği yeniden boyutlandırmak için kullanılır.
- free() : Dinamik bellekte alınmış olan yerleri geri vermek için kullanılır.
- sizeof(): bellekteki veri tipinin boyutunu öğrenmek için kullanılır.
Bu komutlar programda bellek yönetimini kontrol etmek ve hata önlemek için kullanılır. Özellikle, free() komutunun unutulmaması programda bellek sızıntılarını önler ve programın çalışmasını stabil hale getirir.
#asm #endasm
#asm ve #endasm komutları C dilinde assembly dili kodlarının C kodları arasına eklenmesini sağlar. Bu komutlar, C programları içinde assembly dili kodlarının kullanılmasını mümkün kılar.
#asm komutu ile assembly kodlarının başlangıcı belirlenir ve #endasm komutu ile assembly kodlarının sonu belirlenir. Örnek olarak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> int main() { int a = 10; printf("Değer: %d\n", a); #asm mov eax, a add eax, eax mov a, eax #endasm printf("Değer: %d", a); return 0; } |
Bu örnekte, #asm ve #endasm arasına yazılan assembly kodları, a değişkenin değerini iki katına çıkarır. Bu kodlar program çalıştırıldığında, a değişkeninin değeri 20 olacaktır.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir.
#org
#org komutu, assembly programlarında bellek adreslerinin atanmasını sağlar. Bu komut ile belirli bir bellek adresine kod veya veri yerleştirilebilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x100’de bir değişkenin değeri yerleştirilmiştir:
1 2 3 4 5 6 7 8 9 10 11 |
section .text global _start #org 0x1000 _start: nop mov eax, 1 mov ebx, 0 int 0x80 |
Bu örnekte, #org komutu ile bellek adresi 0x1000 olarak atanmıştır. Bu adreste _start etiketli fonksiyonun kodu yerleştirilmiştir. Bu fonksiyon sistem çağrısı kullanarak programın çalışmasını sonlandırır.
Bu örnekte belirtilen bellek adresi yerleştirilen kodun çalıştırılması için bir başlangıç noktasıdır ve programın çalışması buradan başlar. Bu bellek adresi önemlidir çünkü programın çalışması sırasında bellekteki diğer veriler ve kodlar ile çakışmamak için bu adres belirlenmiştir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir.
#rom
#rom komutu, assembly programlarında bellek adreslerinin atanmasını ve bellekteki verilerin read-only(sadece okunabilir) olarak işaretlenmesini sağlar. Bu komut ile belirli bir bellek adresine sadece okunabilir olarak kod veya veri yerleştirilebilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x8000’de bir sabit değerin yerleştirilmiş olduğu bir alan tanımlanmıştır:
1 2 3 4 5 |
#org 0x8000 #rom db 0x12, 0x34, 0x56, 0x78 |
Bu örnekte, #org komutu ile bellek adresi 0x8000 olarak atanmıştır ve #rom komutu ile bu alan sadece okunabilir olarak işaretlenmiştir. db komutu ile sabit değerler 0x12, 0x34, 0x56, 0x78 olarak bellekte yerleştirilmiştir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
#reserve
#reserve komutu, assembly programlarında bellekte belirli bir alanın ayırılmasını sağlar. Bu komut ile belirli bir bellek adresinden itibaren belirli bir boyutta bir alan ayırılır ve bu alan kullanılmamakta kalan boş alan olarak kabul edilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x2000’den itibaren 32 byte’lık bir alan ayırılmıştır:
1 2 3 4 |
#org 0x2000 #reserve 32 |
Bu örnekte, #org komutu ile bellek adresi 0x2000 olarak atanmıştır ve #reserve komutu ile 32 byte’lık bir alan bellekte ayırılmıştır. Bu alan kullanılmamakta kalan boş alan olarak kabul edilir ve daha sonra ihtiyaç duyulan zaman kullanılabilir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
#byte
#byte komutu, assembly programlarında bellekte belirli bir alana byte(8 bit) olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine byte olarak veri yerleştirilebilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x3000’de bir byte değerinin yerleştirilmiş olduğu bir alan tanımlanmıştır:
1 2 3 4 |
#org 0x3000 db 0x12 |
Bu örnekte, #org komutu ile bellek adresi 0x3000 olarak atanmıştır ve db komutu ile değişkenin değeri 0x12 olarak bellekte yerleştirilmiştir. Bu komut ile veri bellekte byte olarak yerleştirilir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
Bu komut ile değişken bellekte istenen adrese yerleştirilmektedir. Fakat derleyici otomatik değişken yerleştirmelerinde başka değişkeni bu komut ile belirlediğimiz aynı adrese yerleştire bilir. Bu olayı önlemek için #locate komutu kullanılır.
#locate
#locate komutu, assembly programlarında bellekteki kod veya verinin yerleştirileceği bellek adresini belirlemek için kullanılır. Bu komut ile belirli bir bellek adresine kod veya veri yerleştirilmeden önce bellek adresinin belirlenmesi sağlanır.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x4000’de bir fonksiyonun kodu yerleştirilmiştir:
1 2 3 4 5 6 7 8 9 10 11 |
section .text global _start #locate 0x4000 _start: nop mov eax, 1 mov ebx, 0 int 0x80 |
Bu örnekte, #locate komutu ile bellek adresi 0x4000 olarak belirlenmiştir ve _start etiketli fonksiyonun kodu bu adreste yerleştirilmiştir. Bu komut ile bellek adresi belirlenmeden önce yerleştirilen kod veya veriler belirlenen adrese yerleştirilir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
#bit
#bit komutu, assembly programlarında bellekte belirli bir alana bit olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine bit olarak veri yerleştirilebilir.
Veriler byte, word, dword veya diğer büyüklüklerde yerleştirilir. Ayrıca bit seviyesinde yerleştirme işlemleri için bitwise operatorlar kullanılır. Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x5000’de bir byte değerinin 0. biti 1 olarak yerleştirilmiştir:
1 2 3 4 5 |
#org 0x5000 db 0x00 or [0x5000], 1<<5 |
Bu örnekte 0x5000 adresinde yer alan byte verisi 0x01, or operatorü ile 0. biti 1 yapılmıştır. Bu şekilde bit seviyesinde yerleştirme işlemi gerçekleştirilmiş olur.
#zero_ram
#zero_ram komutu, assembly programlarında bellekteki belirli bir alanın sıfırlanmasını sağlar. Bu komut ile belirli bir bellek adresinden itibaren belirli bir boyutta bir alan sıfırlanır ve bu alan kullanılmamakta olan boş alan olarak kabul edilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x6000’den itibaren 32 byte’lık bir alan sıfırlanmıştır:
1 2 3 4 |
#org 0x6000 #zero_ram 32 |
Bu örnekte, #org komutu ile bellek adresi 0x6000 olarak atanmıştır ve #zero_ram komutu ile 32 byte’lık bir alan bellekte sıfırlanmıştır. Bu alan kullanılmamakta olan boş alan olarak kabul edilir ve daha sonra ihtiyaç duyulan zaman kullanılabilir. Bu komut, bellekteki verilerin silinmesi veya bellekteki geçersiz verilerin temizlenmesi gibi amaçlar için kullanılabilir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
#word
#word komutu, assembly programlarında bellekte belirli bir alana word (16 bit) olarak veri yerleştirmek için kullanılır. Bu komut ile belirli bir bellek adresine word olarak veri yerleştirilebilir.
Örnek olarak, aşağıdaki assembly kodunda bellek adresi 0x7000’de bir word değerinin yerleştirilmiş olduğu bir alan tanımlanmıştır:
1 2 3 4 |
#org 0x7000 dw 0x1234 |
Bu örnekte, #org komutu ile bellek adresi 0x7000 olarak atanmıştır ve dw komutu ile değişkenin değeri 0x1234 olarak bellekte yerleştirilmiştir. Bu komut ile veri bellekte word olarak yerleştirilir.
Not: Bu örnek sadece anlatım amaçlı verilmiştir ve gerçek bir programda assembly kodlarının kullanılması genellikle C ve C++ programlarında pek tercih edilmez. Assembly kodlarının kullanılması genellikle sistem seviyesinde veya düşük seviyede yazılan programlar için gereklidir. Bu komutun kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
#TYPE
- Kullanılacak veri türlerinin türlerinin bit sayılarının ayarlanmasını sağlar.
- Kullanılacak değişkenlerin tersi belirtilmedikçe işaretli veya işaretsiz olarak algılanmasını sağlar.
- Kaydedilen RAM bölgesini belirleme işlemleri yapabilir.
1 2 3 |
#TYPE SHORT=8, INT=32 |
yukarıdaki kod satırında short kelimesi 8 bitlik ve int 32 bitlik hale getirilmiştir. Normalde int kelimesi 8 bitlik veri türü olduğunu unutmayınız.
#TYPE ile SHORT, İNT ,LONG ve DEFAULT kelimeleri kullanılabilir.
1 2 3 4 5 |
#TYPE SIGNED int x; |
yukarıdaki komut kullanıldığı bir programda işaretli belirtilmeyen değişken tanımlamalarının hepsi işaretli şeklinde tanımlanır.
1 2 3 4 |
addressmod (benim_RAM, 0x0110,0x01FD); #TYPE default=benim_RAM |
yukarıdaki örnekte addressmod komutu ile tanımlanan başlangıcı 0x0110, bitişi 0x01FD olan bir RAM bölgesi tanımlanmıştır.
#TYPE default=benim_RAM komutu ile değişkenlerin kaydedileceği sınırları belirlenen adresse benim_RAM bölgesi seçilmiştir. Yani benim_RAM bölgesi 0x0110 ile 0x01FD aralığındadır ve değişkenler bu alan içine tanımlanacaktır.
Önceden Tanımlanmış Sabitler
CCS (Custom Computer Services) assembly programlama dilinde kullanılan önceden tanımlanmış sabitler arasında:
- DATE: Derleme tarihini içerir.
- TIME: Derleme saatini içerir.
- FILE: Dosya adını içerir.
- LINE: Dosya içerisinde bulunulan satır numarasını içerir.
- DATE_TIME: Derleme tarih ve saat bilgisini içerir.
- CCS_VERSION: Kullanılan CCS derleyicinin versiyon numarasını içerir.
Bu sabitler, kullanıcının programının hangi tarihte, hangi saatte, hangi dosya içerisinde derlendiğini, hangi satırda bir hata olduğunu veya hangi CCS versiyonu kullanıldığını görmesine olanak tanır. Bu sabitler, programların okunaklılığını arttırmak için kullanılabilir.
Not etmek gerekir ki bu sabitlerin kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
DATE
DATE CCS (Custom Computer Services) kullanılarak assembly programlarında kullanılabilir. Bu sabit, derleme zamanında otomatik olarak yerine konulur ve derleme tarihini içerir. Örnek olarak, aşağıdaki assembly kodunda DATE sabiti kullanılarak derleme tarihi ekrana yazdırılmıştır:
1 2 3 4 5 6 |
org 0 movlw __DATE__ call printf end |
Bu örnekte, DATE sabiti derleme tarihini içerir ve printf komutu ile ekrana yazdırılır. Not etmek gerekir ki DATE sabiti derleme tarihini içerir ve bu sabitin kullanımı ve özellikleri platform ve derleyicilere göre değişebilir.
Bu örnekte printf komutu kullanılarak DATE sabiti yazdırılmıştır. Ancak alternatif olarak, DATE sabiti ile ilgili işlemler yapılması için memory’de bir yerlere yazılması da mümkündür. Örnek olarak aşağıdaki gibi bir kod yazılabilir.
1 2 3 4 5 6 |
org 0 movlw __DATE__ movwf my_date_variable end |
Bu şekilde DATE sabiti “my_date_variable” adlı memory yerine yazılmış olur ve daha sonra bu değişken ile ilgili işlemler yapılabilir.
TIME
Derlenen dosyanın zamanını verir.
1 2 3 4 |
printf("Derleme Zamanı:"); printf(__TIME__); |
LINE: O anda işlenen komutun satır numarasını verir.
1 2 3 4 |
printf("Satir Numarasi"); printf(__LINE__); |
FILE: Derlenen dosyanın ismini verir. Dosyamızın ismi turkmuhendis olsun
1 2 3 |
char p[]=__FILE__; |
PCB,PCM,PCH: Programın derleneceği sırada hangi derleyici modülünün kullanılacağını belirtir
1 2 3 4 5 |
#ifdef__PCB__ #device PIC18F452 #endif |
DEVICE: Programın içinde tanıtılan cihazın kodunu verir
1 2 3 4 5 |
#DEVICE PIC16F877 int16 a; a=__device__ |
Standart C Komutları
#define
C programlamadan hatırlanacağı üzere programın başında bir global değişken tanımlanır.
1 2 3 |
#define x=3; |
#undef
Define ile tanımlanan değişkenin değerini serbest bırakır.
1 2 3 4 |
#define x=3; #undef x; |
#if,#else,#elif,#endif
C programlama dilinde kullanılan şart ifadelerinden olan if deyimi pic programlamada aynı görevi yerine getirir. Kontrol döngüsü #if ile başlar #endif ile sonlanır. Kontrolün içinde şart doğru ise #else komutuna kadar olan görev bloğu gerçekleştirilir, şart yanlış ise #else ile #endif bloğu arası gerçekleştirilir. elif de c programlamada else if ile aynı işlevdedir.
1 2 3 4 5 6 7 8 9 |
#if x>5 // eger x degeri 5’ten buyukse unsigned int16 deger; // bu satır islenir #elif // eger x degeri 5’ten buyuk degilse unsigned int8 deger; // bu satır islenir #else // x degeri 5’ten ne büyük de eşitse signed int8 deger; // bu komut yapılır #endif // sonlandır |
#ifdef, #ifdef
İfdef komutu programın herhangi bir yerinde #define ile değişken tanımlanıp tanımlanmadığını kontrol etme amaçlı kullanılır, yapılmış ise #else koduna kadar olan kısmı, yapılmamış ise #else ile #endif arasındaki komut satırları işlenir.
ifndef komutu ise efdef komutu ile yapılanın tam tersini yapar. Tanımlama yapılmış ise #else ile #endif , yapılmamış ise #else kelimesine kadar olan kısım yapılır.
#list, #nolist
C derleyicisinde yazılan C kodunu assembly kodu karşılığını görülebiliyordu. Bu işlem gerçekleştirdiğinizde derleyici size .lst uzantılı bir dosya oluştur. Oluşturulan bu dosya içerisinde kodlarınızın hem assembly hemde C karşılığını görebilirsiniz. #nolist ile #list kodu arasında assembly kodunun C karşılığı .lst dosyasında gösterilmez.
#error
Derleme işlemi gerçekleştirtiği sırada programın hata mesajı yazdırmasını sağlar.
1 2 3 |
#error //hata mesajı yaz |
#warning
Derleme işlemi sırasında #error komutu ile benzer olarak hata mesajı yazdırır.
1 2 3 |
#warning //hata mesajı yaz |
Denetleyici Tanımlama Komutları
#ID
Denetleyicilere kimlik numarası verilebilir. ID numarası için ayrılan adresler:
0x2000, 0x2001, 0x2002 normal komutlar ile bu alana erişilmez. ID numrası 16 bitliktir.
1 2 3 4 |
#ID 0x1234 // ID no verilmiştir. #ID 4,5,6,7 // ID no 0x4567 |
Dosyadan ID okutulmak istenirse
1 2 3 |
#ID "id_oku.h" // id_oku.h dosyasından 16 bitlik sayı okunur |
#fuses
Konfigürasyon bit’lerinin ayarları yapılır.
1 2 3 |
#fuses LP, NOWDT |
Bu programda düşük hızlı oslilatör ve Watchdog Timer’ın kullanılmadığını belirtir.
#HEXCOMMET
Adından da anlaşılacağı üzere derleyicinin oluşturduğu .hex uzantılı dosyanın başına açıklama yazar. Yazılan açıklama programın kod satırını etkilemez.
Fonksiyon Nitelendirici
#INT_…
Kesme fonksiyonlarının tanımlamalarında kullanılırlar.
1 2 3 4 5 6 7 8 9 10 11 |
#INT_EXT // Dış kesme #INT_EXT2 #INT_RDA #INT_SSP #INT_TIMER1 #INT_RTCC #INT_RB #INT_TIMER0 #INT_TIMER3 |
#int_default
Pıc denetleyicide tanımlanmayan bir kesme meydana geldiğinde varsayılan kesme olarak kullanılır. Bu durum denetleyici bir pazarzit ile karşılaştığında gerçekleşe bilir.
1 2 3 4 5 6 |
#int_default tanimsiz_kesme(){ printf("lcd_tutc,”Tanımsız kesme"); } |
#INT_GLOBAL
Pıc denetleyicisinde bir kesme meydan geldiği zaman denetleyici 4 numaralı adrese gider. Pıc denetleyici buradaki dallanma işlemini, gerçekleştirir. Eğer programda bu kesme işleminin gerçekleşmesi sırasında pic derleyicinisin 4 numaralı adrese değildi sizin gitmesini isteğiniz adres olması istenirse bu komut kullanılır.
#inline
Pic derleyicisinde fonksiyon tanımlarken ön işlemci komutu #inline kullanılırsa bu kodun kullanıldığı fonksiyonun her komutu çağrıldığı yere kopyalanır. Bu sayaede derleme işleminde hızlanma meydana gelir.
#separete
Bu komutu fonksiyonların derleyici tarafından otomatik inline özellikte komut atamasın engeller. Rom bellekten tasarruf sağlanmış olur. Yığın bellek alanının daha fazla kullanılmasını sağlar.
Yerleşik Kütüphaneler
#use delay
Program yazarken gecikme komutu kullanılabilmesi için ön işlemci komutu #use delay kullanılması gerekir.
1 2 3 |
#use delay (clock=4000000) |
derleyicinin 4Mhz bir osilatör ile çalıştığını belirtmektedir.
#use standart_io()
Pıc mikrodertleyicisine hangi portun giriş veya çıkış olarak kullanılcağı bildirilmesi gerekir, bu bildirim yapılmamış ise standart girş ve çıkış portları kullanılır. Bu ön işlemci komutu kullanıldığı zaman portun hangi bitinin giriş veya çıkış olacağının bildirilmesine gerek yoktur, giriş komutu kullanıldığında derleyici pini giriş olarak yönlendirir.
1 2 3 |
#use standart_io (port ismi) |
#use fast_io()
Bu komut ile beraber set_tris_x() komutu hangi pinin hangi portunun giriş veya çıkış olarak kullanılacağının belirlenmesi gerekir.
1 2 3 4 5 6 |
#use fast_io ( port ismi) #use fast_io(a) set_tris_a(0xFF) // a portu hepsi giriş yapılıyor. |
#use fixed_io()
Program boyunca kullanılacak olan çıkış port veya pinlerinin belirklnemsinde kullanılır. Bu komut ile belirtilmeyen port veya pinler çıkış olarak kullanılmamaktadır.
1 2 3 4 5 |
#use fixed_io (port_outputs=pin_ismi, pin_ismi) #use fixed_io(b_outputs_pin_b0, pin_b1) |
Derleyici Kontrol Komutları
#priority
Denetleyici de meydana gelen kesmeleri icra eder aynı anda iki kesme meydana geldiğinde önceli,kli kesmeyi icra eder. Öncelikli kesmeyi bildirmesini sağlar.
1 2 3 |
#priority ext,timer0 |
öncelikli kesme olarak ext ve daha sonra timer0 bildirilmiştir.
#case
Programcının CCS’de küçük büyük harf duyarlılığını açmak için kullanılır.
#IGNORE_WARNINGS
İgnore kelimesi İngilizceden Türkçeye çevrildiğinde ihmal anlamına gelmektedir. Bu komut derleyicinin uyarı vermesini engellemek amacıyla kullanılır.
1 2 3 4 5 6 7 8 9 10 |
/* Tüm uyarıları kapatmak için: */ #IGNORE_WARNINGS ALL /* Tüm uyarıların açık olaması için: */ #IGNORE_WARNINGS NONE */ Belirli uyarıları almamak için: */ #IGNORE_WARNINGS 200 |
#opt
Derleyici tarafından C kodlarının assembly kodlara daha az komut ve daha iyi çalışma gibi iyi koşullarda çevirmesi gerekir. Derleyici bunu en iyi şekilde yapar fakat programcı tarafından değiştirilebilir. Bu işlem derleyici optimizasyonudur.
1 2 3 4 5 6 |
#opt optimizasyon değeri #opt 5 // 1332 adet assembly koduna karşılık gelir #opt 9 // 1327 adet assembly koduna karşılık gelir |
Add Comment