首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

《自己动手写操作系统》第三章第一个程序的有关问题。bochs加载后出现no bootable device.小弟我在网上查了下,说是因为第一扇区最后2字节

2012-05-15 
《自己动手写操作系统》第三章第一个程序的问题。bochs加载后出现no bootable device.我在网上查了下,说是因

《自己动手写操作系统》第三章第一个程序的问题。bochs加载后出现no bootable device.我在网上查了下,说是因为第一扇区最后2字节
没有以 aa55 结尾。。请问应该怎么做呢。
另外,别人debug找出了这个问题的原因所在,看第一扇区的510、511字节的内容。。
我不懂怎么看。。
$bochs 运行后
我按c。。就直接弹出“no bootable device”了。。怎么看第一扇区的510、511字节的内容呢???

Assembly code
; ==========================================; pmtest1.asm; 编译方法:nasm pmtest1.asm -o pmtest1.bin; ==========================================%include    "pm.inc"    ; 常量, 宏, 以及一些说明org    07c00h    jmp    LABEL_BEGIN[SECTION .gdt]; GDT;                              段基址,       段界限     , 属性LABEL_GDT:       Descriptor       0,                0, 0           ; 空描述符LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW         ; 显存首地址; GDT 结束GdtLen        equ    $ - LABEL_GDT    ; GDT长度GdtPtr        dw    GdtLen - 1    ; GDT界限        dd    0        ; GDT基地址; GDT 选择子SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDTSelectorVideo        equ    LABEL_DESC_VIDEO    - LABEL_GDT; END of [SECTION .gdt][SECTION .s16][BITS    16]LABEL_BEGIN:    mov    ax, cs    mov    ds, ax    mov    es, ax    mov    ss, ax    mov    sp, 0100h    ; 初始化 32 位代码段描述符    xor    eax, eax    mov    ax, cs    shl    eax, 4    add    eax, LABEL_SEG_CODE32    mov    word [LABEL_DESC_CODE32 + 2], ax    shr    eax, 16    mov    byte [LABEL_DESC_CODE32 + 4], al    mov    byte [LABEL_DESC_CODE32 + 7], ah    ; 为加载 GDTR 作准备    xor    eax, eax    mov    ax, ds    shl    eax, 4    add    eax, LABEL_GDT        ; eax <- gdt 基地址    mov    dword [GdtPtr + 2], eax    ; [GdtPtr + 2] <- gdt 基地址    ; 加载 GDTR    lgdt    [GdtPtr]    ; 关中断    cli    ; 打开地址线A20    in    al, 92h    or    al, 00000010b    out    92h, al    ; 准备切换到保护模式    mov    eax, cr0    or    eax, 1    mov    cr0, eax    ; 真正进入保护模式    jmp    dword SelectorCode32:0    ; 执行这一句会把 SelectorCode32 装入 cs,                    ; 并跳转到 Code32Selector:0  处; END of [SECTION .s16][SECTION .s32]; 32 位代码段. 由实模式跳入.[BITS    32]LABEL_SEG_CODE32:    mov    ax, SelectorVideo    mov    gs, ax            ; 视频段选择子(目的)    mov    edi, (80 * 11 + 79) * 2    ; 屏幕第 11 行, 第 79 列。    mov    ah, 0Ch            ; 0000: 黑底    1100: 红字    mov    al, 'P'    mov    [gs:edi], ax    ; 到此停止    jmp    $SegCode32Len    equ    $ - LABEL_SEG_CODE32; END of [SECTION .s32]


[解决办法]
我记得,在最后面要加上下面的语句:
org 510
dword 0xAA55

热点排行