-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 BAŞTAN SONA x86 ASSEMBLY BÖLÜM-7 (FİNAL): Real Mode, BIOS Kesilmeleri ve Bare-Metal MBR Bootloader Yazımı 🏆
Selamlar dostlar! 👋
x86 Assembly rehber serimizin muhteşem **Final Bölümüne** hoş geldiniz! 🎉
İlk bölümden bu yana CPU mimarisinden başlayarak yazmaçları (Registers), adresleme modlarını, aritmetik ve mantıksal komutları, `CMP` ve `Jcc` ile akış kontrolünü, Yığın (Stack) mimarisini, `CALL` / `RET` ve Stack Frame yapısını, Dizi/String komutlarını (`MOVS`, `STOS`, `REP`), C kütüphane entegrasyonunu (`libc`) ve Inline Assembly kavramlarını eksiksiz öğrendik.
Bu final bölümünde ise hiçbir işletim sistemi (Windows, Linux vb.) olmadan doğrudan çıplak donanım (Bare-Metal) üzerinde çalışan, bilgisayarınız güç tuşuna basıldığında çalışan ilk kod olan **512 Baytlık MBR Bootloader (Ön Yükleyici)** yazacağız! 🚀
---
📌 1. Bilgisayar Başlatılma Mimarisi (Boot Process) ⚙️
1. **Power On:** Bilgisayar açıldığında işlemci varsayılan olarak 16-bit **Real Mode** modunda başlar.
2. **BIOS / UEFI:** Anakarttaki BIOS çipi donanımları test eder (POST) ve ilk önyükleme aygıtının (Disk/USB) **0. sektörünü (LBA 0)** okur.
3. **Magic Signature (`0xAA55`):** BIOS, 512 baytlık sektörün son iki baytında `0xAA55` imzasını görürse bunu geçerli bir **MBR Boot Sector** kabul eder.
4. **Execution:** BIOS, bu 512 baytlık kodu RAM'deki **`0x7C00`** adresine yükler ve kontrolü işlemciye (`EIP/IP = 0x7C00`) devreder.
---
🖥️ 2. Real Mode ve `int 0x10` BIOS Video Kesilmeleri 🎬
16-bit Real Mode içerisinde ekran çıktısı almak için işletim sistemi sürücüleri yerine BIOS'un dahili video kesilmesi olan **`int 0x10`** kullanılır.
• **`AH = 0x0E`:** "Teletype Output" fonksiyonu. `AL` yazmacındaki karakteri imlecin olduğu konuma yazar ve imleci bir kaydırır.
mov ah, 0x0E ; BIOS Teletype karakter yazma fonksiyonu
mov al, 'A' ; Ekrana basılacak karakter
int 0x10 ; BIOS Video Kesilmesi
---
💾 3. 512 Baytlık MBR Bootloader Kod Yapısı (`boot.asm`) 💻
Aşağıdaki kod, BIOS tarafından `0x7C00` adresine yüklenecek olan, ekrana özgün mesajımızı basan ve 512 baytlık boyutu tam dolduran bootloader kodudur:
[ORG 0x7C00] ; BIOS kodu bu bellek adresine yükler
BITS 16 ; İşlemciye 16-bit Real Mode komut kümesini kullanmasını bildiriyoruz
start:
; Segment yazmaçlarını güvenli şekilde sıfırlıyoruz
cli ; Kesilmeleri geçici olarak kapat
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00 ; Yığını (Stack) kodun hemen altına konumlandırıyoruz
sti ; Kesilmeleri tekrar aç
; Ekrana Metin Yazdırma Fonksiyonu
mov si, mesaj_metni
yazdir_dongusu:
lodsb ; [DS:SI] adresinden 1 bayt oku -> AL'ye yükle, SI++ yap
cmp al, 0 ; String sonu ('\0' Null Terminator) kontrolü
je sonsuz_dongu ; Metin bittiyse sonsuz döngüye atla
mov ah, 0x0E ; BIOS Teletype video fonksiyonu
int 0x10 ; Karakteri ekrana bas
jmp yazdir_dongusu
sonsuz_dongu:
cli ; İşlemciyi durdurmak için kesilmeleri kapat
hlt ; Halt: Bir sonraki kesilmeye kadar CPU'yu uykuya al
jmp sonsuz_dongu
; --- Veri Bölümü ---
mesaj_metni db 'BASTAN SONA x86 ASSEMBLY BOOTLOADER CALISTI! 🚀', 0x0D, 0x0A, 0
; --- MBR Doldurma ve Boot Imzasi ---
times 510 - ($ - $$) db 0 ; 512 baytın kalan kısmını 0x00 ile doldur
dw 0xAA55 ; MBR Magic Boot Signature (2 Bayt: 511 ve 512. baytlar)
---
⚙️ 4. Derleme ve QEMU Sanal Makinesinde Çalıştırma 🛠️
Yazdığımız bare-metal kodumuzu NASM ile ikili (raw binary) formata dönüştürüp QEMU ile çalıştıralım:
1. Binary Olarak Derleme:
nasm -f bin boot.asm -o boot.bin
2. Dosya Boyutunu Kontrol Etme (Tam 512 Bayt Olmalıdır!):
ls -l boot.bin
3. QEMU Sanal Makinesinde Çıplak Donanımda Çalıştırma:
qemu-system-x86_64 -drive format=raw,file=boot.bin
---
📊 5. x86 Assembly Eğitim Serisi Genel Kazanım Tablosu 📋
| Bölüm Aralığı | Temel Kazanımlar |
| :--- | :--- |
| **Bölüm 1 - 3** | CPU Mimarisi, Genel Yazmaçlar (`EAX`, `EBX`, `ECX`, `EDX`), `int 0x80`, `MOV`, `XCHG`, Aritmetik (`ADD`, `SUB`), `EFLAGS`, `AND/OR/XOR`, `CMP`, Koşullu Dallanma (`Jcc`) |
| **Bölüm 4 - 5** | Yığın (`ESP`, `EBP`), `PUSH`/`POP`, `CALL`/`RET`, **Stack Frame**, Dizi İndeksleri (`ESI`, `EDI`), `DF`, `MOVSB`, `STOSB`, `REP` Önekleri |
| **Bölüm 6 - 7** | C Kütüphane Entegrasyonu (`libc`, `cdecl`), Inline Assembly, **Real Mode**, BIOS `int 0x10`, **Bare-Metal MBR Bootloader Yazımı**, QEMU Emülasyonu |
---
🎉 TEBRİKLER! x86 ASSEMBLY SERİSİNİ BAŞARIYLA TAMAMLADINIZ! 🎉
7 Bölümlük Baştan Sona x86 Assembly rehber serisini eksiksiz bir şekilde bitirdiniz! 🥳
Artık işletim sistemlerinin arkasındaki büyüyü çözen, donanım seviyesinde RAM ve CPU yazmaçlarını yöneten, bare-metal bootloader yazabilen ve tersine mühendislik / sistem programlama için kaya gibi sağlam bir temele sahip bir geliştiricisin! 💻✨
İşlemciniz soğuk, yazmaçlarınız senkron, kodlarınız hatasız çalışsın! Başarılar! 🚀
Selamlar dostlar! 👋
x86 Assembly rehber serimizin muhteşem **Final Bölümüne** hoş geldiniz! 🎉
İlk bölümden bu yana CPU mimarisinden başlayarak yazmaçları (Registers), adresleme modlarını, aritmetik ve mantıksal komutları, `CMP` ve `Jcc` ile akış kontrolünü, Yığın (Stack) mimarisini, `CALL` / `RET` ve Stack Frame yapısını, Dizi/String komutlarını (`MOVS`, `STOS`, `REP`), C kütüphane entegrasyonunu (`libc`) ve Inline Assembly kavramlarını eksiksiz öğrendik.
Bu final bölümünde ise hiçbir işletim sistemi (Windows, Linux vb.) olmadan doğrudan çıplak donanım (Bare-Metal) üzerinde çalışan, bilgisayarınız güç tuşuna basıldığında çalışan ilk kod olan **512 Baytlık MBR Bootloader (Ön Yükleyici)** yazacağız! 🚀
---
📌 1. Bilgisayar Başlatılma Mimarisi (Boot Process) ⚙️
1. **Power On:** Bilgisayar açıldığında işlemci varsayılan olarak 16-bit **Real Mode** modunda başlar.
2. **BIOS / UEFI:** Anakarttaki BIOS çipi donanımları test eder (POST) ve ilk önyükleme aygıtının (Disk/USB) **0. sektörünü (LBA 0)** okur.
3. **Magic Signature (`0xAA55`):** BIOS, 512 baytlık sektörün son iki baytında `0xAA55` imzasını görürse bunu geçerli bir **MBR Boot Sector** kabul eder.
4. **Execution:** BIOS, bu 512 baytlık kodu RAM'deki **`0x7C00`** adresine yükler ve kontrolü işlemciye (`EIP/IP = 0x7C00`) devreder.
---
🖥️ 2. Real Mode ve `int 0x10` BIOS Video Kesilmeleri 🎬
16-bit Real Mode içerisinde ekran çıktısı almak için işletim sistemi sürücüleri yerine BIOS'un dahili video kesilmesi olan **`int 0x10`** kullanılır.
• **`AH = 0x0E`:** "Teletype Output" fonksiyonu. `AL` yazmacındaki karakteri imlecin olduğu konuma yazar ve imleci bir kaydırır.
mov ah, 0x0E ; BIOS Teletype karakter yazma fonksiyonu
mov al, 'A' ; Ekrana basılacak karakter
int 0x10 ; BIOS Video Kesilmesi
---
💾 3. 512 Baytlık MBR Bootloader Kod Yapısı (`boot.asm`) 💻
Aşağıdaki kod, BIOS tarafından `0x7C00` adresine yüklenecek olan, ekrana özgün mesajımızı basan ve 512 baytlık boyutu tam dolduran bootloader kodudur:
[ORG 0x7C00] ; BIOS kodu bu bellek adresine yükler
BITS 16 ; İşlemciye 16-bit Real Mode komut kümesini kullanmasını bildiriyoruz
start:
; Segment yazmaçlarını güvenli şekilde sıfırlıyoruz
cli ; Kesilmeleri geçici olarak kapat
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00 ; Yığını (Stack) kodun hemen altına konumlandırıyoruz
sti ; Kesilmeleri tekrar aç
; Ekrana Metin Yazdırma Fonksiyonu
mov si, mesaj_metni
yazdir_dongusu:
lodsb ; [DS:SI] adresinden 1 bayt oku -> AL'ye yükle, SI++ yap
cmp al, 0 ; String sonu ('\0' Null Terminator) kontrolü
je sonsuz_dongu ; Metin bittiyse sonsuz döngüye atla
mov ah, 0x0E ; BIOS Teletype video fonksiyonu
int 0x10 ; Karakteri ekrana bas
jmp yazdir_dongusu
sonsuz_dongu:
cli ; İşlemciyi durdurmak için kesilmeleri kapat
hlt ; Halt: Bir sonraki kesilmeye kadar CPU'yu uykuya al
jmp sonsuz_dongu
; --- Veri Bölümü ---
mesaj_metni db 'BASTAN SONA x86 ASSEMBLY BOOTLOADER CALISTI! 🚀', 0x0D, 0x0A, 0
; --- MBR Doldurma ve Boot Imzasi ---
times 510 - ($ - $$) db 0 ; 512 baytın kalan kısmını 0x00 ile doldur
dw 0xAA55 ; MBR Magic Boot Signature (2 Bayt: 511 ve 512. baytlar)
---
⚙️ 4. Derleme ve QEMU Sanal Makinesinde Çalıştırma 🛠️
Yazdığımız bare-metal kodumuzu NASM ile ikili (raw binary) formata dönüştürüp QEMU ile çalıştıralım:
1. Binary Olarak Derleme:
nasm -f bin boot.asm -o boot.bin
2. Dosya Boyutunu Kontrol Etme (Tam 512 Bayt Olmalıdır!):
ls -l boot.bin
3. QEMU Sanal Makinesinde Çıplak Donanımda Çalıştırma:
qemu-system-x86_64 -drive format=raw,file=boot.bin
---
📊 5. x86 Assembly Eğitim Serisi Genel Kazanım Tablosu 📋
| Bölüm Aralığı | Temel Kazanımlar |
| :--- | :--- |
| **Bölüm 1 - 3** | CPU Mimarisi, Genel Yazmaçlar (`EAX`, `EBX`, `ECX`, `EDX`), `int 0x80`, `MOV`, `XCHG`, Aritmetik (`ADD`, `SUB`), `EFLAGS`, `AND/OR/XOR`, `CMP`, Koşullu Dallanma (`Jcc`) |
| **Bölüm 4 - 5** | Yığın (`ESP`, `EBP`), `PUSH`/`POP`, `CALL`/`RET`, **Stack Frame**, Dizi İndeksleri (`ESI`, `EDI`), `DF`, `MOVSB`, `STOSB`, `REP` Önekleri |
| **Bölüm 6 - 7** | C Kütüphane Entegrasyonu (`libc`, `cdecl`), Inline Assembly, **Real Mode**, BIOS `int 0x10`, **Bare-Metal MBR Bootloader Yazımı**, QEMU Emülasyonu |
---
🎉 TEBRİKLER! x86 ASSEMBLY SERİSİNİ BAŞARIYLA TAMAMLADINIZ! 🎉
7 Bölümlük Baştan Sona x86 Assembly rehber serisini eksiksiz bir şekilde bitirdiniz! 🥳
Artık işletim sistemlerinin arkasındaki büyüyü çözen, donanım seviyesinde RAM ve CPU yazmaçlarını yöneten, bare-metal bootloader yazabilen ve tersine mühendislik / sistem programlama için kaya gibi sağlam bir temele sahip bir geliştiricisin! 💻✨
İşlemciniz soğuk, yazmaçlarınız senkron, kodlarınız hatasız çalışsın! Başarılar! 🚀
🔒 Bu içeriği görmek için giriş yapın