我想在我的os boot.Mbr中编写我自己的 MBR 在不同文件Bootloader中的不同文件 我想用int 13h在内存中加载mbr但它只加载bootloader.i认为这是因为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 感谢。
答案 0 :(得分:0)
您的代码中存在几个问题:
在您的第一个代码示例中:
1.1。您应该找到除了0x7c00
之外的其他输出的代码。例如,使用0x8000
代替。
1.2。您设置了0x12
模式,这很好,但为什么要尝试输出文字A
?模式0x12
用于像素写入,BIOS不会将字符写入VGA存储器 - 或者它会,但VGA需要不同的数据,因此它会有一些不可读的输出。
1.3。您应该停止代码执行,否则您将获得invalid opcode
/ lock prefix not allowed
例外。
在您的第二个代码示例中,第一部分:
2.1。您想在HDD上阅读track0,sector1
。这很好,但track0,sector1
是引导加载程序所在的位置。
2.2。在mov bx, 0x7c00
行 - 你为什么要加载0x7c00
上的所有内容?
2.3。中断3
的函数0x13
写入扇区,为什么要写?
2.4。在检查AH
之前,您应该实际检查进位标志。
2.5。再次,你为什么要跳过bootloader(0x7c00
)的开始?
第二个代码示例,第二部分
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