中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » 我写的加载mbr的程序,asm代码,然后跳转执行
作者:
标题: 我写的加载mbr的程序,asm代码,然后跳转执行 上一主题 | 下一主题
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『楼 主』:  我写的加载mbr的程序,asm代码,然后跳转执行

加载mbr到7c00h,然后跳转过去。

我在dos下运行,但是失败了,有没有高手告诉我为什么啊?

.model tiny

.code

org 100h

start: jmp begin

begin:
        CLI

        xor         ax,ax
        mov         ss,ax
        MOV         SP,7C00h
        MOV     SI,SP
        PUSH    AX
        POP     ES
        PUSH    AX
        POP     DS
        STI
        CLD

        mov         bx,7C00h
        mov         ah,02h
        mov         al,01h
        mov         cx,1
        mov         dl,80h
        mov         dh,0
        int         13h
       
        ;JMP     cs:7c00h
        db         0EAH,0,7CH,0,0
end start



http://beiyu.bokee.com
2006-10-9 06:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 2 楼』:  

首先要明白一点,MBR 是在开机加载硬盘时执行的。当 BIOS 要从硬盘启动时,CPU各寄存器值都是初始化值,MBR 的代码中给 SS、DS、ES 赋值只是为了可靠而己。

真正出问题的地方在于中断向量,包括 DOS 在内的操作系统启动后都会接管 INT13。以 DOS 为例,加载 IO.SYS 后 INT13 的入口地址与加载 MBR 时的 INT13 入口绝对不同,你用 deubg 的 p 命令试一下就知道了。(这点我很早时自己写多系统引导程序时就发现了)。

还有一点,物理地址 0:7C00h 处的内存在你调试程序时有没被其它程序使用?要是其它程序用到这一块会怎么样就天知道了。

其实,只要一条 INT19 就可以重启系统,不过前提在不能和内存管理程序冲突。以 WIN98 启动盘来说,没有 HIMEM 和 EMM386 的话,INT19 就只会直接加载启动设备,不再经过自检那一步了。

2006-10-11 20:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 3 楼』:  

DOS95

我把mbr拷贝到空间0000:9000开始的地方,改掉内存中的相对地址,从这个地方开始运行,这个时候可以正确的引导ntldr,但是问题处在了你说的中断向量,就是int 13h,在一个调用的时候产生了死循环,调用的扩展int 13h是 mov ax,42h,这个时候可能42h的操作出了问题,不知道你有没有办法呢?



http://beiyu.bokee.com
2006-10-12 16:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 4 楼』:  

DOS 编程中有一点是明令禁止的,就是中断不可重入。DOS 操作系统在启动后,会重置 INT13,加入一些自己认为有必要的功能,最后调用原 INT13 的功能来实现。

当 NTLDR 加载后,NTLDR 也会重置 INT13。这时问题就来了,NTLDR 调用的是自己的 INT13 功能,它的基础是 BIOS 的 INT13,但原来 IO.SYS 下的 INT13 入口并没还原成 BIOS 原来的 INT13 入口,这样就会出现 INT13 调用冲突问题,不出问题只能说运气。

对于这种情况,最好的解决方法是自己通过 IO 口建立新的类似 INT13 的功能;不然就得分析出最原始的 INT13 入口,在自己的程序中使用原始入口来实现所要的功能。

2006-10-15 16:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by DOS95 at 2006-10-15 16:10:
DOS 编程中有一点是明令禁止的,就是中断不可重入。DOS 操作系统在启动后,会重置 INT13,加入一些自己认为有必要的功能,最后调用原 INT13 的功能来 ...

找出原始的 INT13 入口?有没有什么方法?



http://beiyu.bokee.com
2006-10-17 07:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DOS95
初级用户





积分 112
发帖 49
注册 2006-9-23
状态 离线
『第 6 楼』:  中断向量表

中断向量表保存在内存 0:0 开始的地方,每一个中断占用 4 字节内存,共 256 个中断,占用从 0:0 到 0:03FF 的所有内存。

debug
-d 0:40
0000:0040  10 10 10 10 11 11 11 11 - 12 12 12 12 13 13 13 13
0000:0050  14 14 14 14 15 15 15 15 - 16

上面的 13 13 13 13 就是指 INT13 的入口地址,在操作系统没启动时就是 BIOS 的原始入口。所以,只要在系统没启动时保存到其它地方就可以了。

以在 MBR 中保存中断中量表为例:(要先把 MBR 做个备份!)

xor bx,bx
mov ds,bx
mov es,bx
mov ss,bx
mov sp,7c00h
mov ax,302h
mov mov cx,3
mov dx,80h
int 13h

这样就可以把原始的中断向量表保存到硬盘开始的第 3、4 两个扇区中。
后面的程序就可以先把保存下来的中断向量表还原,那时的调用就是原始入口了。

debug
-a
mov ax,202
mov bx,200
mov cx,3
mov dx,80
int 13
cli
mov si,bx
xor di,di
mov es,di
mov cx,200
repz movsw
sti

OK!还原了。

2006-10-17 12:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
beiyuly
初级用户





积分 95
发帖 40
注册 2006-10-8
状态 离线
『第 7 楼』:  

通过硬编码,还原了int13中断,系统可以成功的加载,感谢你的信息~



http://beiyu.bokee.com
2006-10-18 07:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pczu
初级用户





积分 104
发帖 2
注册 2003-6-8
状态 离线
『第 8 楼』:  

可以在mbr中加入一短代码以输入口字,不影响任何中断达到加密的目的。
我以前试过

2006-10-19 02:11
查看资料  发送邮件  发短消息 网志  OICQ (24159759)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: