2013-07-17 37 views
0

我想我自己写的MBR在不同势文件的bootloader我的操作系统boot.Mbr在不同势文件 我想与INT 13H的内存加载MBR但它只bootloader.i认为加载是因为组织 样本代码:编写和保存MBR在NASM

;---------------------------- 
;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,但它是在Windows NASM 我写引导装载

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 

我compaling准备iso miso.exe和copy.exe 谢谢。

+0

你是如何的两段代码结合你已经建立之后呢? – Michael

+0

我在图像上合并它 – user2590769

+0

好吧,你发布了一个不能编译的大块代码。所以我假设他们是两个独立的程序集文件,并且你以某种方式组合输出。你只是用'copy/b'连接它们吗?按何种顺序? – Michael

回答

0

有在你的代码的几个问题:

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

    1.1。您应该找到您希望在0x7c00以外有其他输出的代码。改为使用例如0x8000

    1.2。你设置模式0x12,这很好,但你为什么要输出文字A?模式0x12用于像素写入,BIOS不会写字符到VGA存储器 - 或者它会,但VGA需要不同的数据,所以它会有一些不可读的输出。

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

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

    2.1。您想要在HDD上读取track0,sector1。这很好,但是track0,sector1是bootloader所在的地方。

    2.2。在线mov bx, 0x7c00 - 你为什么要加载一切0x7c00

    2.3。函数3中断0x13写段,你为什么写?

    2.4。在检查AH之前,您应该确实检查进位标志。

    2.5。再说一次,为什么你跳上bootloader的开始(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 
+0

2.3 MBR必须写入 - 0x7c00 Bios加载地址 – user2590769

+0

但是,为什么当它已经在那里'再次'写入'MBR到磁盘**? – user35443

+0

我正在写这篇引导,我必须写。我理解你说的话。有一次,我想读取磁盘,如果mbr在扇区1,但它没有工作 – user2590769