أخيرا كود الأقلاع هاهو جربوة أن ألحقت معه الـnasm الذى يتجم البرنامج برنامج الأقلاع مصمم بالأسيمبلي
[BITS 16] ; بدء العمل مع البيوس بنظام16 بت [ORG 0] ; أنزياح البيانات = 0 jmp start ; القفز لبداية البرنامج [BITS 16] ; بدء العمل مع البيوس بنظام16 بت [ORG 0] ; أنزياح البيانات = 0 jmp 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 الى الـds data 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 الخاص بالسي و معرفة أكثر عن الدوال الأتية
abswrite
absread
biosdisk
_biosdisk
*/أنتظروا قريبا الكثير
لقد أرفقت الكود و برنامج الترجمة و لكن تواخوا الحذر لان برنامج النسخ هذا من الممكن أن يضيع كل البيانات من على القرص الصلب أذا قمتم يتغيير القيم لأنه يقوم بمسح القديم و نسخ الجديد لذا أكرر تواخوا الحذر فى تعديل البرنامج
أخوكم أحمد عصام
