日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

FreeBSD啟動扇區(qū)代碼分析( 四 )


main.4:
movb (%di),%cl # Partition
addw %cx,%di # description
callw putx # Display it上面檢查看所檢查的分區(qū)類型是否為我們知道的分區(qū)類型,知道的分區(qū)類型有11($TBL1SZ=0xb)個,它們是:“0x1, 0x4, 0x6, 0xb, 0xc, 0xe, 0x83,0x9f, 0xa5, 0xa6, 0xa9,見下面的$tables處 。如果不是以上的類型,則跳轉(zhuǎn)到main.4 。那么,(%di)所指的字串是“??,如果分區(qū)類型是“0x1, 0x4, 0x6, 0xb, 0xc, 0xe, 0x83,0x9f, 0xa5, 0xa6, 0xa9之一,則(%di)所指的字串是“Dos、“Linux、“FreeBSD或“BSD等 。見下面的“os_misc、“os_dos、“os_linux、“os_freebsd、“os_bsd等標(biāo)記 。callw putx調(diào)用putx函數(shù),在屏幕上打?。骸癋xXXX 。其中XXX為DOS、“Linux、“FreeBSD或“BSD等 。main.5:
incw %dx # Next item
addb $0x10,%bl # Next entry
jnc main.3 # Till done遍歷磁盤分區(qū)的舉代號dx加1,重復(fù)下一輪循環(huán)查找 。bl加上0x10(0x10=16)表示尋址到下一個分區(qū)信息(加16字節(jié))入口 。循環(huán)直到255字節(jié)邊界 。#
# Passed a 256 byte boundary..
# table is finished.
# Add one to the drive number and check it is valid,
#
popw %ax # Drive number
subb $0x80-0x1,%al # Does next
cmpb NHRDRV,%al # drive exist? (from BIOS?)
jb main.6 # Yes“popw %ax把上面壓入堆棧的bx(當(dāng)前的啟動扇區(qū))值彈出到ax中 。例如,如果計算機是從軟盤啟動的則dl=0,若是從IDE的C、D盤啟動的則dl分別為 0x80和0x81 。然而,F(xiàn)reeBSD的Boot Manerger不能夠安裝到軟盤上,所以,dl只能為0x80、0x81,0x82...等 。在計算機的BIOS地址0:0x475處存放的是計算機的硬盤的數(shù)目,“subb $0x80-0x1,%al一句等于“sub$0x79,%al,例如,即當(dāng)前驅(qū)動器如果是C盤,則al的值是ox80-0x79=1,然后再與計算機的硬盤的數(shù)目比較,如果當(dāng)前所在硬盤不是最后一個硬盤,則直接跳轉(zhuǎn)到main.6 。如果當(dāng)前所在硬盤是最后一個硬盤,則繼續(xù)執(zhí)行 。# If not then if there is only one drive,
# Don't display drive as an option.
#
decw %ax # Already drive 0?
jz main.7 # Yes如果只有一個硬盤,則直接跳轉(zhuǎn)到main.7,這樣,本計算機只有一個硬盤,所以不用顯示其他磁盤相關(guān)的提示 。# If it was illegal or we cycled through them,
# then go back to drive 0.
#
xorb %al,%al # Drive 0下面的內(nèi)容表示多于一個磁盤的情況 。此時“al清0,與磁盤列舉相關(guān) 。#
# Whatever drive we selected, make it an ascii digit and save it back
# to the "next drive" location in the loaded block in case we
# want to save it for next time.
# This also is part of the printed drive string so add 0x80 to indicate
# end of string.
#
main.6:
addb $'0'|0x80,%al # Save next
movb %al,_NXTDRV(%bp) # drive number
movw $drive,%di # Display
callw putx # item首先,在_NXTDR(%bp)處置入“0字符高位置1的字符,以代表第二個驅(qū)動器,然后在屏幕上顯示“Fx Drive,表示更換另外的磁盤啟動 。注意,在調(diào)用putx之前,di中保存的是下面字串“Drive 的首地址 。dl中存放的是當(dāng)前遍歷的到的可啟動的或者合法的分區(qū)類型遞增序數(shù),al與dl是不同的,al是ASCII碼,dl是“Fx中的x值 。#
# Now that we've printed the drive (if we needed to), display a prompt.
# Get ready for the input byt noting the time.
#
main.7:
movw $prompt,%si # Display
callw putstr # prompt
movb _OPT(%bp),%dl # Display
decw %si # default
callw putkey # key
xorb %ah,%ah # BIOS: Get
int $0x1a # system time
movw %dx,%di # Ticks when
addw _TICKS(%bp),%di# timeout上面的代碼首先在屏幕上打印出字符串“Default: ,缺省啟動的磁盤號放在“_OPT(%bp)中,這里有個小小的技巧,在執(zhí)行“decw %si和“callw putkey兩句后屏幕會顯示“Fx,x是_OPT(%bp)的ASCII 。然后取得當(dāng)前的tickes放到%di中,等待用戶按鍵超時的時間從_TICKS(%bp)中取出,加到當(dāng)前的tickes即是最后超時時間到的tickes 。#

推薦閱讀