أخيرا كود الأقلاع هاهو جربوة أن ألحقت معه الـ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
*/
أنتظروا قريبا الكثير
لقد أرفقت الكود و برنامج الترجمة و لكن تواخوا الحذر لان برنامج النسخ هذا من الممكن أن يضيع كل البيانات من على القرص الصلب أذا قمتم يتغيير القيم لأنه يقوم بمسح القديم و نسخ الجديد لذا أكرر تواخوا الحذر فى تعديل البرنامج
أخوكم أحمد عصام
ملف مرفق(ملفات)
ahmed_essam_os_with_nasm.zip (0بايتات )