Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

MTM 305 MİKROİŞLEMCİLER KARABÜK ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ Arş. Gör. Emel SOYLU Arş. Gör. Kadriye ÖZ.

Benzer bir sunumlar


... konulu sunumlar: "MTM 305 MİKROİŞLEMCİLER KARABÜK ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ Arş. Gör. Emel SOYLU Arş. Gör. Kadriye ÖZ."— Sunum transkripti:

1 MTM 305 MİKROİŞLEMCİLER KARABÜK ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ Arş. Gör. Emel SOYLU Arş. Gör. Kadriye ÖZ

2 C Dili İçinde Assembly Kullanımı

3 C/C++ kodu içinde assembly kod yazma C dili içinde assembly dili programa hız kazandırmak için sıklıkla kullanılan bir yöntemdir. Asm kelimesini kullanarak C/C++ program satırları arasına assembly kodları yerleştirebiliriz ve C/C++ değişkenleri ile değerleri gösterebiliriz.

4 Avantajları Assembly dilinde fonksiyonları yazma. Hız kritik bölümlerin optimize edilmesi. Aygıt sürücüleri için doğrudan donanım erişimi.

5 Microsoft Inline Assembly: C dili içerisinde Assembly dili birkaç farklı şekilde kullanılabilmektedir. C kaynak kodu içerisinde herhangi bir yerde asm ifadesi ile assembly kodları kullanılabilir. Kullanım şekli şöyledir. __asm __asm mov al, 01H __asm mov bl, 02H __asm add al, bl

6 Bu kullanım şeklinde assembly programını oluşturan tüm komut satırlarının başına asm ifadesini yazmak gereklidir. Ama daha kolay bir yolu vardır. Asm bloğu oluşturmak. __asm { mov al, 01H mov bl, 02H add al, bl } __asm bir deyim ayracı olduğunda, assembly kodları aynı satırda da kullanılabilir: __asm mov al, 2 __asm mov dx, 0xD007

7 __asm Blocklarında Değişken Kullanımı int joe=1234, fred; __asm { mov eax,joe ; eax = joe; add eax,2 ; eax += 2; mov fred,eax ; fred = eax }; return fred;

8 __asm Blocklarında Operator Kullanımı int array[10]; __asm mov array[6], bx ; Store BX at array+6 (not scaled) array[6] = 0; /* Store 0 at array+24 (scaled) */ Diziye ilk referans ölçekli, ancak ikincisi değildir. Eğer bir sabite dayalı ölçeklemeye ulaşmak istiyorsak TYPE operatörünü kullanabiliriz. Örneğin, aşağıdaki ifadeler eşdeğerdir: __asm mov array[6 * TYPE int], 0 ; Store 0 at array + 24 array[6] = 0; /* Store 0 at array+24 (scaled) */

9 Assembler Fonksiyonu Yazma ; POWER.ASM ; Compute the power of an integer ; PUBLIC _power2 _TEXT SEGMENT WORD PUBLIC 'CODE' _power2 PROC push ebp ; Save EBP mov ebp, esp ; Move ESP into EBP so we can ; refer to arguments on the stack mov eax, [ebp+4] ; Get first argument mov ecx, [ebp+6] ; Get second argument shl eax, cl ; EAX = EAX * ( 2 ^ CL ) pop ebp ; Restore EBP ret ; Return with sum in EAX _power2 ENDP _TEXT ENDS END // Power2_inline_asm.c // compile with: /EHsc // processor: x86 #include int power2( int num, int power ); int main( void ) { printf_s( "3 times 2 to the power of 5 is %d\n", \ power2( 3, 5) ); } int power2( int num, int power ) { __asm { mov eax, num ; Get first argument mov ecx, power ; Get second argument shl eax, cl ; EAX = EAX * ( 2 to the power of CL ) } // Return with result in EAX }

10 GCC Inline Assembly:

