隨筆 - 303  文章 - 883  trackbacks - 0
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網(wǎng)站

          搜索

          •  

          最新評論

          from: http://blog.sina.com.cn/s/blog_5028978101008wjl.html

          該代碼來自linux0.11內(nèi)核代碼/boot/bootsect.s
          該段代碼的作用是使用int 13h 把磁盤上的setup模塊(4個扇區(qū))加載到內(nèi)存中,位置在bootsect.s(0x90000+512字節(jié) = 0x90200處)之后,整個過程主要是操作 ax , bx , cx , dx 等四個通用寄存器。其實現(xiàn)的步驟:
          SETUPLEN = 4          !setup模塊的長度.
          INITSEG 
          = 0x90200     !setup模塊被加載的地址.
           .
           load_setup:
                  mov   dx 
          , #0x0000 !DH = 0磁頭 DL=軟盤驅(qū)動器,
                                     !(00H~7FH:軟盤;80H~0FFH:硬盤;
                                     !ES:BX=緩沖區(qū)的地址).
                  mov   cx , #0x0002 !CH = 0柱面  CL = 第二扇區(qū).
                  mov   bx 
          , #0x0200 !前面代碼可知:es = 0x9000 所
                                     !以、緩沖區(qū)es:bx = 0x9000:0x0200
                                     ! = 0x90200,這就意味著,磁盤中
                                     !的數(shù)據(jù)將從這個地址開始加載入內(nèi)存.
                  mov   ax , #0x0200 + SETUPLEN !ah = 0x02 為讀扇區(qū)的入
                                     !口參數(shù) AL為要讀入的扇區(qū)數(shù)4 ,
                                     !到此參數(shù)設(shè)置完畢.
                  int      0x13         !發(fā)出中斷信號,開始讀取.
                                     !進位標志CF(Carry Flag)=0 表示操作
                                     !成功,AH=00H,AL=傳輸?shù)纳葏^(qū)數(shù),否
                                     !則,AH=狀態(tài)代碼.
                  jnc   ok_load_setup   !故名思意,如果成功就跳到下面
                                        !ok_load_setup處,否則執(zhí)行下面的代碼,
                                        !復(fù)位磁盤再次執(zhí)行這段代碼
                  mov   dx 
          , #0x0000    !再次設(shè)置驅(qū)動器為軟盤驅(qū)動器
                  mov   ax 
          , #0x0000    !入口參數(shù)為 ah=00h 重啟磁盤(軟盤系
                                        !統(tǒng)復(fù)位),這個時候由于前面的操作磁
                                        !盤已經(jīng)轉(zhuǎn)到某個位置,所以必須重新啟動
                                        !磁盤,讓磁頭歸位.
                  int   0x13
                  j     load_setup      !跳轉(zhuǎn)回去繼續(xù)執(zhí)行,如果總是失敗系統(tǒng)
                                        !將總執(zhí)行這段代碼.
          ok_load_setup:
                   .

          參看資料:

          直接磁盤服務(wù)(Direct Disk Service——INT 13H)  

           

          功能00H 
          功能描述:磁盤系統(tǒng)復(fù)位 
          入口參數(shù):AH=00H 
          DL=驅(qū)動器,00H~7FH:軟盤;80H~0FFH:硬盤 
          出口參數(shù):CF=0——操作成功,AH=00H,否則,AH=狀態(tài)代碼,參見功能號01H中的說明 

           功能02H  
          功能描述:讀扇區(qū) 
          入口參數(shù):AH=02H 
          AL=扇區(qū)數(shù) 
          CH=柱面 
          CL=扇區(qū) 
          DH=磁頭 
          DL=驅(qū)動器,00H~7FH:軟盤;80H~0FFH:硬盤 
          ES:BX=緩沖區(qū)的地址 
          出口參數(shù):CF=0——操作成功,AH=00H,AL=傳輸?shù)纳葏^(qū)數(shù),否則,AH=狀態(tài)代碼,參見功能號01H中的說明 


          地震讓大伙知道:居安思危,才是生存之道。
          posted on 2008-02-18 21:07 小尋 閱讀(1260) 評論(0)  編輯  收藏 所屬分類: kernel
          主站蜘蛛池模板: 辽中县| 紫云| 广灵县| 旌德县| 荥经县| 定西市| 临朐县| 西林县| 邵武市| 平邑县| 陆丰市| 阿图什市| 淮北市| 南靖县| 新郑市| 平原县| 余姚市| 鄂托克旗| 凤山县| 夹江县| 大冶市| 襄垣县| 疏附县| 永胜县| 临泉县| 金平| 涟源市| 句容市| 麻江县| 红安县| 木里| 荥阳市| 浦北县| 金塔县| 襄汾县| 洮南市| 宣城市| 焦作市| 眉山市| 宾阳县| 监利县|