<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-65  評論-68  文章-4  trackbacks-0

    今天的程序編寫倒不是很長時間,但是DEBUG花了我好長時間,具體前幾次崩潰的原因沒有找出來,但是最終可以運行了。
    截個圖片,然后是匯編程序。



    org 0x100
    [bits 16]
    jmp loaderStart

    _GRAPH_SEG_OFFSET_ equ 0xb800

    _RootEntCnt_ equ 0xe0

    BS_OEMName db 'XXXXXXXX'
    BPB_BytsPerSec dw 0x200
    BPB_SecPerClus db 1
    BPB_RsvdSecCnt dw 1
    BPB_NumFATs db 2
    BPB_RootEntCnt dw _RootEntCnt_
    BPB_totSec16 dw 0xb40
    BPB_Media db 0xf0
    BPB_FATSz16 dw 9
    BPB_SecPerTrk dw 0x12
    BPB_NumHeads dw 2
    BPB_HiddSec dd 0
    BPB_totSec32 dd 0
    BS_DrvNum db 0
    BS_Reserved1 db 0
    BS_BootSig db 0x29
    BS_VolID dd 0
    BS_VolLab db '11111111111'
    BS_FileSysType db 'FAT12?? '

    parameters:
    ?screenPo dd 0
    ?STR_LEN equ 12
    ?bootStr db 'Loading...? '
    ?noLoaderStr db 'No Kernel...'
    ?ready db 'Ready?????? '
    ?KernelBase equ 0x8000
    ?KernelOffset equ 0x0
    ?rootEntryNum db _RootEntCnt_
    ?loaderName db 'KERNEL? BIN'


    loaderStart:
    ?mov ax,cs
    ?mov ds,ax
    ?mov es,ax
    ?mov ss,ax
    ?mov sp,0100
    ?mov ax,_GRAPH_SEG_OFFSET_
    ?mov gs,ax
    ?
    ?mov dh,0
    ?call displayStr
    ?
    ?xor ah,ah
    ?mov dl,[BS_DrvNum]
    ?int 0x13
    ?
    ?mov ax,KernelBase
    ?mov es,ax
    ?mov bx,0
    ?mov ax,19
    ?mov cl,14
    ?call readSector
    ?
    ?
    ?xor edi,edi
    ?
    anotherFile:
    ?xor esi,esi
    ?cmp byte [rootEntryNum],0
    ?je noLoader
    ?
    nextChar:
    ?mov al,byte [es:edi]
    ?cmp byte [ds:loaderName+si],al
    ?jne notThisFile
    ?cmp si,10
    ?je found
    ?inc esi
    ?inc edi
    ?jmp nextChar
    ?
    ?notThisFile:
    ?shr edi,5
    ?inc edi
    ?shl edi,5
    ?dec byte [rootEntryNum]
    ?jmp anotherFile
    ?
    noLoader:
    ?mov dh,1
    ?call displayStr
    ?jmp $
    ?
    found:
    ?mov dh,2
    ?call displayStr
    ?
    ?mov ax,word [es:edi+(0x10)]
    ?mov cl,1
    ?
    ?push ax
    ?mov ax,KernelBase
    ?mov es,ax
    ?mov ebx,KernelOffset
    ?pop ax
    ?
    ?readEntry:
    ?
    ?cmp ax,0xfff
    ?je readEnd
    ?push ax
    ?add ax,19+14-2
    ?call readSector
    ?pop ax
    ?
    ?add ebx,512
    ?call getFATEntry
    ?
    ?jmp readEntry
    ?readEnd:
    ?
    ?jmp toProtectMode

    displayStr:
    ?; dh: String index
    ?push cx
    ?push ax
    ?push bx
    ?push esi
    ?push edi
    ?mov cx,STR_LEN
    ?mov edi,dword [screenPo]
    ?mov esi,bootStr
    ?xor eax,eax
    ?mov al,dh
    ?mov bl,STR_LEN
    ?mul bl
    ?add esi,eax
    ?.1:
    ?lodsb
    ?mov [gs:edi],al
    ?inc edi
    ?inc edi
    ?loop .1
    ?
    ?mov dword [screenPo],edi
    ?pop edi
    ?pop esi
    ?pop bx
    ?pop ax
    ?pop cx
    ?ret

    readSector: ;ax: starting sector cl:number of sectors
    ?; ah 0x2????????? al:number of sector to read
    ?; ?????bx: es:bx
    ?; ch:cylinder???cl:start sector
    ?; dh:head?num???dl:Drive
    ?push bp
    ?mov bp,sp
    ?push cx
    ?push dx
    ?push ax
    ?
    ?mov dl,[BPB_SecPerTrk]
    ?div dl
    ?mov cl,ah
    ?inc cl
    ?
    ?mov ch,al
    ?shr ch,1
    ?
    ?mov dh,al
    ?and dh,1
    ?
    ?mov dl,byte [BS_DrvNum]
    ?
    ?.1:
    ?mov ah,2
    ?mov al,byte [bp-2]
    ?int 0x13
    ?jc .1
    ??
    ?pop ax
    ?pop dx
    ?pop cx
    ?pop bp
    ?ret
    ?
    getFATEntry:
    ?FATBaseInMem equ 0x7000
    ?;ax is the entry number
    ?;return ax is the next entry
    ?
    ?push es
    ?push bx
    ?push dx
    ?push cx
    ?
    ?mov bx,FATBaseInMem
    ?mov es,bx
    ?
    ?mov bx,3
    ?mul bx ;dx:ax
    ?mov bx,2
    ?div bx ;dx is the rest
    ?push dx
    ?
    ?xor dx,dx
    ?mov bx,[BPB_BytsPerSec]
    ?div bx
    ?mov cl,2
    ?xor bx,bx
    ?add ax,1
    ?call readSector
    ?mov bx,dx; mov byte index
    ?
    ?pop dx
    ?xor ax,ax
    ?cmp dx,0
    ?jne oddPart
    ?

    ?mov ax,word [es:bx]
    ?and ax,0x0fff
    ?
    ?jmp after
    ?oddPart:
    ?
    ?mov ax,word [es:bx]
    ?shr ax,4


    ?after:
    ?pop cx
    ?pop dx
    ?pop bx
    ?pop es
    ?
    ?ret
    ?
    ?
    toProtectMode:
    ?jmp start
    ?
    %macro Descriptor 3
    ?dw %2 & 0xffff
    ?dw %1 & 0xffff
    ?db (%1 >> 16) & 0xff
    ?dw ((%2 & 0x0f0000) >> 8) | (%3 & 0xf0ff)
    ?db (%1 >> 24) & 0xff
    %endmacro

    DummyGDT: Descriptor 0,0,0
    CodeGDT: Descriptor 0,0xfffff,1100000010011010b
    DataGDT: Descriptor 0,0xfffff,1000000010010010b
    ScreenGDT: Descriptor 0xb8000,0xffff,0000000010010010b

    GDTPtr dw $-DummyGDT-1
    ?dd 0x9000*0x10+DummyGDT

    CodeSelector equ CodeGDT-DummyGDT
    DataSelector equ DataGDT-DummyGDT
    ScreenSelector equ ScreenGDT-DummyGDT

    start:
    ?call killMotor
    ?cli
    ?mov dh,2
    ?call displayStr
    ?
    ?lgdt [GDTPtr]
    ?
    ?in al,0x92
    ?or al,10b
    ?out 0x92,al
    ?
    ?mov eax,cr0
    ?or eax,1
    ?mov cr0,eax
    ?
    ?jmp dword CodeSelector:(0x9000*0x10+ProtectMode)

    killMotor:
    ?push dx
    ?mov dx,0x3f2
    ?mov al,0
    ?
    ?out dx,al
    ?pop dx
    ?ret


    [bits 32]
    ProtectMode:
    ?mov ax,ScreenSelector
    ?mov gs,ax
    ?xor edi,edi
    ?.again:
    ?inc byte [gs:edi]
    ?jmp .again

    posted on 2007-01-18 16:22 小爽 閱讀(745) 評論(5)  編輯  收藏 所屬分類: 我的經驗我的操作系統

    評論:
    # re: 今天的Loader實驗總算DEBUG完成[未登錄] 2007-03-14 14:41 | Sam
    請教個問題:
    我在Virtual PC 上安裝了DOS7.1。 然后把一個于淵chapter3/a/pmtest1.com放在上面運行。結果出錯。
    我發現是在lgdt那句的問題。 你有什么建議嗎?
    我的MSN:sam_code@hotmail.com  回復  更多評論
      
    # re: 今天的Loader實驗總算DEBUG完成 2007-03-14 15:17 | wilson
    @Sam
    應該是因為DOS版本太高的緣故吧。一般都是用DOS 6.22。安裝一下DOS6.22試一下。
    這僅僅是猜測啊。因為很有可能微軟的DOS7能夠進入使用保護模式了。  回復  更多評論
      
    # re: 今天的Loader實驗總算DEBUG完成 2008-05-16 12:45 | guapibai
    @wilson
    你是不是單步調試了阿,如果是的話可能有問題,還有最好dos5.0進行實驗。  回復  更多評論
      
    # re: 今天的Loader實驗總算DEBUG完成[未登錄] 2008-12-12 10:49 | st
    那是因為在DOS下只能實現實模式,不能跳轉到保護模式
    解決方法:
    將pmtest1.asm編譯成.bin文件放在引導盤上運行.  回復  更多評論
      
    # re: 今天的Loader實驗總算DEBUG完成[未登錄] 2010-08-23 21:54 | YBW
    那段代碼本就沒有返回DOS的語句!!!  回復  更多評論
      
    主站蜘蛛池模板: 亚洲网站免费观看| 亚洲国产一区明星换脸| 亚洲日韩中文字幕天堂不卡| 日韩免费电影网址| 自怕偷自怕亚洲精品| 99xxoo视频在线永久免费观看| 亚洲AV日韩AV鸥美在线观看| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 18禁亚洲深夜福利人口| 日本人护士免费xxxx视频| 国产精品亚洲一区二区三区久久| 日本成人免费在线| 一级午夜免费视频| 久久精品国产亚洲AV麻豆王友容| 免费久久人人爽人人爽av| 亚洲嫩草影院久久精品| 巨波霸乳在线永久免费视频| 亚洲乱码一二三四区乱码| 午夜一区二区免费视频| 一级毛片视频免费| 久久精品国产亚洲AV麻豆~| 中文字幕人成无码免费视频| 欧洲亚洲国产精华液| 2022中文字字幕久亚洲| 一级毛片aaaaaa免费看| 亚洲精品乱码久久久久久V| 亚洲av无码成人精品区| 男女作爱在线播放免费网站| 亚洲一卡2卡3卡4卡乱码 在线| 四虎影在线永久免费观看| 中文字幕免费在线看电影大全| 91在线精品亚洲一区二区| 日本大片在线看黄a∨免费| 久久av免费天堂小草播放| 亚洲免费电影网站| 免费成人av电影| 18pao国产成视频永久免费| 国产精品国产亚洲区艳妇糸列短篇| 国产国拍精品亚洲AV片| 成人免费午夜无码视频| xxxxxx日本处大片免费看|