主题:bios中断服务读写U盘
lgm_boy
[专家分:70] 发布于 2009-12-02 20:04:00
写了个在裸机下运行的程序,安装到了U盘的引导区,开机时选择U盘启动,程序能够被正常装载并运行。但是局限于引导区的512字节,因为这个扇区是bios自动加载的。
我想让程序运行时能够加载U盘里的其他文件,但是在这种环境下(没有运行任何操作系统)不知道怎么读写U盘。我觉得是不是要靠bios的中断服务程序,但是不知道是哪个,上网查了半天也没什么结果,感觉做这个事的人很少。希望懂的人来指导一下。
以前见有过U盘操作系统的,就是安装在U盘里的操作系统(应该很多人都知道吧)
我的问题:裸机状态下(只运行了引导区程序)怎么读写U盘(int 13H? 还是端口操作?)
回复列表 (共6个回复)
沙发
huahaowo [专家分:40] 发布于 2009-12-04 16:02:00
我找这个问题的答案也找了好久
帮顶
板凳
huahaowo [专家分:40] 发布于 2009-12-04 16:06:00
貌似没有读写的中断
3 楼
我是大喊三 [专家分:3010] 发布于 2009-12-26 23:57:00
扩展INT13似乎有读移动媒体的.你可以试试看.
4 楼
lgm_boy [专家分:70] 发布于 2010-06-04 07:49:00
总算是有些进步了,自己解决了
用扩展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 楼
DreamXDream [专家分:0] 发布于 2012-09-11 09:48:00
lz,您好
我最近刚研究这个,看了您的文章,大致知道怎么访问u盘了,但是有点问题就是,以前我都是在bochs下调试,但bochs还不支持boot from usb,不知道您说的freedos + gdb的调试环境怎么搭建,调试底层的osloader,请lz指点啊~~
6 楼
tl1116 [专家分:10] 发布于 2012-11-29 15:41:00
[em9][em9][em9]
选择千锋 选择卓越 千锋3G 手机软件开发培训第一品牌
[url=http://www.mobiletrain.org/]iOS培训[/url] [url=http://www.mobiletrain.org/]北京iOS培训[/url]
我来回复