43137


かの有名なos自作本なのですが、同じようにつくるのはつまらないと思い、usbからブートさせようと思ってます  
IPLは以下の通りです。その他は全部一緒です。lba方式でやったのですが、qemuで確認しようとした所、画面が一瞬瞬くだけで、osの本体が起動しません。下記のiplのどの部分に問題があるのでしょうか？また、本当に指定した位置にコピーされたかはどのように確認すればいいでしょうか？

[code]

      ORG 0x7c00
            ;; BPB Structure                                                                                                                     
    JMP     entry           ;BS_jmpBoot                                                                                                  
    BS_OEMName      DB "HARIBOTE"
    BPB_BytsPerSec  DW 0x0200
    BPB_SecPerClus  DB 0x01
    BPB_RsvdSecCnt  DW 0x0020
    BPB_NumFATs     DB 0x02
    BPB_RootEntCnt  DW 0x0000
    BPB_TotSec16    DW 0x0000
    BPB_Media       DB 0xf8
    BPB_FATSz16     DW 0x0000
    BPB_SecPerTrk   DW 0x0001
    BPB_NumHeads    DW 0x0001
    BPB_HiDDSec     DD 0x00000000
    BPB_TotSec32    DD 0x00ee5000
    BPB_FATSz32     DD 0x00000020
    BPB_ExtFlags    DW 0x0000
    BPB_FSVer       DW 0x0000
    BPB_RootClus    DD 0x00000002
    BPB_FSInfo      DW 0x0001
    BPB_BkBootSec   DW 0x0006
            times   12      DB 0    ;BPB_Reserverd                                                                                               
    BS_DrvNum       DB 0x80
    BS_Reserved1    DB 0x00
    BS_BootSig      DB 0x29
    BS_VolID        DD 0xa0a615c
    BS_VolLab       DB "ISHIHA BOOT"
    BS_FileSysType  DB "FAT32   "
    
    
    
    entry:  
    
            MOV AX, 0 
            MOV DS, AX   
            MOV ES, AX
            MOV BX, AX
        MOV SP, 0x7c00
    prepare:
            STI     ; BIOSがSTIし忘れていても大丈夫なために
                MOV     [drv],DL ; 起動ドライブ番号がDLに入っている(BIOSがDLに入れてからMBRを起動するので)
                CMP     DL,0x80
                JB      error    ; HDD系デバイスでなければエラー
                MOV     AH,0x41
                MOV     BX,0x55aa
                INT     0x13
                JC      error
                CMP     BX,0xaa55
                JNE     error
                TEST    CL,0x01
                JZ      error
    readloop:
            MOV  CL, 0
    retry:
            MOV DL, 0x80
            MOV AH, 0x42
            MOV SI, packet 
            INT 0x13
            JNC next
            ADD CL, 1
            MOV DL, 0x80 
            MOV AH, 0x00
            INT 0x13
            CMP CL, 6
            JAE error
            JMP retry
    next:
    
    
            MOV AX,[bufferoff]  
            MOV BX,bufferoff  
            ADD AX,0x0200  
            MOV [BX],AX
    
            MOV AX,[blockNum]  
            MOV BX,blockNum  
            ADD AX,1  
            MOV [BX],AX
    
            CMP AX, 361
            JB readloop
    
            JMP 0xc200
    error:
            MOV     SI,msg
    putloop:
            MOV     AL,[SI]
            ADD     SI,1            
            CMP     AL,0
            JE      fin
            MOV     AH,0x0e         
            MOV     BX,15       
            INT     0x10           
            JMP     putloop
    
    
    fin:
            HLT                     
            JMP     fin            
    msg:
            DB      0x0a, 0x0a      
            DB      "load error"
            DB      0x0a            
            DB      0
    
    
    drv:        DB     0x80
    packet:  
    packet_size:    DB 0x10          
    reserved:       DB 0  
    count:          DW 1     
    bufferoff:      DW 0x0820      
    bufferseg:      DW 0   
    blockNum:       DD 1         
                    DD 0  
    RESB    0x01fe-($-$$)       
    DB      0x55, 0xaa
    
[/code]


CC BY-SA 3.0
2018-04-08T06:54:18.453
43057
2018-04-10T13:00:20.750
2018-04-09T09:53:40.890
19110
24226
question
assembly usb operating-system
『30日でできるOS自作入門』をUSBからブートさせたい


手元で実験していないので的外れな回答かもしれませんが，

bufferoff: DW 0x0820

で 0x8200 を指定していないのが気になりました．  
<http://oswiki.osask.jp/?(AT)BIOS> によれば，ここに指定するのはオフセットなので，  
セグメントセレクタのように勝手に 16 倍される，というようなことはないはずです．

最後に  
JMP 0xc200  
を実行していることからも，本当にやりたいのは  
bufferoff: DW 0x8200  
なのではないでしょうか．

※qemu monitor という機能を使うとメモリの中身をダンプすることができますので，  
ディスクを読み終わった時点で永久ループさせておいてメモリダンプしてみると，  
読み込んでほしい位置にちゃんと読み込まれているか，チェックできますよ．


CC BY-SA 3.0
2018-04-10T13:00:20.750
43137
2018-04-10T13:00:20.750
28106
43057
answer