🚀 BAŞTAN SONA x86 ASSEMBLY BÖLÜM-6: C Kütüphaneleri İle Entegrasyon ve Inline Assembly 💻

Konu Özeti

x86 Assembly serisinin 6. bölümünde, Assembly kodları içinden printf gibi Standart C kütüphane fonksiyonlarının cdecl çağrı kuralıyla nasıl çağrılacağı ve C kodlarına GCC Extended Inline Assembly ile doğrudan Assembly komutlarının nasıl gömüleceği anlatılıyor. Örneklerle parametrelerin yığına sağdan sola push edilmesi, çağrı sonrası yığın temizliği ve Inline Assembly sözdizimi gösteriliyor. Bir sonraki final bölümünde kesilmeler, BIOS ve MBR bootloader yazımı ele alınacak.

🚀 BAŞTAN SONA x86 ASSEMBLY BÖLÜM-6: C Kütüphaneleri İle Entegrasyon ve Inline Assembly 💻

Selamlar! Serimizin 6. bölümüne hoş geldiniz.

Önceki bölümde ESI ve EDI indeks yazmaçlarını, DF bayrağını (CLD/STD), MOVS, STOS, LODS, CMPS dizi komutlarını ve REP tekrarlama öneklerini incelemiştik. Bu bölümde ise Assembly kodlarımız içinden Standart C kütüphane fonksiyonlarını (printf, scanf, malloc, exit) çağırmayı ve C kodlarının içerisine doğrudan Assembly komutları gömmeyi (Inline Assembly) öğreneceğiz.

---

📌 1. Neden C ve Assembly Birlikte Kullanılır? 🤝

Gerçek dünya uygulamalarında işletim sistemi kesilmelerini (int 0x80 veya syscall) doğrudan elle çağırmak yerine, Standart C kütüphanelerini (libc) kullanmak büyük kolaylık sağlar:
• Taşınabilirlik ve Kolaylık: Karmaşık String/Formatting fonksiyonlarını (printf, sprintf) Assembly ile sıfırdan yazmak yerine C kütüphanesinden çağırmak zaman kazandırır.
• Kritik Performans Bölümleri: C ile yazılmış yüksek seviyeli bir projenin sadece darboğaz oluşturan dar bir algoritmasını Inline Assembly ile optimize etmek mümkündür.

---

📞 2. Assembly İçinden C Fonksiyonlarını Çağırma (cdecl Standardı) ⚙️

C kütüphane fonksiyonlarını çağırmak için x86 cdecl (C Calling Convention) kurallarına uyulur:
1. Parametreler yığına sağdan sola (sağdaki parametre ilk) PUSH edilir.
2. CALL fonksiyon_adi ile çağrı yapılır.
3. Dönüş değeri EAX yazmacına yerleşir.
4. Fonksiyon dönüşünde çağıran taraf (caller) yığını temizler (ADD ESP, byte_sayisi).

section .data
fmt db "Sayi: %d, Metin: %s", 0xa, 0 ; printf format string (C metinleri '\0' ile bitmelidir)
metin db "Assembly & C", 0
sayi dd 42

section .text
global main
extern printf ; C kütüphanesinden printf fonksiyonunu içeri aktarıyoruz

main:
push ebp
mov ebp, esp

; printf("Sayi: %d, Metin: %s\n", 42, "Assembly & C");
; Parametreler sağdan sola push edilir:
push metin ; 3. Parametre (%s)
push dword [sayi] ; 2. Parametre (%d)
push fmt ; 1. Parametre (Format metni)

call printf ; C printf fonksiyonu çağrılır
add esp, 12 ; 3 x 4 bayt = 12 bayt yığın temizliği yapılıyor

mov eax, 0 ; return 0;
mov esp, ebp
pop ebp
ret

### Derleme Komutları (GCC İle Link Etme):
nasm -f elf32 program.asm -o program.o
gcc -m32 program.o -o program
./program

---

🧩 3. C Kodunun İçine Assembly Gömme (GCC Extended Inline Assembly) 🛠️

GCC derleyicisi, C kodunun ortasında __asm__ veya asm anahtar kelimesiyle doğrudan Assembly talimatları yazmamıza olanak tanır.

### Extended Syntax Mimarisi:
__asm__ ("Assembly Kodları" : Çıktılar : Girdiler : Değişen Yazmaçlar);

#include <stdio.h>

int main() {
int sayi1 = 15;
int sayi2 = 25;
int toplam;

// Inline Assembly ile iki sayıyı toplama
__asm__ (
"addl %%ebx, %%eax;" // EAX = EAX + EBX
: "=a" (toplam) // Çıktı (Output): EAX yazmacındaki değer 'toplam' değişkenine aktarılır (%0)
: "a" (sayi1), "b" (sayi2) // Girdiler (Input): 'sayi1' EAX'e (%0), 'sayi2' EBX'e (%1) yüklenir
);

printf("Inline Assembly Toplam Sonucu: %d\n", toplam); // 40
return 0;
}

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Standart C kütüphanelerini (libc) Assembly içerisinden cdecl kuralına göre çağırmayı, GCC ile link etmeyi ve C içerisinde Inline Assembly kullanmayı öğrendik.

👉 Bölüm 7'de Bizi Ne Bekliyor? (FİNAL BÖLÜMÜ)
• Serinin Muhteşem Finali: Kesilmeler (Interrupts), BIOS/Kernel Mantığı ve MBR Bootloader Yazımı 🏆
• Real Mode vs Protected Mode Mimarisi
• int 0x10 BIOS Video Kesilmeleri
• Bare-Metal: 512 Baytlık Kendi İşletim Sistemi Ön Yükleyicimizi (Bootloader) Yazıp QEMU Sanal Makinesinde Çalıştırma!

Sorularınızı yorum olarak iletebilirsiniz. Serimizin FİNAL bölümünde görüşmek üzere! 💻✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,712Mesajlar
326,237Kullanıcılar
thekral21Son Üye
Üst Alt