以下一代码,运行后移动自身到00f0:7c00,再跳转00f0:loadpart执行
功能是将A:首扇区读到0000:7c00后跳转执行
经测试,在A:软盘首扇区写一段只用int 10显示字符的小代码,本程序测试成功通过
但把A:软盘换成DOS的启动盘,却得不到任何效果。(在DOS命令行下,此代码作为.exe作的测试)未经过exe2bin
请高人看看问题何在
偶打算把它取代引导扇区代码,把真正的引导扇区放到40号扇区去,让电脑启动先执行这代码,然后再读取40号扇区DOS引导程序执行
code segment
assume cs:code,ds:code,es:code
org 7c00h
start: mov ax,code
mov ds,ax
....
.... ;用于调用INT10显示字符串,等用户按键则跳转selfcopy
jmp selfcopy
first_address dd 00f00000h ;这里是两行数据,放着将要跳转的地址
second_address dd 00007c00h
loadpart: mov ax,0h
mov es,ax ;es置0,使es:bx=0000:7c00,载入磁盘扇区至
;此
mov ax,0201h
mov bx,7c00h ;loadpart:这部分代码将被复制到00f0:7c00处
mov cx,1
mov dx,0
int 13h ;功能是调用int 13h载入软盘某扇区到
;0000:7c00处
jc loadpart ;失败乃成功之母,载入成功为止
mov ax,00f0h
mov ds,ax ;修改DS指向00f0h,以便下面JMP指令能找到
;second_address,因为本代码已经移动到
;00f0h:7c00
jmp dword ptr [second_address] ;跳转执行载入的代码,修改前面BIOS中断
;读入自己事先写进软盘的代码(显示字符)
;测试成功
;改成读首扇区,插入DOS启动盘,死机了
;无语
selfcopy: mov ax,00f0h
mov es,ax
mov di,offset start
mov cx,0200h
mov si,7c00h ;设置循环
circle: mov al,[di]
mov es:[si],al ;循环工作部分,用于将自身start:开始的
;512字节
inc di ;复制到00F0:7c00处
inc si
loop circle
mov word ptr [first_address],offset loadpart ;设置跳转地址偏移
jmp dword ptr [first_address] ;跳去(00F0:loadpart的偏移)处执
;行,也即是
;loadpart:,经测试
;此处不成问题
code ends
end start
[此贴子已经被作者于2006-8-6 16:26:16编辑过]