برای مشاهده مفیدترین ارسال در این موضوع اینجا کلیک کنید

نمایش نتایج: از شماره 1 تا 2 از مجموع 2
  1. #1
    بنیانگذار
    تاریخ عضویت
    2010 January
    محل سکونت
    زیر سایه خدا
    سن
    33
    ارسال ها
    1,307
    تشکر
    2,923
    تشکر شده 2,205 بار در 886 پست
    نوشته های وبلاگ
    37


    3 امتياز مثبت از 3 راي
    آيا اين پست براي شما سودمند بود؟ بله | خیر

    توضیحات مقدماتی بوت لودر دوم تدریس شده در کلاس استاد رحیم پور

    در مقاله زیر من بخش دوم بوت لودر رو خط به خط توضیح دادم . برای دنلود توضیحات به انتخاب مقاله برید .
    بسم الله الرحمن الرحیم 
    امروز ما میخوایم بخش دوم بوت لودر رو با هم مرور کنیم و ببنیم بوت لودر ما چه کاری رو انجام میده . قبل از اینکه به برنامه بپردازیم . نکته مهمی رو میخوام یکبار دیگه گوشزد کنم . و اون اینه . بوت لودر برنامه ای هست که کرنل رو در حافظه بارگزاری میکنه . ما تا حالا برنامه هایی که نوشتیم اصلا با فایل کار نمیکرد! یا بهتر بگیم اصلا چیزی رو لود نمیکرد. تنها کاری که ما انجام دادیم این بود که برنامه ای نوشتیم که خودشو به عنوان یک برنامه قابل بوت به بایوس سیستم میشناسوند و بایوس اون رو توی حافظه بار میکرد . این اولین قدمی بود که باید برمیداشتیم و این کار رو هم کردیم . در قدم بعدی پارو کمی فراتر گذاشتیم و سعی کردیم تا در بوت لودرمون کاراکتری رو نمایش بدیم و سپس سعی کردیم تا متنی رو روی صفحه نمایشمون نمایش بدیم . و خوب با موفقیت این کار ها رو به انجام رسوندیم . کاری که امروز سنگ بناشو با هم میزاریم اصلی ترین وظیفه یک بوت لودر هست و اون هم چیزی نیست جز لود کردن کرنل .
    پس با ما همراه باشید .
    ;کد زیر کدی بود که قسمت قبل با اون آشنا شدیم و این بخش میخواهیم این کد رو کاملترش کنیم .
    code segment
    assume cs:code

    Start:
    jmp begin

    msg db "In the name of GOD",0


    Print:
    lodsb
    OR Al,Al
    Jz exit
    Mov Ah,00e
    Mov Bh,00h
    Mov Bl,07
    int 10h
    jmp print
    exit:
    ret

    begin:
    CLI
    Mov Ax,07c0h
    mov DS,AX
    mov ES,AX

    mov AX,0
    mov ss,ax
    mov sp,0ffffh
    STI

    mov si,offset msg
    CALL Print
    JMP $
    Times db (510 - ($ - offset Start)) dup(0)
    DW 0AA55h

    code ends
    end


    در کدی که استاد در فایل بوت لودر هاش وارد کرد سه تابع دیگه هم وجود داشت که من الا ن قبل از هر چیز دیگه ای میخوام اونها رو توضیح بدم و بعد به کد بالامون اضافه کنم و بعدش بریم سراغ بقیه مطالب .
    اولین تابعی که ما باهاش برخورد میکنیم تو کد استاد تابعی هست با نا م
    Delay
    همونطور که از اسم این تابع پیداست این تابع برای ایجاد یک تاخیر ایجاد شده . تاخیر هم برای چاپ رشته روی صحفه بوده
    (مثلا استاد خواسته لودینگ رو با این تاخیر پیاده سازی کنه که مثلا یه چیزی داره لود میشه . عین وقتی که ویندوز میخواهید نصب کنید .)
    خوب حالا اجازه بدید ببنیم این کد چه کاریی داره انجام میده .
    قبلش اجازه بدید ببینیم خودمون هم میتونیم یه تابعی بنویسیم که باعث ایجاد تاخیر بشه ؟
    جواب بله هست . ما تاخیر رو میتونیم با روش های مختلفی ایجاد کنیم . اما ساده ترین کاری که میتونیم بکنیم تا یه تاخیری رو ایجاد کنیم استفاده از حلقه هاست . یعنی اینکه بریم یه حلقه بسازیم که به اندازه یه عدد خاصی هی تکرار بشه . این تکرار کردن زمان بر هست دیگه درسته ؟ خوب پس این شد یه راه . اجازه بدید همین روش رو دنبال کنیم و یه تابع برای تاخیر بسازیم .
    برای اینکه تاخیر بیشتری رو باعث بشیم بجای یه حلقه از دو حلقه استفاده میکنیم . اجازه بدید با هم این کارو انجام بدیم .
    push cx
    push dx
    mov cx,0ffffh

    halghe1: mov dx,0fffeh
    halghe2: dec dx
    jnz halghe2
    dec cx
    jnz halghe1

    pop dx
    pop cx

    خوب این هم از حلقه تو در توی ما . خوب این به چه معناست و چیکار داره می
    کنه ؟
    تو خط اول و دوم ما اومدیم مقادیر دو ثباتی که دارید میبنید رو پوش کردیم . لابد میپرسید چرا ؟ ببنید ما تعداد ثباتهامون محدوده و این ثباتها عمومی هستند در نتیجه همیشه یه مقداری توشون هست که ممکنه برای یک تابع یا وقفه حکم حیاتی داشته باشه و اگه
    ما بیاییم تو تابعمون یا تو کدمون مقدار اینها رو تغییر بدیم بعد از اینکه کارمون با اینها تموم شد این تغییر دادن مقدار اینها باعث میشه که توابع دیگه ای که با این مقدار کار داشتن نتونن کارشونو بدرستی انجام بدن . پس اینو به عنوان یک اصل همیشه در نظر داشته باشید که هروقت وارد یک تابعی میشید که توش قراره مقادیر ثباتهایی رو دست بزنید قبلش مقادیر فعلی اون ثباها رو یه جای امن ذخیره کنید . جای امن ما استک هست که همیشه هم در دسترسمونه .
    خیلی خوب پس ما مقدار های فعلی ثباتهای س ایکس و د ایکس رو ذخیره کردیم که بعد از اینکه کارمون با اونها تموم شد این مقدارها رو دوباره توشون قرار بدیم . خیلی خوب . بعدش چی ؟
    کاری که ما کردیم اینه . ما کد زیر رو به زبان اسمبلی نوشتیم .
    cx = 10;
    while ( cx != 0 )
    {
    DX = 8
    WHILE ( DX != 0)
    {
    DX--;
    }
    CX--
    }
    یعنی وقتی ما نوشتیم
    CX = 10
    میشه
    MOV CX ,10
    و
    WHILE (CX != 0 )
    {
    DX = 8 ;1.MOV DX , 8
    WHILE ( DX ! = 0)
    {
    DX -- ;2. DEC DX
    } ;3.JNZ WHILE

    CX-- ;4. DEC CX
    } ;5.JNZ WHILE

    پس دیدید که ما کار خاصی نکردیم همین کد رو تبدیلش میکنیم به یک تابع ناخییر .
    گنگ که نیست هست ؟
    من میتونستم تابع زیر رو اینجوری هم بنویسم
    CX = 10
    DX = 10
    WHILE ( CX != 0)
    {
    WHILE(DX != 0)
    {
    DX = DX - 1;
    }
    CX = CX - 1;
    }
    کدش به زبان اسمبلی میشه این
    push cx
    push dx
    mov cx , 10
    mov dx , 10

    while_bironi :
    while_daroni: dec dx
    jnz while_daroni
    dec cx
    jnz while_bironi
    pop dx
    pop cx
    الان دیگه کاملا مشخص شد دیگه درسته ؟
    خیلی خوب حالا اجازه بدید بریم سراغ توابع دیگه .
    تابع بعدی هست PrintNoDelay
    عین گاو پیشونی سفیده این! این یعنی اینکه یک متن رو بدون تاخیر چاپ کنیم ! که میشه همون تابع اولی که خودمون نوشتیم (بالا هست تابع پرینت )
    تابع بعدی هست PrintDelay
    این همین تابع قبلی خودمون هست با این فرق که وقتی داره هر کاراکتر رو چاپ میکنه یکم مکث میکنه و بعد کاراکتر بعدی رو چاپ میکنه ! این مکث کردن رو هم بوسیله همین تابعی که تازه ساختیم انجام میده . کدش اینجوری میشه
    PrintDelay:
    push ax ;برای حفظ مقداری که تو ثبات ا ایکس وجود داره .

    chacaterbadi: lodsb
    OR AL,AL
    JZ exit
    Mov ah, 00eh
    mov bh,00h
    mov bl, 007h
    int 10h
    CALL Delay
    jmp PrintDelay
    exit:
    pop ax
    ret
    یعنی قبل از اینکه بپریم بریم کاراکتر بعدی رو بخونیمو نماییشش بدیم یکمی صبر کنیم و بعد اینکارو انجام بدیم .
    فقط یه خط دیگه اضافه شده که توضیحشو تازه دادم . اونم پوش آ ایکس هست . برای محکم کاری اینو قرار دادیم . .
    تابع بعدی تابع
    PrintNumber هست
    این تابع همون کار
    Integer to Ascii
    یا تابع معروف
    Itoa
    رو شبیه سازی میکنه! آقا بزبون ساده یعنی اینکه ما هر وقت یه سری عدد داشتیم خواستیم نمایشش بدیم از این تابع برای تبدیل اون عدد به رشته استفاده میکنیم . همین .
    حالا ببینیم این تابع چجوری کارشو انجام میده .
    قبلش بزارید ببینیم وقتی خودمون میخوایم یه عدد رو به رشته تبدیل کنیم چه کارهایی باید انجام بدیم .
    اولین قدم اینه که اون عدد تیکه تیکه بشه! یعنی اینکه هر رقمش رو بگیریم جدا جدا تبدیل به معادل رشته ایش کنیم .
    برای اینکه معادل رشته ای یک رقم رو بدست بیاریم خیلی راحت اون رو با 48 جمع میکنیم .
    برای اینکه یک عدد رو هعم رقم هاش رو جدا کنیم . اون عدد رو هی تقسیم بر 10 میکنیم .
    خوب همین . اطلاعاتمون کافیه پس بیایید با کمک هم تابعشو بنویسیم .
    قبل از اینکه تابع رو بنویسیم گفته بودیم که باید مقادیر ثباتهایی که ممکنه تو این تابع ما مقدارشون عوض بشه رو یه جای امنی ذخیره کنیم . پس تعلل نکنید سریع این کارو انجام بدید .
    push ax
    push bx
    push cx
    push dx
    خیلی خوب . حالا قدم اول ما اینه که یک عدد رو بکشونیم به قطعات کوچیکتر و رقمهاشو در بیاریم .
    برای جدا کردن ارقام یک عدد هم اون عدد رو تقسیم بر 10 میکردیم . خوب بزارید این کارو با هم بکنیم .
    فرض میکنیم که عدد ما هم توی ثبات د ایکس ذخیره شده باشه . پس
    mov bx.10

    ITOA: div bx
    or ax,0
    jnz Itoa
    خیلی خوب این کامل شد یعنی ؟ پس واسه استاد چرا انقدر طولانی و زیاد شد ؟
    ذکر چند مطلب اینجا ضررویه .
    قبل از اینکه شروع به تقسیم کردن تو زبان اسمبلی بکنیم . باید چند نکته رو در باره این کار بدونیم .
    اینجا ما قصد داریم یک کلمه مضاعف رو بر یک کلمه تقسیم کنیم !! این یعنی چی یعنی اینکه ما فرض کردیم عدد ما بزرگه !
    خوب وقتی که عدد ما بزرگ باشه توی
    dx:ax
    ذخیره میشه .
    به شکل زیر نگاه کنید
    قبل از تقسیم

    DX AX
    -------------------------------------------------------
    | کلمه کم ارزش مقسوم | کلمه با ارزش مقسوم |
    -------------------------------------------------------
    و بعد از تقسیم

    DX AX
    -------------------------------------------------------
    | خارج قسمت | باقیمانده
    -------------------------------------------------------
    بطور خلاصه وقتی که تقسیم انجام میشه . خارج قسمت تقسیم تو آایکس قرار میگیره و باقیمانده تقسیم تو ثبات د ایکس قرار میگیره.
    حتما میدونید دیگه ما دنبال باقیمانده هستیم که نمایشش بدیم .
    خارج قسمت هم رقمهای بعدی عدد رو در خودش داره . که باید تقسیم بر 10 بشن و جدا بشن .
    عدد ما خیلی خیلی بزرگم نیست برای همین ما ابتدای کار دایکس رو مساوری صفر قرار میدیم . اینجوری هنوز عدد ما در آایکس قرار خواهد داشت و وقتی که عمل تقسیم رو انجام میدیم مقدار د ایکس رو که میشه باقیمانده ما یه جایی ذخیره میکنیم و چک میکنیم که خارج قسمت ما (یعنی آایکس ما ) صفر شده یا نه . (متوجه شدید دیگه نه ؟ ما برای اینکه کارخودمونو راحترت کنیم هر بار ابتدای حلقه مقدار د ایکس رو صفر میکنیم . این کار به دو علت ضرری نداره . یک اینکه بار اولی که عدد ما میره برای تقسیم بر ده شدن . د ایکس ما علامت عدد رو د رخودش داره و عدد واقعای تو ا ایکس قرار داره . در نتیجه به عدد ما ضرری نمیرسه . از طرفی وقتی حلقه برای بار دوم اجرا میشه د ایکس حاوی مقدار باقی مانده از مرحله قبلیه که ما اینو تو همون مرحله قبل ذخیرش کردیم پس بازم اگه صفر بشه اشکالی پیش نمیاد . ) و اگه نه بپر به ابتدای حلقه ! ابتدای حلقه هم که ما د ایکس رو صفر میکنیم
    و مقدار آ ایکس رو تقسیم بر 10 میکنیم . و الی اخر .
    کدش میشه این
    push ax
    push bx
    push cx
    push dx
    mov bx,10
    mov cx,0 //baraye shomareshe teadede argham azash estefade mikonim

    itoa:
    mov dx,0
    div bx
    mov dh,0 //bit alamate ! niazi behesh nadarim!
    push dx //zakhire mikonim to estak
    inc cx // be tedade argham joda shode yeki ezafe mikonim
    or ax,0//check mikonim ke khareje ghesmat 0 shod ya na , khareje ghesmate ma bad az har taghsim to ax hast, az or estefade mikonim be do dalil , 1 meghdare ax taghir nemikone , 2 flagha faal mishan .
    jnz itoa // age na bepar va raghame badio joda kon .
    //hala ke hame raghama joda shodan . vahgte one ke onjha ro be moadele asciishon tabdil konim va onaro namayesh bedim
    //ma arghamo koja zakhire kardim ? to stack , kheyly khob pas ina bayad poshte sare ham to stack bashan dige dorost?
    khob
    pas mishe ;
    print :
    pop ax
    //niaz nist ke dobare begam , adade ma to al gharar dare va ah faghat bit alamate !
    add al,48 //tabdile konimesh be moadele asciish
    mov ah,0eh // aadademon gereftim , pas be ah niazi nadarim , hala function print ro seda mikonim , mov ah,0e,mov bh,00 int 13 print ro anjam mide pas
    mov bh,00
    int 10h
    loop print // ta vaghty cx sefr nashod az stack yeki yeki raghamhamono pop kon to ax , .vaghty cx sefr beshe yanee ma hame ragham hamono ke to stack gozashte bodim bardashtim .

    //hala bazgardanie maghadire avalie sabatha ghabl az ejraye functionemon . va bad ret
    pop dx
    pop cx
    pop bx
    pop ax
    ret

    toziahte ezafe, khastid bekhonid nakhastid beparid .
    حالا توضیح کد :
    از س ایکس استفاده کردیم تا تعداد ارقام اعداد بیاد . که موقع چاپ کردن ارقام مشکلی نداشته باشیم .
    دایکس رو صفر کردیم چرا که عدد اصلی ما در آایکس قرار داره .
    ( و هر بار بعد از تقسیم هم د آ ایکس خارج قسمت قرار میگیره که باید باز تقسیم بر 10 بشه تا وقتی که بشه صفر و عیچ عددی باقی نمونه . و دایکس هم میشه باقیمانده در نتیجه مشکلی در پاک کردن مقدار دایکس در ابتدای حلقه وجود نداره.
    بعد از تقسیم . محتوای دی اچ رو هم صفر قرار دادیم به همون دلیلی که دایکس رو برابر صفر قرار دادیم .
    و بعد محتوای باقیمانده بدست اومده که الان تو دی ایکس هست رو تو استک ذخیره کردیم .
    سپس یه شماره به کانترمون که اینجا سی ایکس هست اضافه کردیم و بعدش چک کردیم که آیا خارج قسمت صفر شد یا نه اگه صفر شد که خارج شو و برو برای چاپ کاراکترها
    و اگر صفر نشد بپر به ابتدای حلقه و باز این عدد رو تقسیم بر 10 کن .
    در بخش چاپ ما ارقامی که بدست اوردیم رو در استک ذخیره کردیم . حالا سوال اینجاست ما از کجا بدونیم چند رقم رو در استک ذخیره کردیم که به همون تتعداد از استک پاپ کنیم .!
    اینجا سی ایکس بدادمون میرسه .
    ما تا وقتی که سی ایکس به صفر نرسه مقدار بالای استک رو پاپ میکنیم . این مقدار رقمی هست که قبلا اونجا قرار گرفته
    وقتی که سی ایکس صفر بشه این به این معناست که به اندازه کافی از استک ما مقادیر رو پاپ کردیم و همه رقم هامونو دریافت کردیم .
    بعد از اینکه یک رقم از استک پاپ شد ( و در ثبات آایکس قرار گرفت)ما مقداری که د ثبات آ ال هست رو با 48 جمع میکنیم تا معادل کاراکتریش بدست بیاد .
    بعد اون رقم رو چاپ میکنیم با استفاده از وقفه شماره 10 بایوس که قبلا بارها ازش استفاده کردیم .
    نکته ای که باید یک بار دیگه من گوشزد کنم اینه . اگه یه عدد رو در ثباتی مثل آ ایکس ذخیره بکنید به این شکل ذخیره میشه
    ah = 00 al = 40
    بخش اول ثبات آ ایکس بیت با ارزش عدد رو در خودش داره . این که عدد مثبته یا منفیه! ما فرض میکنیم با عدد مثبت طرف هستیم
    بنابراین مقدار ا اچ برامون مهم نیست . و همونطور که میبنیدی عدد اصلی در ا ال ذخیره شده .
    این نکته در مورد تقسیم بالا هم صدق میکنه
    dx:ax
    دایکس بیت با ارزش رو در خودش داره بیت کم ارزش
    .پس این هم ا زاین تابع .

    میرسیم به بخش اخر :
    بخش ;-------------- Load Process
    در این بخش ما قصد داریم که مثلا کرنل رو لود کنیم
    حالا کجای حافظه لودش کنیم ؟
    mov BX, 0800H
    mov ES, BX
    mov BX, 0H
    با این دستور مشخص کردیم که کرنل ما تو ادرس 800 هگز قرار بگیره و از اونجا اجرا بشه .
    هشتصد هگز ادرس سگمنت ما هست و افستش هم 0
    یعنی
    0800h:0000
    در این بخش ما سعی میکنیم که یک اطلاعاتی رو بخونیم . برای اینکار از وقفه 13 بایوس و تابع شماره صفر اون استفاده میکنیم .

    شماره تابع رو طبق معمول در ثبات آاچ قرار میدیم و اون درایوی رو که میخواییم ریستش کنیم در داخل ثبات آال قرار میدیم
    ااین ریست کردن باعث میشه که کنترلر فلاپی دیسک (اگه فلاپی دیسک رو ریست کرده باشیم)سریعا بره سراغ سکتور صفر اون.
    اگه عملیات بخوبی انجام بشه . فلگ کری 0 خواهد بود و اگه ایراد یا مشکلی بوجود بیاد حین عملیات فلگ کری یک خواهد ب.ود.
    خب حالا چرا این وقفه انقدر برامون مهمه اصلا چرا ما باید فلاپی درایو رو ریست کنیم .!
    این وقفه برای این برامون مهمه که ما نمیدونیم کنترلر فلاپی داریو در حال حاضر داره کدوم سکتور رو میخونه شما هر وقت که ریست کنید میتونید مطمعن باشید که
    کنترلر بر روی سکتور صفر قرار گرفته .
    داشت یادم میرفت. برای مشخص کردن اینکه کدوم درایو رو ریست کنیم . شماره اون رو در ثبات دی ال قرار میدیم . اگه صفر بزاریم یعنی اینکه فلاپی درایور رو میخواییم ریست کنیم

    برای خوندن از روی سکتور صفر هم ما باز از وقفه شماره 13 تابع شماره 2 اون استفاده میکنیم .
    برای اینکه بتونیم بطور موفقیت امیزی عملیات خوندن رو انجام بدیم به یک سری اطلاعات نیاز داریم
    اون اصلاعات اینا هستن
    تعداد سکتور هایی که میخواییم خونده بشن
    شماره ترک یا شیار شماره سکتور و شماره هد
    و شماره درایو
    AH = 0x02 شماره تابع برای خوندن
    AL = تعداد سکتورهایی که میخواییم بخونیم .
    CH = هشت بیت پایینی یک سیلندر (یا استوانه)ی
    CL = شماره سکتور -بیت های 0 تا 5 ... --بیت های 6 و 7 منحصرا به هارددیسکها تعلق دارند.
    نکته : توجه کنید که این سی ال سکتوری هست که خوندن ما از اون آغاز میشه .! حواستون باشه که تو هر ترک یا شیار
    18تا سکتور بیشتر وجود نداره یعنی 0 تا 17! این خیلی مهمه . شما اگه اشتباهی عدد 18 رو بعنوان سکتور شروع انتخاب کنید! یا کلا بخوایید این رو بخونید
    چون این سکتور وجود نداره سی پی یو هم لطف میکنه و یه اررور اساسی بهتون میدهو فاتحه .
    (در اصل این اتفاق می افته که کنترلر فلاپی میره که این سکتور 18 رو بخونه بعد پیداش نمیکنه یه اکسپشن تولید می کنه وچون چیزی نیست که
    به این جواب بده سی پی یو ور میداره یه اکسپشن یا استثنا خطای دوم میده که بعدشم میشه خطای سوم و هارد ریست!!
    این خطای دوم و سوم یعنی چیز خیلی بد :دی یعنی همون فاتحه .

    DH = شماره هد
    همونطور که میدونید بعضی ازفلاپی دیسکها دوتا هد دارن! یعنی دو طرف دارن ! . طرف جلو و طرف عقب !
    اگه با سکتور صفر سرو کار داریم شماره هد صفر خواهد بود .

    DL = شماره درایو -بیت 7 برای هارد دیسک هست
    این هم شماره فلاپی درایو هست . صفر یعنی فلاپی درایو ! 1 هم فلاپی درایو هست اما از نوع قدیمیش! 2 و بیشتر رو نمیدونم چی هستن!
    نیازی هم نیست بدونم چین! چون ما با فلاپی دیسک سرو کار داریم .

    خوب حالا که میخواییم این داده ها رو بخونیم کجا قرارشون بدیم ؟
    این وقفه یه یه بافر نیاز داره تا داده هایی که میخونه توش قرار بده . حدس بزنید چیه ؟
    ES:BX
    دقیقا برای همین بود که ما اون بالا سگمنتی رو به این کار اختصاص دادیم . یک بار دیگه اونو توضیح میدم
    mov bx,800h
    یعنی مقدار 800 ایکس رو در ب ایکس قرار بده .
    mov ES,bx
    چون ما مستقیما نمیتونستیم سگمنت ای اس رو مقدار دهی بکنیم اول اومدیم مقدارشو ریختیم تو یه ثبات مثل ب ایکس و بعد از ب ایکس منتقل کردیم به
    ES
    و آفست شروعش رو هم صفر قرار دادیم
    mov bx,0
    اینطوری رابطه زیر درست میشه
    ES:BX ==>> 800h:0000
    اماده امادست برای دریافت اطلاعات .
    بعد از اینکه ما وقفه رو فراخونی کردیم . باید ببینیم نتیجه کار چی شد
    اصلا خوندن با موفقیت همراه بود یا نه ؟ چند سکتور خونده شد ؟ و از این دست اطلاعات
    این اطلاعات در ثبات های زیر قرار میگیرن بعد از فراخونی وقفه
    AH = وضعیت
    AL = تعداد سکتوره هایی که خونده شد
    CF = فلگ کری که نشانگر موفقیت یا عدم موفقیت عملیات هست. اگه عملیات خوندن با موفقیت انجام شده باشه این باید صفر باشه و اگه با شکست مواجه شده باشه این فلگ باید یک باشه .

    من یه توضیحی در رابطه با اون ثبات س اچ بدم که هشت بیت پایین سیلندر یعنی چی .
    میدونید که یک سیلندر یا استوانه مجموعه ای از چند شیاره .
    زیر هم هست که شعاشون از مرکز دیسک به یک اندازه هست .
    خوب حالا اگه دیسک ما تنها یک سطح داشته باشه تکلیف چیه ؟ تکلیف این میشه که استوانه ما میشه همون شیار ما .!
    پس س اچ میشه شماره شیار یا ترکی که باید خونده بشه .
    (هر شیار یا ترک هم به سکتور هایی با 512 بایت تقسیم میشه . )
    خیلی خوب حالا که یادگرفتیم چه باید بکنیم بایید با هم فلاپی دیسک رو ریست کنیم و یک سکتور از اون رو بخونیم .

    reset:
    mov ah,0h //میخواییم ریست کنیم
    mov al,0 //فلاپیو میخوایی ریست کنیم
    int 13h //ریست کن
    jc reset //اگه مشکلی پیش اومد نشد دوباره سعی کن .

    //بافر اختصاص بدیم .
    //برای خوندن
    mov bx,800h
    mov es.bx
    mov bx,0
    //و حالا بخونیم .
    read:
    mov ah,02h //میخواییم بخونیم
    mov cl,1 //az sector yek mikhaeem bekhonim , masalan kernel ma to sector 1 hat ( bootloader to sector 0 , kernel to sector 1)
    mov ch,1 // این شماره ترک یا شیار هست . ما تازه فقط یه سکتور بیشتر نخوندیم . بالا گفته بودیم که تو هر شیار 18 تا سکتور جا میشه . پس هنوز تو شیار صفر یم
    mov al,1//تعداد سکتور که میخوایی بخونیم
    mov dl.0 //از فلاپی بخون .
    int 13h
    jc read //اگه مشکلی پیش اومد دوباره سعی کن بخونی .

    حالا که همه چی بسلامتی خوب پیش رفت میتونید یه پیام چاپ کنید و بعد بپریم بریم جایی که این کدها رو تازه کپی کردیم
    یعنی بریم کرنلمون رو اجرا کنیم .
    )
    mov bx,800h
    push bx
    mov bx,0
    push bx
    retf

    با دستور بالا مقدار سی اس آیپی رو ست میکنیم .
    در آخر هم
    hang: jmp hang
    times db (510 - ($-offset start)) dup(0)
    dw aa55h
    code ends
    end
    والسلام .
    (اینم کد استاده مربوط بههمین بخش دیگه فهمش اصلا سخت نباید باشه چون همینو همین تازه بالا نوشتیم با هم .



    Read:
    mov ah, 0 ; reset disk function
    ;mov dl, 80H ; drive Number
    Int 13H

    mov AH, 02H ; Bios Read Sector Service
    mov AL, 1 ; Count of Sector for Read
    mov CH, 0 ; Number of trak
    mov CL, 1;2 ; Number of Sector
    mov DH, 0 ; Number of Head
    ;Mov DL, 80H ;Disk ID
    Int 13H ; Bios Intterupt
    mov si, offset OSRdMessage
    call PrintDelay
    JC Read

    mov si, offset Dot ; our message to print
    call PrintDelay ; call our print function

    mov BX, 0800H
    Push BX
    mov BX, 0H
    Push BX
    Retf


    ;seyyed hossein Hasan pour
    ;Master.huricane@gmail.com
    ;www.forum.ustmb.ir


    بخش دوم توضیحات بوت لودر استاد (توضیحات بوت لودر دوم )

    موضوعات مشابه:
    فایل های پیوست شده
    • نوع فایل: asm bootldr2.asm (27.9 کیلو بایت,  این فایل 3 بار دانلود شده است)
    ویرایش توسط Hossein : 15th July 2014 در ساعت 12:23 AM
    توکل بخدا
    http://DeepLearning.ir
    اولین و تنها مرجع یادگیری عمیق ایران


    هرکس از ظن خود شد یار من
    از درون من نجست اسرار من




  2. #2
    عضو تازه وارد
    تاریخ عضویت
    1970 January
    ارسال ها
    16
    تشکر
    104
    تشکر شده 50 بار در 25 پست


    آيا اين پست براي شما سودمند بود؟ بله | خیر
    سلام
    خیلی خوب بود
    مرسی


 

 

کاربران برچسب خورده در این موضوع

کلمات کلیدی این موضوع

علاقه مندی ها (Bookmarks)

علاقه مندی ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  


Powered by vBulletin
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.6.0
Persian Language By Ustmb.ir
این انجمن کاملا مستقل بوده و هیچ ارتباطی با دانشگاه علوم و فنون مازندران و مسئولان آن ندارد..این انجمن و تمامی محتوای تولید شده در آن توسط دانشجویان فعلی و فارغ التحصیل ادوار گذشته این دانشگاه برای استفاده دانشجویان جدید این دانشگاه و جامعه دانشگاهی کشور فراهم شده است.لطفا برای اطلاعات بیشتر در رابطه با ماهیت انجمن با مدیریت انجمن ارتباط برقرار کنید
ساعت 12:48 PM بر حسب GMT +4 می باشد.