2

我最近一直在尝试在 Assembly 中制作操作系统,但是我遇到了一些问题。我可以在 VirtualBox 中运行我的操作系统,但是一旦我尝试从软盘驱动器运行它,它只会告诉我从软盘驱动器中删除媒体。我已经在多台计算机上尝试过,但它们都说相同。我不知道还有什么可以尝试的,我会把我的源代码放在下面,以防它帮助你。在此先感谢杰克撒迦利亚尼克松。

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

2

它正在工作!我发现问题只是我没有正确地将图像写入软盘!不过感谢您的帮助。如果其他人有同样的问题,我发现的最好的软件叫做rawwrite。它非常易于使用且非常快速。再次感谢杰克撒迦利亚尼克松。

于 2013-08-14T17:42:11.240 回答
1

It is hard to tell exactly what the problem is, but here are two things you can try.

  1. Is the computer you are using set to try to boot off of the floppy drive? Verify this in the BIOS settings (entered by pressing a special key early in the boot process).
  2. Is the disk boot-able? Here is an OSDev tutorial that has instructions on creating a floppy boot-able OS; at the very bottom it gives instructions on how to create the floppy: http://wiki.osdev.org/Babystep1
于 2013-08-14T16:52:38.700 回答