11 Kod İçi Assembly Yazım Kuralları Değişken adlandırma: Değişkenler %, ö neki ile başlar. Ö rneğin eax ve ecx kaydedicileri %eax, %ecx şeklinde kullanılır. Operandların kullanımı: Intelden farklı olarak ilk operand kaynak ikinci operand hedeftir. Ö rneğin Intelde "mov eax, edx" c i ç inde kullanırken "mov %edx, %eax" şeklinde olacaktır. Operand b ü y ü kl ü ğ ü : Operandın b ü y ü kl ü ğ ü opcodun sonuna yazılan harf ile anlaşılmaktadır. “ b ” (8-bit) byte i ç in, ” w ” (16-bit) word i ç in, ” l ” (32-bit) doubleword i ç in. Ö rneğin "movl %edx, %eax“.

12 Kod İçi Assembly Yazım Kuralları Acil Operand: Acil operandların ö n ü ne “ $ ” ö neki gelir. Ö rneğin "addl $5, %eax", acil doubleword sayı ile eax ’ i topla Hafıza operandları: Eksik operand öneki, bir bellek adresi olduğunu gösterir. Ö rneğin “movl $bar, %ebx” %ebx içine değişkeninin adersini yerleştirirken, “movl bar, %ebx” %ebx ‘e değişkenin değerini yükler. Indisleme: Indisleme parantezler kullanılarak yapılır. Örneğin, "movl 8(%ebp), %eax" (%ebp+8 adresi ile işaret edilen içeriği %eax’e taşır.). Tüm kodlar için, Intel x86 işlemciler üzerinde çalışıyor olacak.

13 Temel kod içi programlama C içinde iki farklı şekilde assembly kullanılabilir. asm("assembly code"); ya da __asm__ ("assembly code"); Örnek: asm("movl %ebx, %eax"); /* eax =ebx */ __asm__("movb %ch, (%ebx)"); /* ch’ın değerini (byte ) ebx’in gösterdiği belleğe taşır */

14 #include int main() { /*10 ve 20 toplanır, sonuç %eax kaydedicisinde saklanır. */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "addl %ebx, %eax;" ); /* 20, 10dan çıkarılır ve sonuç %eax kaydedicisinde saklanır. */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "subl %ebx, %eax;" ); /* 10 ile 20 çarpılır ve sonuç %eax kaydedicisinde saklanır. */ __asm__ ( "movl $10, %eax;" "movl $20, %ebx;" "imull %ebx, %eax;" ); return 0 ; } Birden fazla Assembly komut satırı kullanılacaksa,her birinin sonunda noktalı virgül konulur.

15 Genişletilmiş Assembly Genişletilmiş assembly, biz de operand belirtebiliriz. Bu bize giriş kaydedicilerini, çıkış kaydedicilerini ve değeri değişen kaydedicilerin bir listesini belirlemenizi sağlar. asm ( "assembly code" : cıkış operandları /* seçimlik*/ : giriş operandları /* seçimlik */ : overwrite edilen operandların listesi /* seçimlik */ ); Örnek asm ("movl %eax, %0;" : "=r" ( val ));

16 Örnek: int no = 100, val ; asm ("movl %1, %ebx;" "movl %ebx, %0;" : "=r" ( val ) /* çıktı */ : "r" ( no ) /* girdi*/ : "%ebx" /* overwrite */ ); Yukarıdaki örnekte, çıkış işleneni "val“ % 0 ile anılır, giriş işlenen “no“ % 1 ile anılır. “r" operantlar için bir kısıtlamadır, böylece GCC herhangi bir kaydediciyi kullanabilir.

17 Beni dinlediğiniz için teşekkür ederim.


"MTM 305 MİKROİŞLEMCİLER KARABÜK ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ Arş. Gör. Emel SOYLU Arş. Gör. Kadriye ÖZ." indir ppt

Benzer bir sunumlar


Google Reklamları