بتـــــاريخ : 2/22/2011 6:10:27 PM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 994 0


    برنامج أقلاع عربي BOOT LOADER + الشفرة المصدرية

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : neo | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    أخيرا كود الأقلاع هاهو جربوة أن ألحقت معه الـ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بايتات )

    كلمات مفتاحية  :

    تعليقات الزوار ()