أخيرا كود الأقلاع هاهو جربوة أن ألحقت معه الـnasm الذى يتجم البرنامج برنامج الأقلاع مصمم بالأسيمبلي
[BITS 16] ; بدء العمل مع البيوس بنظام16 بت[ORG 0] ; أنزياح البيانات = 0jmp start ; القفز لبداية البرنامج [BITS 16] ; بدء العمل مع البيوس بنظام16 بت[ORG 0] ; أنزياح البيانات = 0jmp start ; القفز لبداية البرنامج ; -------------------------------------; البانات المستخدمة فى عملية الأقلاع و بعض الرسائل; ------------------------------------------------------------------------ bootdrv db 0 bootmsg db 'Ahmed Essam system ',39,' -> Boot Sector Example',13,10,0 rebootmsg db 'Ahmed Essam Boot loader Press to reboot',13,10,0 processormsg db 'Ahmed Essam OS Checking for 386+ processor: ',0 need386 db 'Sorry... 386+ required!',13,10,0 found386 db 'Found!',13,10,0 whatever db 'in the name of ALLAH -> good Bluss us Arab',13,10,0;*******************************************; بعض الدوال المستخدمة;******************************************* detect_cpu: mov si, processormsg ; أخبار المستخدم بما نقوم به call message ; أختبار ما أذا كان المعالج 80386 أما لا pushf ; حفظ القيمة الأصلية للأعلام xor ah,ah ; ah = 0 push ax ; نسخ ax فى الأعلام popf ; مع مسخ 15-12بت pushf ; قراْة الأعلام الخارجة من ax pop ax and ah,0f0h ; أختبار البت 12- 15 م أذا وضعت أم لا cmp ah,0f0h je no386 ; فى حالة عدم وجدو المعالج 386 ; أختبار 286 mov ah,0f0h ; وضع البت 12-15 push ax ;نسخ الـ ax فى الأعلام popf pushf ; نسخ العلم فى ax pop ax and ah,0f0h ; أختبار ما أذا كانت البت 12-15 تم مسحها jz no386 ; فى حالة عدم وجدو المعالج 386 popf ; أرجع القيم الأصلية للأعلام mov si, found386 ; نقل محتوى المتغير found386 الى si call message ; أظهار ما يوجد فى si ret ; عدم وجود 386 no386: mov si,need386 ; نقل محتوى المتغير need386 الى si call message ; أظهار ما يوجد فى si jmp reboot ; أعادة التشغيل عند الضغط على أى مفتاح ; الدالة message و التى تظهر أى قيمة موجودة فى si message: ; lodsb ; تحميل الحروف الموجودة فى الـsi or al,al ; أختبار ما أذا كان الحرف 0 موجود jz done mov ah,0eh ; وضع الحروف mov bx,0007 ; int 0x10 ; نداء البيوس و مجموعة الدوال الـ21 jmp message done: ret; أخذ المفتيح getkey: mov ah, 0 ; الأنتظار حتى الضغط int 016h ret; أعاة التحميل reboot: mov si, rebootmsg ; وضع قيمة rebootmsg فى الـsi call message ; عرض ما هو موجود فى الـsi call getkey ; الأنتظار حتى الضغط على أى زر db 0EAh ; أعادة التحميل dw 0000h dw 0FFFFh ; *******************************************; بداية الكود الأساسى; *******************************************start: mov ax,0x7c0 ; البيوس فى العنوان 0:07C00h, يجب وضعها فى الـDS mov ds,ax ; نقل مختويات الـax الى الـdsdata mov [bootdrv], dl; cli ; مسح المقاطع mov ax,0x9000 mov ss,ax mov sp,0xffff sti ; أعادة المقاطع mov si,bootmsg ; عرض رسالة الأقلاع call message call detect_cpu; أختبار المعاج 386.386 ;أستخدام التعليمات الخاصة بالمعالج 286 mov si,whatever call message call getkey call reboot times 510-($-$$) db 0 dw 0xAA55
#include <bios.h> #include <stdio.h> void main() { FILE *in; // حجز متغير مؤشر من النوع file unsigned char buffer[520]; // حجز متغير buffer if((in = fopen("bootsect", "rb"))==NULL) // أختبار ما أذا كان الملف bootsect موجود أم لا و أذا كان موجود يفتحة على الأساس الثنائي { printf("Error loading filen"); // عرض رسالة خطاء فى حالة عدم القدرة على قراءة الملف أو خطأ فى الفتح } fread(&buffer, 512, 1, in); // وضع مختويات الملف فى العنوان الخاص بالمتغير buffer while(biosdisk(3, 0, 0, 0, 1, 1, buffer)); // نسخ محتويات العنوان buffer فى القرص المرن على // المقطع 1// القرص 0// الرأس 0// و على مساحة 512 حرف فقط fclose(in); // أغلاق الملف } /*أرجوا فتح الـhelp الخاص بالسي و معرفة أكثر عن الدوال الأتيةabswriteabsreadbiosdisk_biosdisk */