-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! 💻✨
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