回 帖 发 新 帖 刷新版面

主题:bios中断服务读写U盘

写了个在裸机下运行的程序,安装到了U盘的引导区,开机时选择U盘启动,程序能够被正常装载并运行。但是局限于引导区的512字节,因为这个扇区是bios自动加载的。
    我想让程序运行时能够加载U盘里的其他文件,但是在这种环境下(没有运行任何操作系统)不知道怎么读写U盘。我觉得是不是要靠bios的中断服务程序,但是不知道是哪个,上网查了半天也没什么结果,感觉做这个事的人很少。希望懂的人来指导一下。
    以前见有过U盘操作系统的,就是安装在U盘里的操作系统(应该很多人都知道吧)
    我的问题:裸机状态下(只运行了引导区程序)怎么读写U盘(int 13H? 还是端口操作?)

回复列表 (共6个回复)

沙发

我找这个问题的答案也找了好久
帮顶

板凳

貌似没有读写的中断

3 楼

扩展INT13似乎有读移动媒体的.你可以试试看.

4 楼

总算是有些进步了,自己解决了
用扩展int13h
至于什么是扩展int13h,自己搜搜就知道了
不过网上的关于int13h的介绍大部分都有同一个错,就是ds:di应该改成ds:si
我把在freedos下用nasm写的测试代码贴这,大家看看(在freedos下用debug调试通过的,在windows xp下cmd窗口的debug调试失败,未在裸机下测试,等有时间再做)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 100h
mov ax,cs
mov ds,ax

;填充DAP
mov byte[PacketSize],10h
mov byte[Reserved],0
mov word[BlockCount],1
mov word[BufferAddrOff],buf
mov word[BufferAddrSeg],ds
mov dword[BlockNum],0
mov dword[BlockNum+4],0        ;这里8个字节分两次填充0

;调用int13h
mov ah,42h   ;42h表示读
mov dl,81h   ;80表示第一块硬盘,81表示第二块,这里我是U盘
mov si,DAP
int 13h
mov bx,ax

mov ax,4c00h
int 21h

DAP:
PacketSize    db    10h
Reserved    db    0
BlockCount    dw    0
BufferAddrOff    dw    0
BufferAddrSeg    dw    0
BlockNum    dd    0
        dd    0       ;BlockNum占8个字节

buf times 1024    db    0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
不过要是写boot.asm的话,为了节省bootsector空间,直接把DAP块赋值了,就不用再mov填充了
这个代码也是参考别人的写的

5 楼


lz,您好
我最近刚研究这个,看了您的文章,大致知道怎么访问u盘了,但是有点问题就是,以前我都是在bochs下调试,但bochs还不支持boot from usb,不知道您说的freedos + gdb的调试环境怎么搭建,调试底层的osloader,请lz指点啊~~

6 楼


[em9][em9][em9]





选择千锋 选择卓越 千锋3G 手机软件开发培训第一品牌

[url=http://www.mobiletrain.org/]iOS培训[/url] [url=http://www.mobiletrain.org/]北京iOS培训[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册