2

最近、Assembly で OS を作成しようとしていますが、いくつかの問題が発生しています。VirtualBox で OS を実行できますが、フロッピー ドライブからメディアを実行しようとすると、フロッピー ドライブからメディアを削除するように指示されます。複数のパソコンで試しましたが、どれも同じです。他に何を試すべきかわかりません。役立つ場合に備えて、ソースコードを以下に示します。よろしくお願いします、ジェイク・ザカリア・ニクソン。

BITS 16

jmp short start             ;jump to start of os, past disk description
nop                         ;pad out before description

OEMLabel        db "FIRSTBOOT"  ; Disk label
BytesPerSector      dw 512      ; Bytes per sector
SectorsPerCluster   db 1        ; Sectors per cluster
ReservedForBoot     dw 1        ; Reserved sectors for boot record
NumberOfFats        db 2        ; Number of copies of the FAT
RootDirEntries      dw 224      ; Number of entries in root dir
LogicalSectors      dw 2880     ; Number of logical sectors
MediumByte      db 0F0h         ; Medium descriptor byte
SectorsPerFat       dw 9        ; Sectors per FAT
SectorsPerTrack     dw 18       ; Sectors per track (36/cylinder)
Sides           dw 2            ; Number of sides/heads
HiddenSectors       dd 0        ; Number of hidden sectors
LargeSectors        dd 0        ; Number of LBA sectors
DriveNo         dw 0            ; Drive No: 0
Signature       db 41           ; Drive signature: 41 for floppy
VolumeID        dd 00000000h    ; Volume ID: any number
VolumeLabel     db "FIRSTOS    "; Volume Label: any 11 chars
FileSystem      db "FAT12   "   ; File system type: don't change!

start:
    mov ax, 07C0h               ;4k stack space after bootloader
    add ax, 288                 ;4096 + 512 devided by 16 bytes per        paragraph
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h               ;set data segment to where we are loaded
    mov ds, ax

    mov si, text_string         ;put string position in SI
    call print_string           ;calls print string routine

    jmp $                       ;Jumps here to make infinate loop


    text_string db 'This is my awesome OS called FirstOS! I am currently building it from the ground up!', 0

print_string:                   ;routine to outpu string in SI to screen
    mov ah, 0Eh                 ;int 10h 'print char' function

.repeat:
    lodsb                       ;get char from string
    cmp al, 0                   
    je .done                    ;if char = 0 then jump to .done
    int 10h                     ;else print char
    jmp .repeat                 ;then repeat process

.done:
    ret                         ;return to other code


    times 510-($-$$) db 0       ;pad remainder of boot sector with 0s
    dw 0AA55h                   ;The standard pc boot signature

再度、感謝します :)

4

2 に答える 2

1

問題が何であるかを正確に判断するのは困難ですが、ここで試すことができる 2 つのことを示します。

  1. お使いのコンピュータは、フロッピー ドライブから起動するように設定されていますか? BIOS 設定でこれを確認します (起動プロセスの早い段階で特殊キーを押して入力します)。
  2. ディスクは起動可能ですか? これは、フロッピーで起動可能な OS を作成する手順が記載された OSDev チュートリアルです。一番下に、フロッピーの作成方法が記載されています: http://wiki.osdev.org/Babystep1
于 2013-08-14T16:52:38.700 に答える