- 论坛徽章:
- 0
|
我用虚拟机(bochs)试验了一把光盘启动,虽然成功启动,但当要导入其他文件时,却未能将文件读至指定的地方。具体过程是:
1、系统启动,对第17个扇区(这里由bios完成)
2、在第17个扇区里,我放了boot.bin,里面的内容是提示已进入boot.bin,且将load文件读入0x900:0处
3、这里我取巧了一下,用ultraedit分析了一下光盘的内容,发现load文件在第0x5a扇区处(这样调试变得相对简单)
调试时发现,可以成功打印boot.bin里的信息,但jmp到0x900:0处时,发现里面没有对应的代码。且在执行int 0x13读光盘扇区时,曾报“int13_cdrom: function 42, ELDL out of range ef”错误。
具体代码如下:- org 0x7c00
- jmp short START
- nop
- ;===============================================
- dap: dw 0x10 ; [ 0] Packet size in bytes.
- dw 0x4 ; [ 2] Nr of blocks to transfer.
- dw 0 ; [ 4] Offset
- dw 0x900 ; [ 6] Segment
- dd 0x5a ; [ 8] start sector number in iso.
- dd 0 ; [12] Block number
- ;===============================================
-
- START:
- mov ax, cs
- mov ds, ax
- mov es, ax
- call clr_sc
- call disp_msg
- call read_sect_main
- ;jmp $
- jmp 0x900:0
- disp_msg:
- mov ax, mesg
- mov bp, ax
- mov cx, 13
- mov ax, 0x1301
- mov bx, 0x7
- mov dl, 0
- int 0x10
- ret
- clr_sc:
- mov ax, 0x600
- mov bx, 0x700
- mov cx, 0
- mov dx, 0x184f
- int 0x10
- ret
- read_sect_main:
- mov bx, 0x900 ; Reading to segment 0x900
- mov es, bx
- xor bx, bx ; Offset 0
- call read_sector
- ret
- read_sector:
- mov dl, 0xef
- mov ah, 0x42
- mov si, dap
- int 0x13
- ret
- ;==========================================
- mesg: db "Hello World!"
复制代码 |
|