0

自分の OS に独自のMBRを書きたいboot.Mbr in diffrent file Bootloader indiffrent file 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を書きたいのですが、ブートロードを書いていました

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 で compaling を行っていたので、iso miso.exe と copy.exe を用意しました。ありがとうございます。

4

1 に答える 1

0

コードにはいくつかの問題があります。

  1. 最初のコード サンプルでは:

    1.1。出力が期待されるコードは、 on 以外の場所に配置する必要があります0x7c00。たとえば、0x8000代わりに使用します。

    1.2. あなたはモードを設定0x12しました、それは良いですが、なぜテキストを出力しようとしていますAか? モード0x12はピクセルの書き込みに使用されます。BIOS は文字を VGA メモリに書き込みません。または書き込みますが、VGA は異なるデータを想定しているため、読み取り不能な出力が含まれます。

    1.3。コードの実行を停止する必要があります。そうしないと、 invalid opcode/lock prefix not allowed例外が発生します。

  2. 2 番目のコード サンプルの最初の部分:

    2.1. track0,sector1HDDで読みたい。それは良いことですがtrack0,sector1、ブートローダーが配置されている場所です。

    2.2. オンラインmov bx, 0x7c00- なぜすべてをロードしているの0x7c00ですか?

    2.3. 3割り込みの関数0x13はセクターを書き込みますが、なぜ書き込みを行っているのですか?

    2.4. チェックする前に、キャリーフラグが設定されている場合は実際にチェックする必要がありますAH

    2.5。繰り返しますが、なぜブートローダ ( 0x7c00) の先頭にジャンプしているのですか?

  3. 2 番目のコード サンプル、2 番目の部分

    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 に答える