0

我想在我的操作系统上编写自己的MBR boot.Mbr 在不同的文件中 Bootloader 在不同的文件中我想用 int 13h 将 mbr 加载到内存中,但它只加载 bootloader。我认为这是因为 org 示例代码:

;----------------------------
;AFC OS Bootloader
;see afcosblog.blogspot.com
;-----------------------------
bits 16
org 0x7c00

start:
mov ah,00
mov al,12h;640x480 16 color
int 10h
;----------------
mov ah,0x0E
mov al,'A';print 'A'
int 10h
;------------------
;

我想在那里写 Mbr 但它正在写 Bootload

xor ax, ax
mov es, ax    
mov cx, 1    
mov dx, 0080h ;0th Hdd
mov bx, 7c00h ;I think problem was in there
mov ax, 0301h 
int 13h
;Read
xor ax, ax
mov es, ax    
mov cx, 1    
mov dx, 0080h ;0th Hdd
mov bx, 7c00h 
mov ax, 0201h 
int 13h
cmp ah,00 ;AH:Status
jne error
jmp 0h:7c00h
error:
mov ah,0x0E
mov al,'E'
int 10h
mov ah,10h
int 16h
int 19h
ret
times 510-($-$$) db 0
dw 0xAA55
;---------------------------
;MBR.asm
;AFC OS MBR
;see afcosblog.blogspot.com
;This sample is 16 bit  arch:x86
bits 16
org 0x7c00 ;<----
start:
push ax
mov ax,0a00h
mov es,ax
pop ax
mov ah,0x0E
mov al,'O'
int 10h
mov ah,10h
int 16h ;Keystroke
int 19h ;Reboot
times 510-($-$$) db 0
dw 0xAA55
;End of MBR

我在 Windows nasm 中进行编译,我准备了 iso miso.exe 和 copy.exe 谢谢。

4

1 回答 1

0

您的代码中有几个问题:

  1. 在您的第一个代码示例中:

    1.1。您应该找到您希望在除 on 之外的其他地方有一些输出的代码0x7c00。改用例如0x8000

    1.2. 您设置了 mode 0x12,这很好,但是您为什么要尝试输出文本A?模式0x12用于像素写入,BIOS 不会将字符写入 VGA 内存 - 或者会,但 VGA 需要不同的数据,因此会有一些不可读的输出。

    1.3. 你应该停止代码执行,否则你会得到invalid opcode/lock prefix not allowed异常。

  2. 在您的第二个代码示例中,第一部分:

    2.1。你想track0,sector1在硬盘上阅读。这很好,但这track0,sector1是引导加载程序所在的地方。

    2.2. 在线mov bx, 0x7c00- 为什么要加载所有内容0x7c00

    2.3. 3中断函数0x13写扇区,你为什么写?

    2.4. 如果设置了进位标志,您实际上应该在检查AH.

    2.5. 再说一次,你为什么要在引导加载程序(0x7c00)的开始处跳?

  3. 第二个代码示例,第二部分

    3.1。s code is actually pushing value to small stack set up by BIOS. You don't retrieve value of将来在引导加载程序AX中推送某些内容会later, so be careful if you want to调用此代码。3.2. 最后,我不明白你的重启。你为什么这样做?

这里我有工作示例:

;---------------
;BOOTLOADER
; - loads second sector from disk and executes it
;---------------
start:
    xor ax, ax
    mov es, ax
    mov bx, 0x8000  ;loading to 0x8000
    mov cx, 2       ;reading second sector, track 0
    mov al, 1       ;just one sector
    mov ah, 02      ;function 02: read sectors from disk (CHS)
    mov dx, 0x80    ;1st HDD, head 0
    int 0x13

    jmp 0x800:0
times 510-$ db 0
dw 0xAA55

;---------------
;SECOND STAGE
; - prints some characters
; - stops execution
;---------------
stage2:
    mov ah, 0x0E    ;function 14: teletype output
    mov al, 'A'     ;printing 'A' (0x41)
    mov bl, 0x0F    ;white text on black background
    mov bh, 0x0     ;page 0
    int 0x10        ;print!

    jmp $            ;stop execution

times 1024-$ db 0   ;align
于 2013-07-17T17:46:45.983 回答