Assembly 当我修改代码时,磁盘映像将不可旋转

Assembly 当我修改代码时,磁盘映像将不可旋转,assembly,x86,virtualbox,bootloader,osdev,Assembly,X86,Virtualbox,Bootloader,Osdev,我正在用汇编语言开发一个操作系统。更改代码时,输出文件不可引导 这是我的代码: BITS 16 start: mov ax, 07C0h ; Set up 4K stack space after this bootloader add ax, 288 ; (4096 + 512) / 16 bytes per paragraph mov ss, ax mov sp, 4096 mov ax, 07C0h ; Set da

我正在用汇编语言开发一个操作系统。更改代码时,输出文件不可引导

这是我的代码:

BITS 16

start:
    mov ax, 07C0h       ; Set up 4K stack space after this bootloader
    add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096
    mov ax, 07C0h       ; Set data segment to where we're loaded
    mov ds, ax
    call cls
    MOV AH, 06h    ; Scroll up function
    XOR AL, AL     ; Clear entire screen
    XOR CX, CX     ; Upper left corner CH=row, CL=column
    MOV DX, 184FH  ; lower right corner DH=row, DL=column 
    MOV BH, 1Eh    ; YellowOnBlue
    INT 10H
    mov si, text_string ; Put string position into SI
    call print_string   ; Call our string-printing routine
push bx ;push registers
push cx
push dx
mov ah,0h
int 16h
       cmp al, '1'
       je reboot
       cmp al, '2'
       je shutdown
       cmp al, '3'
       je about
       cmp al, '4'
       je message
           cmp al, '5'
       je shutdown

       jmp $            ; Jump here - infinite loop!


    text_string db '|Main Menu| |Smile OS V1.2|',13,10,'1) Reboot',13,10,'2) Shutdown',13,10,'3) About',13,10,'4) Message',13,10,'5) System Halt',0
    about_string db '|About|',13,10,'Smile OS is a console based operating system in assembly.',13,10,'Press any key to go back!',0
    message_str db '|Message|',10,13,'Hello, World!',13,10,'Press any key to go back!',0

reboot:
mov ax, 0
int 19h

shutdown:
mov ax, 0x1000
mov ax, ss
mov sp, 0xf000
mov ax, 0x5307
mov bx, 0x0001
mov cx, 0x0003
int 0x15

message:
call cls
mov si, message_str ; Put string position into SI
call print_string   ; Call our string-printing routine
push bx ;push registers
push cx
push dx
mov ah,0h
int 16h     
je start

cls:
  pusha
  mov ah, 0x00
  mov al, 0x03  ; text mode 80x25 16 colours
  int 0x10
  popa
  ret

about:
call cls
mov si, about_string    ; Put string position into SI
call print_string   ; Call our string-printing routine
push bx ;push registers
push cx
push dx
mov ah,0h
int 16h 
je start

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

.repeat:
    lodsb           ; Get character from string
    cmp al, 0
    je .done        ; If char is zero, end of string
    int 10h         ; Otherwise, print it
    jmp .repeat

.done:
    ret     

    times 512-($-$$) db 0   ; Pad remainder of boot sector with 0s
    dw 0xAA55       ; The standard PC boot signature
当我试图恢复更改时,代码中断

我正在使用Oracle VM VirtualBox和最新版本的NASM。 我试着重新启动计算机好几次,都没有改变。 我试图安装一个旧版本的NASM,但什么都没有。 要修复此引导加载程序,我必须做什么?

您需要更改:

times 512-($-$$) db 0
致:

您需要填充510字节,以便引导签名0xaa55是512字节引导扇区的最后2个字节。如果不这样做,映像将不会被视为有效的引导扇区。您前面的问题提到使用命令:

nasm -f bin os.asm -o os.iso
您没有使用此命令生成ISO CD-ROM映像。要在VirtualBox中启动,我建议通过以下方式使用启动扇区创建1.44MB软盘映像:

将文件组装到os.bin

执行此步骤后,请检查文件os.bin是否正好为512字节1。如果您在引导扇区中放置了太多的代码和数据,那么引导签名将位于错误的位置,VirtualBox将拒绝将其标识为可引导设备

创建名为os.img的空白1.44MB软盘映像:

在不截断磁盘映像的情况下,将os.bin复制到os.imgw的开头:

dd if=os.bin of=os.img conv=notrunc
在VirtualBox中,将其设置为从软盘而不是CD-ROM引导,并选择os.img文件作为引导映像。VirtualBox需要大小合适的软盘映像

在我的VirtualBox中,当运行时,您在此问题中显示的代码如下所示:

替代将捕捉重叠部分的时间 如果更换:

times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55               ; The standard PC boot signature
与:

然后,您将收到一个错误通知,您的引导加载程序太大:

nasm:致命:部分。文本和引导信号重叠

这意味着bootsig之前的部分中的代码与引导签名部分重叠。如果发生这种情况,那么您将知道是时候自己读取磁盘扇区了,以便将代码扩展到512字节的引导扇区之外

如果使用ORG 0x7c00,则start=510必须是start=0x7c00+510

如果你依靠《时代》杂志来告诉你有问题,它看起来会像:

os.asm::error:TIMES值-为负


1如果文件os.bin超过512字节,则需要使用BIOS将更多磁盘扇区手动读取到内存中。可以用软盘读取磁盘。

在你的问题中,我看不出从工作到不工作的变化是什么。你似乎只是在展示非工作版本。如果我们有一个从工作到崩溃的差异,那么调试就会容易得多。或者不是,因为Michael已经发现了一个showstopper bug,该bug显然会导致一个无法识别为有效可引导MBR的文件。我的另一个猜测是,你添加了太多的东西,它不能再容纳512字节了。这个程序还能容纳510字节吗?
dd if=/dev/zero of=os.img bs=1024 count=1440
dd if=os.bin of=os.img conv=notrunc
times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
dw 0xAA55               ; The standard PC boot signature
section bootsig start=510
    dw 0xAA55           ; The standard PC boot signature